[RESOLU] tableau de string avec PROGMEM

Bonsoir;
Je bute sur un problème dont je n’ai pas trouvé de solution sur le net.
Je test la mise en mémoire flash de mes noms de fichiers audio, qui ne sont par définition, pas amené à être modifié.
J’ai fait le code ci dessous:
Un tableau de string, mis dans la mémoire programme, et je tente de récupérer les octets un à un.
Problème: cela ne me sort qu’un seul et unique point d’intérogation comme caratère (caratère null?)
J’ai du faire une erreur de conception, c’est sur, mais je bute dessus depuis plusieurs jours sans trouver.

Si vous pouvez m’aider, s’il vous plait.
Merci.

// Test d'un tableau de string en mémoire Flash
#include <avr/pgmspace.h>

PROGMEM const char fichiers[8][6] =
{
  "a.wav",  // 0 bonjour 1
  "b.wav",  // 1 bonjour 2
  "c.wav",  // 2 bonjour 3
  "d.wav",  // 3 hello
  "e.wav",  // 4 je suis prete
  "1.wav",  // 5 clignotant droit
  "2.wav"   // 6 clignotant gauche
  "3.wav"   // 7 autre
};

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

char lecture_mem(byte longueur, byte debut) {
  char text[6];
  for ( byte idx = 0 ; idx < 6 ; idx++ ) {
    text[idx] =  pgm_read_byte_near( &(fichiers[debut * longueur][idx]) );
  }
  return text;
}

void loop() {
  byte val = 0;
  if (Serial.available()) {                      //Send commands over serial to play
    switch (Serial.read()) {
      case '2':
        val = 6;
        break;
      case '1':
        val = 5;
        break;
      case 'a':
        val = 0;
        break;
      case 'b':
        val = 1;
        break;
      case 'c':
        val = 2;
        break;
      case 'd':
        val = 3;
        break;
      case 'e':
        val = 4;
        break;
      case '6':
        val = 7;
        break;
    }
    Serial.print("val= ");
    Serial.print(val);
    Serial.print(" - ");
    Serial.println(lecture_mem(6, val));
  }
}

Un petit tour par là cherche le paragraphe "Arrays of strings" et tu comprendras ton erreur.
On ne crée pas un tableau de chaine avec PROGMEM
On crée des chaines puis un tableau qui indexe ces chaines.

Merci à tous!
J'ai fait des recherches, mais j'ai loupé le Arrays of strings.
Mes tests avec Serial.print sont juste un retour sur la console. Le but est de retourner après dans le programme, la chaîne complète.
Je retourne pointer mes chaînes :slight_smile:

Et je poste le code quand ça fonctionne

Bonjour,

Sauf pour la beauté du sport le tableau des noms ne sert à rien.

Tu transmets le nom par la liaison série et ensuite tu te sers de la table pour trouver le nom complet.
Il suffit d'ajouter ".wav" au caractère transmis. Éventuellement tu peux ajouter un test pour savoir si le caractère transmis est correct.
Ce qui donne

void setup() {
 // put your setup code here, to run once:
 Serial.begin(9600);
}

void loop() {
 byte val = 0;
 if (Serial.available()) {                      //Send commands over serial to play
   char c=Serial.read();
   if (strchr("abcde123",c))                 // vérifie que le nom transmis est OK
   {
     char nom[6];
     sprintf(nom,"%c.wav",c);
     Serial.println(nom);
   }
 }
}

Ca marche!
Voila comment j’ai fait (optimisation acceptées)

// Test de tableau de string en mémoire Flash
#include <avr/pgmspace.h>

/* Déclaration des chaines en mémoires */
PROGMEM const char a[] = "a.wav";
PROGMEM const char b[] = "b.wav";
PROGMEM const char c[] = "c.wav";
PROGMEM const char d[] = "d.wav";
PROGMEM const char e[] = "e.wav";
PROGMEM const char un[] = "1.wav";
PROGMEM const char deux[] = "2.wav";
PROGMEM const char trois[] = "3.wav";

/* Pointeurs sur les caines */
const char * const pointeur_fichiers[] PROGMEM  = {
  a,
  b,
  c,
  d,
  e,
  un,
  deux,
  trois
};

char buffer[6];    // Etre sûr que la largeur est suffisante pour la plus grande chaîne à stocker.

void setup() {
  Serial.begin(9600);
}

void loop() {
  byte val = 0;
  if (Serial.available()) {                      //Send commands over serial to play
    switch (Serial.read()) {
      case 'a':
        val = 0;
        break;
      case 'b':
        val = 1;
        break;
      case 'c':
        val = 2;
        break;
      case 'd':
        val = 3;
        break;
      case 'e':
        val = 4;
        break;
      case '1':
        val = 5;
        break;
      case '2':
        val = 6;
        break;
      case '6':
        val = 7;
        break;
    }
    Serial.print("val= ");
    Serial.print(val);
    Serial.print(" - ");

    strcpy_P(buffer, (char*)pgm_read_word(&(pointeur_fichiers[val]))); 

    Serial.println(buffer);
  }

Merci à tous pour votre aide.
Rémi.