Error code when I use strcpy_P

Bonjour, j'essaie de faire fonctionner un code dont le but la lecture d'un poème en morse.

J'ai déjà bien avancé mais ça tourne pas comme je veux.
le code doit pouvoir lire chaque charactère des lignes d'un tableau avant de passer à la ligne suivante et faire de même, jusqu'à la fin du poème et recommencer...

Je passe le problème des caractères spéciaux que je verrai après (cependant si vous avez des conseils je suis preuneur)

Le reste marche presque mais pas comme il faut : le code lis bien la suite de charactère, mais de manière chaotique au changement de string...

Pouvez vous m'aider ? je suis un peu perdu avec strcpy_P(buffer, (char *)pgm_read_word(&(string_table[i])));

Je pense que c'est parce qu'il y a des conflis avec d'autres fonctions mais j'échoue faire fonctionner correctement ce code ...
merci d'avance

Hello, I am trying to get a code to work whose purpose is to read a poem in morse code.

I've already made good progress but it's not going the way I want.
the code must be able to read each character of the lines of a table before going to the next line and doing the same, until the end of the poem and starting again...

I pass the problem of special characters that I will see after (however if you have advice I am interested)

The rest works almost but not as it should: the code reads the character sequence, but in a chaotic way when changing the string...

Can you help me ? I'm a bit lost with strcpy_P(buffer, (char *)pgm_read_word(&(string_table[i])));

I think it's because there are conflicts with other functions but I'm failing to get this code to work properly...
thanks in advance

`sai/*  TRANSMISSION OF A POEM IN MORSE
    this program written by Guilhem Toll
*/

// inclusion bibliothèque PROGMEM
#include <avr/pgmspace.h>

//Mise en mémoire Poème (C'est le premier sonnet écrit par Théophile Gautier...)
const char myStrings_0[] PROGMEM = "SOLITUDE";
const char myStrings_1[] PROGMEM = "   ";
const char myStrings_2[] PROGMEM = "Je bande trop dans ma culotte";
const char myStrings_3[] PROGMEM = "Je sors mon vit qui décalotte";
const char myStrings_4[] PROGMEM = "   Son champignon";
const char myStrings_5[] PROGMEM = "Etre à midi, seul dans ma chambre,";
const char myStrings_6[] PROGMEM = "En tete à tete avec son membre,";
const char myStrings_7[] PROGMEM = "   C’est du guignon !";
const char myStrings_8[] PROGMEM = "   ";

PGM_P const string_table[] PROGMEM = {myStrings_0,
                                      myStrings_1,
                                      myStrings_2, myStrings_3, myStrings_4,
                                      myStrings_5, myStrings_6, myStrings_7,
                                      myStrings_8
                                     };

const int Nombre_de_myStrings = 9;

#define ledPin (13) // sets pin 13 as the pin to which the LED light is attached

const byte time_base = 200;  // sets rythm's time base of morse transmission
const byte dot_time = time_base; // sets a dot time
const int dash_time = 3 * time_base; // sets a dash time
const int inter_char_time = 3 * time_base; // sets a interval chars time
const int space_time = 7 * time_base; // sets a space inter word chars time (space char)
// The other space time are generated by several space char
//const int paragraph_break_time = 35 * time_base;

boolean dot = false;
boolean dash = false;
boolean end_of_char = false ;
boolean inter_letter = false ;
boolean space = false;

unsigned long actualTime = 0 ;
unsigned long lastDotTime = 0;
byte intervalDotTime = time_base;

void setup() {

  pinMode(ledPin, OUTPUT);

  Serial.begin(9600); // sets the serial keyboard to 9600 speed
  while (!Serial);  // wait for serial port to connect. Needed for native USB
  Serial.println("OK");

}

void loop() {
  //actualTime = millis();
  Read_Text ();
}

void Read_Text() {

  for (int i = 0; i < Nombre_de_myStrings /*buffer - 1*/; i++) {

    Serial.println(i);
    char buffer [sizeof(string_table[i])];
    Serial.println(string_table[i]);
    //  delay(20);

    strcpy_P(buffer, (char *)pgm_read_word(&(string_table[i])));  // Necessary casts and dereferencing, just copy.
    //Serial.println(string_table[i]);

    //  int length = string_table.length();

    for (int j = 0; j < sizeof(string_table[i]) ; j++) {
      // Serial.println(string_table[i]);

      Serial.print(buffer[j]);
      Serial.print("      ");

      // Morse code for a space (delay of seven dots)
      if (buffer[j] == ' ') {
        Serial.println ("       ");
        Space();
      }

      // Morse code for a (dot dash)
      if (buffer[j] == 'a' || buffer[j] == 'A' || buffer[j] == 'à'  || buffer[j] == 'â') { // checks if letter a was typed on serial
        Serial.println (". _");
        Dot();
        Dash();
        EndOfChar();
      }

      // Morse code for b (dash dot dot dot)
      if (buffer[j] == 'b' || buffer[j] == 'B') {
        Serial.println ("_ . . .");
        Dash();
        Dot();
        Dot();
        Dot();
        EndOfChar();
      }

      // Morse code for c (dash dot dash dot)
      if (buffer[j] == 'c' || buffer[j] == 'C' || buffer[j] == 'ç') {

        Serial.println ("_ . _ .");
        Dash();
        Dot();
        Dash();
        Dot();
        EndOfChar();
      }

      // Morse code for d (dash dot dot)
      if (buffer[j] == 'd' || buffer[j] == 'D') {

        Serial.println ("_ . .");
        Dash();
        Dot();
        Dot();
        EndOfChar();
      }

      //Morse code for e (dot)
      if (buffer[j] == 'e' || buffer[j] == 'E' || buffer[j] == 'é' || buffer[j] == 'É' || buffer[j] == 'è'  || buffer[j] == 'È' || buffer[j] == 'ê' || buffer[j] == 'Ê') {

        Serial.println (".");
        Dot();
        EndOfChar();
      }

      // Morse code for f (dot dot dash dot)
      if (buffer[j] == 'f' || buffer[j] == 'F') {

        Serial.println (". . _ .");
        Dot();
        Dot();
        Dash();
        Dot();
        EndOfChar();
      }

      // Morse code for g (dash dash dot)
      if (buffer[j] == 'g' || buffer[j] == 'G') {

        Serial.println ("_ _ .");
        Dash();
        Dash();
        Dot();
        EndOfChar();
      }

      // Morse code for h (dot dot dot dot)
      if (buffer[j] == 'h' || buffer[j] == 'H') {

        Serial.println (". . . .");
        Dot();
        Dot();
        Dot();
        Dot();
        EndOfChar();
      }

      // Morse code for i (dot dot)
      if (buffer[j] == 'i' || buffer[j] == 'I' || buffer[j] == 'î' || buffer[j] == 'Î') {

        Serial.println (". .");
        Dot();
        Dot();
        EndOfChar();
      }

      // Morse code for j (dot dash dash dash)
      if (buffer[j] == 'j' || buffer[j] == 'J') {

        Serial.println (". _ _ _");
        Dot();
        Dash();
        Dash();
        Dash();
        EndOfChar();
      }

      // Morse code for k (dash dot dash)
      if (buffer[j] == 'k' || buffer[j] == 'K') {

        Serial.println ("_ . _");
        Dash();
        Dot();
        Dash();
        EndOfChar();
      }

      // Morse code for l (dot dash dot dot)
      if (buffer[j] == 'l' || buffer[j] == 'L') {

        Serial.println (". _ . .");
        Dot();
        Dash();
        Dot();
        Dot();
        EndOfChar();
      }

      // Morse code for m (dash dash)
      if (buffer[j] == 'm' || buffer[j] == 'M') {

        Serial.println ("_ _");
        Dash();
        Dash();
        EndOfChar();
      }

      // Morse code for n (dash dot)
      if (buffer[j] == 'n' || buffer[j] == 'N') {

        Serial.println ("_ .");
        Dash();
        Dot();
        EndOfChar();
      }

      // Morse code for o (dash dash dash)
      if (buffer[j] == 'o' || buffer[j] == 'O' || buffer[j] == 'ô' || buffer[j] == 'Ô') {

        Serial.println ("_ _ _");
        Dash();
        Dash();
        Dash();
        EndOfChar();
      }

      // Morse code for p (dot dash dash dot)
      if (buffer[j] == 'p' || buffer[j] == 'P') {

        Serial.println (". _ _ .");
        Dot();
        Dash();
        Dash();
        Dot();
        EndOfChar();
      }

      // Morse code for q (dash dash dot dash)
      if (buffer[j] == 'q' || buffer[j] == 'Q') {

        Serial.println ("_ _ . _");
        Dash();
        Dash();
        Dot();
        Dash();
        EndOfChar();
      }

      // Morse code for r (dot dash dot)
      if (buffer[j] == 'r' || buffer[j] == 'R') {

        Serial.println (". _ .");
        Dot();
        Dash();
        Dot();
        EndOfChar();
      }

      // Morse code for s (dot dot dot)
      if (buffer[j] == 's' || buffer[j] == 'S') {

        Serial.println (". . .");
        Dot();
        Dot();
        Dot();
        EndOfChar();
      }

      // Morse code for t (dash)
      if (buffer[j] == 't' || buffer[j] == 'T') {

        Serial.println ("_");
        Dash();
        EndOfChar();
      }

      // Morse code for u (dot dot dash)
      if (buffer[j] == 'u' || buffer[j] == 'U' || buffer[j] == 'û' || buffer[j] == 'Û') {

        Serial.println (". . _");
        Dot();
        Dot();
        Dash();
        EndOfChar();
      }

      // Morse code for v (dot dot dot dash)
      if (buffer[j] == 'v' || buffer[j] == 'V') {

        Serial.println (". . . _");
        Dot();
        Dot();
        Dot();
        Dash();
        EndOfChar();
      }

      // Morse code for w (dot dash dash)
      if (buffer[j] == 'w' || buffer[j] == 'W') {

        Serial.println (". _ _");
        Dot();
        Dash();
        Dash();
        EndOfChar();
      }

      // Morse code for x (dash dot dot dash)
      if (buffer[j] == 'x' || buffer[j] == 'X') {

        Serial.println ("_ . . _");
        Dash();
        Dot();
        Dot();
        Dash();
        EndOfChar();
      }

      // Morse code for y (dash dot dash dash)
      if (buffer[j] == 'y' || buffer[j] == 'Y') {

        Serial.println ("_ . _ _");
        Dash();
        Dot();
        Dash();
        Dash();
        EndOfChar();
      }


      // Morse code for z (dash dash dot dot)
      if (buffer[j] == 'z' || buffer[j] == 'Z') {

        Serial.println ("_ _ . .");
        Dash();
        Dash();
        Dot();
        Dot();
        EndOfChar();
      }


      // Morse code for 1 (dot dash dash dash dash)
      if (buffer[j] == '1') {

        Serial.println (". _ _ _ _");
        Dot();
        Dash();
        Dash();
        Dash();
        Dash();
        EndOfChar();
      }

      // Morse code for two (dot dot dash dash dash)
      if (buffer[j] == '2') {

        Serial.println (". . _ _ _");
        Dot();
        Dot();
        Dash();
        Dash();
        Dash();
        EndOfChar();
      }

      // Morse code for 3 (dot dot dot dash dash)
      if (buffer[j] == '3') {

        Serial.println (". . . _ _");
        Dot();
        Dot();
        Dot();
        Dash();
        Dash();
        EndOfChar();
      }

      // Morse code for 4 (dot dot dot dot dash)
      if (buffer[j] == '4') {

        Serial.println (". . . . _");
        Dot();
        Dot();
        Dot();
        Dot();
        Dash();
        EndOfChar();
      }

      // Morse code for 5 (dot dot dot dot dot)
      if (buffer[j] == '5') {

        Serial.println (". . . . .");
        Dot();
        Dot();
        Dot();
        Dot();
        Dot();
        EndOfChar();
      }

      // Morse code for 6 (dash dot dot dot dot)
      if (buffer[j] == '6') {

        Serial.println ("_ . . . .");
        Dash();
        Dot();
        Dot();
        Dot();
        Dot();
        EndOfChar();
      }

      // Morse code for 7 (dash dash dot dot dot)
      if (buffer[j] == '7') {

        Serial.println ("_ _ . . .");
        Dash();
        Dash();
        Dot();
        Dot();
        Dot();
        EndOfChar();
      }

      // Morse code for 8 (dash dash dash dot dot)
      if (buffer[j] == '8') {

        Serial.println ("_ _ _ . .");
        Dash();
        Dash();
        Dash();
        Dot();
        Dot();
        EndOfChar();
      }

      // Morse code for 9 (dash dash dash dash dot)
      if (buffer[j] == '9') {

        Serial.println ("_ _ _ _ .");
        Dash();
        Dash();
        Dash();
        Dash();
        Dot();
        EndOfChar();
      }

      // Morse code for 0 (dash dash dash dash dash)
      if (buffer[j] == '0') {

        Serial.println ("_ _ _ _ _");
        Dash();
        Dash();
        Dash();
        Dash();
        Dash();
        EndOfChar();
      }

      // Morse code for ? (dot dot dash dash dot dot)
      if (buffer[j] == '?') {
        Serial.println (". . _ _ . .");
        Dot();
        Dot();
        Dash();
        Dash();
        Dot();
        Dot();
        EndOfChar();
      }

      // Morse code for ! (dash dot dash dot dash dash)
      if (buffer[j] == '!') {
        Serial.println ("_ . _ . _ _");
        Dash();
        Dot();
        Dash();
        Dot();
        Dash();
        Dash();
        EndOfChar();
      }

      // Morse code for . (dot dash dot dash dot dash)
      if (buffer[j] == '.') {
        Serial.println (". _ . _ . _");
        Dot();
        Dash();
        Dot();
        Dash();
        Dot();
        Dash();
        EndOfChar();
      }

      // Morse code for ; (dash dot dash dot dash dot)
      if (buffer[j] == ';') {
        Serial.println ("_ . _ . _ .");
        Dash();
        Dot();
        Dash();
        Dot();
        Dash();
        Dot();
        EndOfChar();
      }

      // Morse code for : (dash dash dash dot dot dot)
      if (buffer[j] == ':') {
        Serial.println ("_ _ _ . . .");
        Dash();
        Dash();
        Dash();
        Dot();
        Dot();
        Dot();
        EndOfChar();
      }

      // Morse code for , (dash dash dot dot dash dash)
      if (buffer[j] == ',') {
        Serial.println ("_ _ . . _ _");
        Dash();
        Dash();
        Dot();
        Dot();
        Dash();
        Dash();
        EndOfChar();
      }

      // Morse code for / (dash dot dot dash dot)
      if (buffer[j] == '/') {
        Serial.println ("_ . . _ .");
        Dash();
        Dot();
        Dot();
        Dash();
        Dot();
        EndOfChar();
      }

      // Morse code for + (dot dash dot dash dot)
      if (buffer[j] == '+') {
        Serial.println (". _ . _ .");
        Dot();
        Dash();
        Dot();
        Dash();
        Dot();
        EndOfChar();
      }

      // Morse code for - (dash dot dot dot dot dash)
      if (buffer[j] == '-') {
        Serial.println ("_ . . . . _");
        Dash();
        Dot();
        Dot();
        Dot();
        Dot();
        Dash();
        EndOfChar();
      }

      // Morse code for = (dash dot dot dot dash)
      if (buffer[j] == '=') {
        Serial.println ("_ . . . _");
        Dash();
        Dot();
        Dot();
        Dot();
        Dash();
        EndOfChar();
      }

      // Morse code for ( (dash dot dash dash dot)
      if (buffer[j] == '(') {
        Serial.println ("_ . _ _ .");
        Dash();
        Dot();
        Dash();
        Dash();
        Dot();
        EndOfChar();
      }

      // Morse code for ) (dash dot dash dash dot dash)
      if (buffer[j] == ')') {
        Serial.println ("_ . _ _ . _");
        Dash();
        Dot();
        Dash();
        Dash();
        Dot();
        Dash();
        EndOfChar();
      }

      // Morse code for _ (dot dot dash dash dot dash)
      if (buffer[j] == '_') {
        Serial.println (". . _ _ . _");
        Dot();
        Dot();
        Dash();
        Dash();
        Dot();
        Dash();
        EndOfChar();
      }

      // Morse code for $ (dot dot dot dash dot dot dash)
      if (buffer[j] == '$') {
        Serial.println (". . . _ . . _");
        Dot();
        Dot();
        Dot();
        Dash();
        Dot();
        Dot();
        Dash();
        EndOfChar();
      }

      // Morse code for @ (dot dash dash dot dash dot)
      if (buffer[j] == '@') {
        Serial.println (". _ _ . _ .");
        Dot();
        Dash();
        Dash();
        Dot();
        Dash();
        Dot();
        EndOfChar();
      }

      // Morse code for & (dot dash dot dot dot)
      if (buffer[j] == '&') {
        Serial.println (". _ . . .");
        Dot();
        Dash();
        Dot();
        Dot();
        Dot();
        EndOfChar();
      }
    }
  }
}
//Serial.println("fin du texte");

void Dot() {
  dot = true;
  if (dot == true) {
    digitalWrite(ledPin, HIGH);
    delay (dot_time);
    digitalWrite(ledPin, LOW);
    delay (dot_time);
    dot = false;

  }
}
void Dash() {
  dash = true ;
  if (dash == true) {
    digitalWrite(ledPin, HIGH);
    delay (dash_time);
    digitalWrite(ledPin, LOW);
    delay (dot_time);
    dash = false;
  }
}
void EndOfChar() {
  end_of_char = true ;
  if (end_of_char == true) {
    digitalWrite(ledPin, LOW);
    delay (inter_char_time - dot_time);
    end_of_char = false ;
  }
}
// Morse code for a space (delay of seven dots)
void Space() {
  space = true;
  if (space == true) {
    digitalWrite(ledPin, LOW);
    delay(space_time - inter_char_time - dot_time);
    space = false;
  }
}

string_table[] est un tableau de pointeurs vers des chaines de caractères en mémoire programme

lorsque tu fais sizeof(string_table[i]) tu récupères la taille d'un élément du tableau, la longueur du pointeur donc et non la longueur de la chaîne pointée.

Pour connaitre la longueur de la chaîne tu pourrais peut-être essayer size_t strlen_P(const char * s);

ce serait plus simple de tout mettre dans un seule chaîne (en flash ou pas) et avoir les passage à la ligne sous forme de '\n'

avoir un tableau qui contient la correspondance entre lettre et morse vous permettrait de réduire fortement la taille du code

vous avez la fonction tolower() qui permet de mettre son paramètre en minuscule ça permet de faire

switch(tolower(buffer[j] )) {
  case '0': ...
  case '1' ...
  ...
  case 'a': ...
  case 'b':  ...
  case 'c': ...
...
}

les caractères qui n'ont pas une version majuscule ou minuscule restent inchangés.

mais il faudra gérer l''UTF8... donc plutôt bâtir un code en uint32_t qui contiendra de 1 à 4 octets pour le switch car les tests du genre

 buffer[j] == 'à'  || buffer[j] == 'â'

ne vont pas fonctionner car ce sont des caractère qui tiennent sur plusieurs octets. Essayez ce bout de code par exemple

char utf8[] = "àâûô"; 

void setup() {
  Serial.begin(115200);
  Serial.print(utf8);
  Serial.print(" : ");
  Serial.print(sizeof utf8 - 1); // -1 pour ne pas compter le '\0' qui est rajouté
  Serial.print(" octets ==> ");

  for (size_t i = 0; i < sizeof utf8 - 1; i++) {
    Serial.print("0x");
    Serial.print((byte) utf8[i], HEX);
    Serial.write(' ');
  }
  Serial.println();
}

void loop() {}

vous verrez que chaque caractère est sur 2 octets à cause du codage en UTF8

un exemple avec la lecture UTF8 et un mini décodage

char message[] = "0aàâçoöôuû12";

uint8_t nbOctetsUTF8(const char *utf8, uint32_t & code) {
  uint8_t attendu = 0;
  if ((*utf8 & 0b1000000) == 0) {                 // 0xxxxxxx
    attendu = 1;
    code = ((uint32_t) (*(utf8)) & 0xFF);
  } else if ((*utf8 & 0b11100000) == 0b11000000) {
    attendu = 2;  // 110xxxxx
    code = ((uint32_t) (*(utf8 + 0)) & 0xFF) << 8;
    code += ((uint32_t) (*(utf8 + 1)) & 0xFF) << 0;
  } else if ((*utf8 & 0b11110000) == 0b11100000) {
    attendu = 3;  // 1110xxxx
    code = ((uint32_t) (*(utf8 + 0)) & 0xFF) << 16;
    code += ((uint32_t) (*(utf8 + 1)) & 0xFF) << 8;
    code += ((uint32_t) (*(utf8 + 2)) & 0xFF) << 0;
  } else if ((*utf8 & 0b11111000) == 0b11110000) {
    attendu = 4;  // 11110xxx
    code = ((uint32_t) (*(utf8 + 0)) & 0xFF) << 24;
    code += ((uint32_t) (*(utf8 + 1)) & 0xFF) << 16;
    code += ((uint32_t) (*(utf8 + 2)) & 0xFF) << 8;
    code += ((uint32_t) (*(utf8 + 3)) & 0xFF) << 0;
  } else {
    attendu = 1;
    code = ((uint32_t) (*(utf8)) & 0xFF);
  }
  return attendu;
}

void setup() {
  Serial.begin(115200);

  Serial.print(message);
  Serial.print(" : ");
  Serial.print(sizeof message - 1); // -1 pour ne pas compter le '\0' qui est rajouté
  Serial.print(" octets ==> ");

  for (size_t i = 0; i < sizeof message - 1; i++) {
    Serial.print("0x");
    Serial.print((byte) message[i], HEX);
    Serial.write(' ');
  }
  Serial.println();


  uint32_t codeUTF8;
  char * ptr = message;
  while (*ptr != '\0') {
    uint8_t n = nbOctetsUTF8(ptr, codeUTF8);
    Serial.print(n);  Serial.print(" octets ==> ");
    Serial.print("0x"); Serial.print(codeUTF8, HEX);

    switch (codeUTF8) {
      case '0': Serial.println(" c'est 0"); break;
      case '1': Serial.println(" c'est 1"); break;
      case '2': Serial.println(" c'est 2"); break;

      case 'a':
      case 0xC3A0: // à
      case 0xC3A2: // â
        Serial.println(" c'est une sorte de a"); break;

      case 0xC3A7: Serial.println(" c'est ç"); break;

      case 'o':
      case 0xC3B6: // ö
      case 0xC3B4: // ô
        Serial.println(" c'est une sorte de o"); break;


      case 'u': 
      case 0xC3BB: 
        Serial.println(" c'est une sorte de u"); break;

      case 0xC3AE: Serial.println(" c'est î"); break;
      default: Serial.println(", pas reconnu"); break;
    }

    ptr += n;
  }

}

void loop() {}

Merci pour vos réponses.

Effectivement, j'ai pas tout compris sur les histoires de tableaux et de pointeurs...

J'avais bien essayé au début avec case mais j'ai galéré et j'ai besoin de voir apparaître le poème dans sa forme originale, pouvoir le changer sans intervenir niveau code. Peut être est ce possible, même avec case...

merci pour les pistes pour la lecture des caractères UTF8 et uint32_t, j'y comprends qu'un vague principe pour le moment...

Je vous tiens au courant de mes avancés dès que je pourrais me plonger dans ces pistes que vous me suggérez.

Si vous le mettez dans la mémoire flash (PROGMEM) vous aurez besoin de recompiler et recharger le code à chaque nouveau poème… si vous voulez pouvoir saisir le poème au clavier / moniteur série par exemple il faut que le poème soit en RAM.

Si vous voulez comprendre comment écouter le port série (ou gérer un flux asynchrone genre keypad) vous pouvez jeter un oeil à mon petit tuto sur le sujet

Bonjour @yemgui
Jetez un œil ici :

Bonne journée

J’avais pas lu le « poème »

C’est pas très poétique :wink:

C'est le premier sonnet écrit par Théophile Gautier comme est écrit dans le code… (cherchez « POÈME SOLITUDE » )

Bonjour @J-M-L
C'est juste une remarque. Personnellement je n'y vois aucune forme de poésie... Théophile Gautier ou pas.
Maintenant si @yemgui veut le traduire en morse, chacun est libre de faire ce qu'il veut.

C'est tout.

Bonne journée.

Oui merci !
la modification du poème ne sera qu' exceptionnelle, mais doit être facile à faire pour un non programmeur.
J'ai besoin de la mettre dans la mémoire flash car la ram est insuffisante, il n'y a pour l'instant qu'un paragraphe du poéme, il doit pouvoir être beaucoup plus long, donc sur la flash.

Bonjour Jackson

Si je comprends bien c'est de faire un tableau qui contient la lettre et sa correspondance en morse, et la loop n'en fera que la lecture, plutôt que qu'elle fasse une lecture du char et la convertisse à chaque lecture de caractère ? Comment construire ce tableau ?

D'autre part je crois pas que je vais m’embêter avec les ç,à,é,è etc, car le morse de base ignore ces forme.

Par contre si je trouve un bout de code qui les remplace par leur correspondant plus simple ( a pour à,â, e pour é,è,et ê, c pour ç ... etc) et ce avant compilation au téléversement, ça permettrait de laisser les textes d'auteur (certe dévergondés !) intégrales dans le code (c'est important pour moi, autant dans la mise en page que pour le textuel).

Bon d'accord, il va bien falloir pour cela me taper de la compréhension de UTF8 et uint32_t ... Hou que c'est existant ! :crazy_face:

Salut philippe86220 et merci pour le lien vers la librairie morse sur laquelle tu as travaillé. Je ne pourrais pas dire "encore eût-il fallu que je susse l'existante de cette discussion" !!! :wink:

Ignorant tes remarques somme toute absolument subjectives et peu constructives à mon projet, je vais regarder ton code avec intérêt. :slightly_smiling_face:

Ok pas de soucis pour moi, c’est juste une histoire de goût. C’est juste pas mon truc mais n’y vois rien de péjoratif à ton égard :wink:
Bonne journée

Va voir ici :

Peut-être que ça te sera utile également :wink:

Pour faire ce genre de chose, le plus "simple" est de prendre le tableau ascii et d'avoir une correspondance entre chaque élément ascii et la table de morse.
le truc chiant étant qu'il faut que tu restreigne les caractères UTF-8 à la table asciii et donc convertir les caractères non ASCII en ASCII, ç en C par exemple.
Si tu as un problème de place mémoire, tu dois pouvoir restreindre la table ASCII au minimum vitale pour toi, mais cela complexifie encore plus la conversion utf-8 en ascii.

Donc pour résumer tu fait un tableau de 127 élément, par exemple l'élément avec l'indice 30 (mle caractère 0 en ascii), contiendra l'indice dans ta table de morse (ex 27, si le 0 est à la suite des caractères de l'alphabet)

Si vous voulez le poème en flash, sur un Uno ou mega ça veut dire qu’il faut recompiler. Votre code ne pourra pas écrire en flash. Donc si vous jugez qu’un non programmeur peut éditer le code source, compiler et charger le code avec l’IDE c’est bon, sinon ça ne va pas le faire….

Moi non plus :wink:

cf le bout de code d’exemple que je vous ai donné

Bonsoir @J-M-L
Il faut dire que je préfère par exemple :

Mignonne, allons voir si la rose
Qui ce matin avait éclose
Sa robe de pourpre au Soleil,
N'a point perdu cette vêprée
Les plis de sa robe pourprée,
Et son teint au votre pareil.

Las ! voyez comme en peu d'espace,
Mignonne, elle a dessus la place
Las ! las ses beautés laissé choir !
Ô vraiment marâtre Nature,
Puisqu'une telle fleur ne dure
Que du matin jusques au soir !

Donc, si vous me croyez, mignonne,
Tandis que votre âge fleuronne
En sa plus verte nouveauté,
Cueillez, cueillez votre jeunesse :
Comme à cette fleur la vieillesse
Fera ternir votre beauté.

Il y a tellement d’auteurs et de poèmes exceptionnels qui mettent en avant les bonheurs de la vie …

Oui, après il faut replacerThéophile Gautier dans son époque et la rupture avec le classicisme. lisez la suite du poème, ça fait partie de la culture générale :wink:

Quant à la rose de Ronsard… c’était plus discret effectivement