[résolu] [lcd] caractères accentués

Bonjour...

j'ai beau cherché je ne trouve rien de concluant.

Je sais dessiner des caractères persos, et je sais les afficher.
je voudrais remplacer des caractères accentués de chaines (String) par les caractères persos... un "é" par un caractère perso stocké dans la cgram de l'afficheur.
Quand je tente de reconnaître un caractère accentué, je n'y arrive pas.

...
1 39 -> '
2 -61
3 -87 -> é
4 116 -> t
5 97 -> a
6 105 -> i
7 115 -> s
...

On dirait (ça doit-être le cas) qu'un caractère accentué est codé sur plus de bits qu'un caractère ascii de base dans une String.
Donc qu'il occupe deux octets de mon array plutôt que 1.
Vu sa physionomie, je hasarderais un truc du genre le premier octet c'est la partie gauche et le second, la partie droite de mon chiffre codé sur 16 bits...
et là après avoir ramené ma science... je fais comment:

  • pour détecter que c'est un "long" et quelle est sa valeur ?

J'ai croisé un post succinct en anglais qui disait de créer un buffer 32bits et passer la table (la String) par lui pour connaitre la valeur du caractère...
Ok... pourquoi pas.
Si je comprends l'idée, je suis loin de savoir l'écrire en C...

Faut-il travailler à l'ancienne, sans String mais avec string et des pointeurs?

Ahhhh les pointeurs, quand je lis dans mon manuel de C, je comprends, et si je tourne la tête, je me retrouve poisson rouge (ou atteint du syndrome Korsakov) et je ne sais plus comment marche un pointeur.
Bref. :roll_eyes:

J'en appelle à votre bonne âme, votre clémence, pour me gratter cette foutue fonction qui éplucherait ma chaine pour la remplacer (avant d'envoyer le caractère au lcd) le caractère accentué et écrire avec un caractère perso

write(index_de_la_table_des_caract_perso)

plutôt que le double caractère beurk...

Bon si vous voulez pas gratter, peut-être que j'ai mal cherché et que vous pouvez me pointer vers un début de solution.

merci infiniment de votre aide.

ps: je bricole avec le module dfrobot LCD i2C. et la lib custom liquidCrystal_I2C (de chez dfrobot) écrite par des sans accents...

Bonjour,

Les caractéres accentué sont codé sur 1 octet, mais de maniére "non signé" (0 à 255) contrairement aux caractéres normaux qui sont stocké dans une valeur signé (-127 à +127).

Essaye un truc dans ce genre :

for(byte i = 0; i < str.length(); ++i) {
  switch((unsigned char) str[i]) {
    case 39: str[i] = 1; break;
    case -61: str[i] = 2; break;
    case -87: str[i] = 3; break;
    case 116: str[i] = 4; break;
    case 97: str[i] = 5; break;
    case 105: str[i] = 6; break;
    case 115: str[i] = 7; break;
  }
}

MERCI :smiley:

j'ai tenté ce matin de transformé en "long" mais ça marchait pas mieux... et pour cause.
effectivement en mettant un "unsigned" ceci explique cela...

merci encore

Bon alors à partir des infos de skywodd, j'ai continué à me gratter la tête... parce que les caractères spé utilisent 2 "cases" dans la table, le premier chiffre est "195" ensuite le num du caractère spécial...

donc voilà le code que j'ai bricolé avec mes dessins de lettres persos pour les accents.

uint8_t eAigu[8] = {130,132,142,145,159,144,142,128};
uint8_t eGrave[8] = {136,132,142,145,159,144,142,128};
uint8_t eCirc[8] = {132,138,142,145,159,144,142,128};
uint8_t aGrave[8] = {136,134,128,142,145,147,141,128};
uint8_t aCirc[8] = {132,138,128,142,145,147,141,128};
uint8_t iCirc[8] = {132,138,128,140,132,132,142,128};
uint8_t uCirc[8] = {132,138,128,145,145,147,141,128};
uint8_t uGrave[8] = {136,134,128,145,145,147,141,128};

et le createchar dans le setup qui va bien

lcd.createChar(0, eAigu);
  lcd.createChar(1, eGrave);
  lcd.createChar(2, eCirc);
  lcd.createChar(3, aGrave);
  lcd.createChar(4, aCirc);
  lcd.createChar(5, iCirc);
  lcd.createChar(6, uCirc);
  lcd.createChar(7, uGrave);
void affiche() {
  lcd.clear();
  int index = 0;
  for(byte i = 0; i < phrase.length(); ++i) {
    switch((unsigned char) phrase[i]) {
      case 160:
        // à - a grave
        lcd.setCursor(index%16,index/16);
        lcd.write(3);
        index++;
        break;
      case 162:
        // a circ
        lcd.setCursor(index%16,index/16);
        lcd.write(4);
        index++;
        break;
      case 167:
        // ç - c cedille
        lcd.setCursor(index%16,index/16);
        lcd.print("c");
        index++;
        break;
      case 168:
        // è - e grave
        lcd.setCursor(index%16,index/16);
        lcd.write(1);
        index++;
        break;
      case 169:
        // é - e aigu
        lcd.setCursor(index%16,index/16);
        lcd.write(0);
        index++;
        break;
      case 170:
        // e circ
        lcd.setCursor(index%16,index/16);
        lcd.write(2);
        index++;
        break;
      case 174:
        // i circ
        lcd.setCursor(index%16,index/16);
        lcd.write(5);
        index++;
        break;
      case 185:
        // ù - u grave
        lcd.setCursor(index%16,index/16);
        lcd.write(7);
        index++;
        break;
      case 187:
        // u circ
        lcd.setCursor(index%16,index/16);
        lcd.write(6);
        index++;
        break;
      case 195:
        // rien
        break;  
      default:
          lcd.setCursor(index%16,index/16);
          Serial.print(phrase[i]);
          lcd.print(phrase[i]);
          index++;
    }
  }
  Serial.println(phrase);
}

bref en espérant que ça aide!

ps: le module lcd de chez dfrobot a un HD44780 dans le ventre avec la rom japonaise pour la seconde partie des caractères (donc pas les accents européens)

Il existe une librairie dérivée de la LiquidCrystal qui gère automatiquement la création des caractères accentuées codé en UTF-8 par l'éditeur d'arduino. Les caractères spéciaux sont créés dynamiquement au moment de leur écriture sur le LCD avec la limite de 8 caractère spéciaux différents max par écran. Lorsque l'on efface l'écran avec lcd.clear(); ceux ci sont automatiquement libérés de la mémoire et on peut ainsi utiliser d'autres caratères accentués sur l'écran suivant ...

La bibliothèque ainsi qu'un exemple est disponible ici :

http://www.technozone51.fr/dokuwiki2/doku.php?id=documentation:tz51_liquidcrystal_fr

Bonjour

Ajoutons que selon l'environnement/l'éditeur de texte utilisé pour coder le source en cpp, les caractères accentués ne sont pas encodés de la même manière dans le fichier source !

Ainsi un simple char *msg = "héhé"; dans le source peut être stocké de diverses manières...

Lire posts 17 et 19 de ce topic. Cela devrait grandement t'intéresser.