Utilisation symboles UFT8 avec u8g2

Bonjour à tous,

Je sais que je vais poser une question qui paraitra évidente, mais je n'ai pas trouvé la réponse, il doit me manquer les connaissances de base pour m'en sortir avec ce que j'ai lu.

Je suis un train de faire un montage avec un écran LCD JLX12864G de récupération et je n'arrive pas à afficher les symboles unifont que je souhaite.

J'ai compris qu'entre des guillemets je peux coller directement le symbole UFT8 que je souhaite mais je n'arrive pas à trouver ces symboles sur le net, dans l'aide de la bibliothèque u8g2 il y a bien des images des différents symboles mais le copier/coller ne marche pas (normal avec une image, ça je le comprends).
J'aimerais donc entrée directement l'adresse du symbole dont j'ai besoin (le sablier en 9200/23f3) mais rien à faire ça ne marche pas.

Ci dessous mon code:

#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>

U8G2_ST7565_JLX12864_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);

void u8g2_prepare(void) {
  u8g2.setFont(u8g2_font_6x10_tf);
  u8g2.setFontRefHeightExtendedText();
  u8g2.setDrawColor(1);
  u8g2.setFontPosTop();
  u8g2.setFontDirection(0);
}

void setup(void) {
  u8g2.begin();
    u8g2.setContrast(65);
}

void loop(void) {

  u8g2.clearBuffer();
  u8g2.drawStr( 0, 0, "Unicode");
  u8g2.setFont(u8g2_font_unifont_t_symbols);
  u8g2.setFontPosTop();
  u8g2.drawUTF8(0, 48,0x23f3);
  u8g2.drawUTF8(0, 24, "☀ ☁");
  u8g2.drawUTF8(5, 36, "☂");
  u8g2.sendBuffer();
  delay(500);

}

Je vois donc bien s'afficher le soleil, le nuage et le parapluie, mais pas mon sablier.
j'ai cette avertissement dans l'IDE Arduino :
"warning: invalid conversion from 'int' to 'const char' [-fpermissive] u8g2.drawUTF8(0, 48,0x23f3);"

Si quelqu'un peux éclairer ma lanterne cela m'aiderais beaucoup.

Merci d'avance

Edit:
J'ajoute ci dessous un liens vers l'image des symboles que j'utilise:
u8g2_font_unifont_t_symbols

Je tenterais

u8g2.drawUTF8(0, 48,0x23, 0xf3);

Merci pour ton aide @fdufnews mais ça ne fonctionne pas, l'IDE me renvoie l'erreur suivante:
note: candidate expects 3 arguments, 4 provided
exit status 1


Et la compilation s'arrête.

l'avertissement complet ci dessous si ça peut aider qqun:
J:\Documents\Arduino\UltraSoup\UltraSoup.ino: In function 'void loop()':
UltraSoup:26:34: error: no matching function for call to 'U8G2_ST7565_JLX12864_F_4W_SW_SPI::drawUTF8(int, int, int, int)'
u8g2.drawUTF8(0, 48, 0x23, 0xf3);
^
In file included from J:\Documents\Arduino\UltraSoup\UltraSoup.ino:2:0:
J:\Documents\Arduino\libraries\U8g2\src/U8g2lib.h:294:17: note: candidate: u8g2_uint_t U8G2::drawUTF8(u8g2_uint_t, u8g2_uint_t, const char*)
u8g2_uint_t drawUTF8(u8g2_uint_t x, u8g2_uint_t y, const char *s) { return u8g2_DrawUTF8(&u8g2, x, y, s); }
^~~~~~~~
J:\Documents\Arduino\libraries\U8g2\src/U8g2lib.h:294:17: note: candidate expects 3 arguments, 4 provided
exit status 1
no matching function for call to 'U8G2_ST7565_JLX12864_F_4W_SW_SPI::drawUTF8(int, int, int, int)'

Je ne pense pas qu'il y ait de prototype de fonction avec 4 paramètres.

Il faut donner une chaine de caractère.
tu peux essayer ça :hourglass_flowing_sand:
sinon je pense qu'il faut que tu construise une chaine avec ta séquence d'octet, quelque chose comme ça je pense.

char sablier[4] = {0xe2, 0x23, 0xf0, 0x00};
u8g2.drawUTF8(5, 36, sablier);

J'ai oublié une partie de la valeur pour les caractère supérieur à 127, 0xe2 et non 0xe

les signatures de la fonction sont

u8g2_uint_t U8g2::drawUTF8(u8g2_uint_t x, u8g2_uint_t y, const char *s)    
u8g2_uint_t U8g2::drawUTF8X2(u8g2_uint_t x, u8g2_uint_t y, const char *s)    

➜ il faut donc passer la chaîne UTF8 directement

Si on regarde le code UTF8 du sablier

Nom: Sablier avec coulée de sable
Encodage UTF-8: 0xE2 0x8F 0xB3
Encodage UTF-16: 0x23F3

essayez avec

u8g2.drawUTF8(0, 48, "\xE2\x8F\xB3");

ou

u8g2.drawUTF8(0, 48, "\x8F\xB3");

Merci @terwal pour ton aide mais ça ne fonctionnait pas avec une chaine de caractère

@J-M-L , cela fonctionne avec un encoge UTF-8

Merci aussi pour ton lien il va m'être utile pour mieux comprendre l'encodage UTF8 et pouvoir afficher d'autre caractères spéciaux.

Un grand merci à tous, je peux maintenant avancer dans mon projet.
(qui est de transformer un Soup & Co HS en nettoyeur à ultrason).

amusez vous bien !

@J-M-L , c'est un peu hors sujet mais peux tu m'en dire plus sur l'antislash "\" que tu as utilisé?

Il permet de définir quelle sorte de variable, ou est-ce un séparateur?
Je crois que c'est la première fois que je le vois dans un programme.

Merci pour la précision.

le code que je t'ai donné ne fonctionne pas, même une fois corrigé?

L'antislash est un caractère d'échappement, pour indiquer que ce qui suis n'est pas le caractère donné.
Le meilleur exemple est \n qui correspond au caractère ASCII 10 de fin de ligne.
C'est à dire que dans ton tableau d'octet, il y a aura un octet avec la valeur représenté par le caractère donnée 10 pour \n, 226 pour \xE2

@terwal , non ton code ne fonction pas j'ai l'avertissement suivant:
warning: narrowing conversion of '240' from 'int' to 'char' inside { }

Pour ce qui est de l'antislash, tu m'a perdus :wink:
Mais je ne veux faire perdre de temps à personne, c'est déjà super de donner un coup de main, je retournerais chercher su google, mais je n'ai pas encore trouvé de réponse que je comprenais.
Je comprend ce que tu me dit sur "l'échappement" je crois mais après je suis perdu lol.

@J-M-L Merci pour l'amusement, à mon niveau c'est exactement ça, content que qqun comprenne, on a parfois du mal à me comprendre justement quand je dis que je fait ce genre de truc "pour m'amuser", chacun ces petits plaisirs ^^

Je partage ci dessous mon code simplifié et fonctionnel au cas ou ça puisse aider un futur visiteur:

#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>

U8G2_ST7565_JLX12864_F_4W_SW_SPI u8g2(U8G2_R0, 13, 11, 10, 9, 8);

void setup(void) {
  u8g2.begin();
  u8g2.setContrast(85);
 
}

void loop(void) {

  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_6x10_tf);
  u8g2.drawStr( 0, 0, "Unicode");
  u8g2.setFont(u8g2_font_unifont_t_symbols);
  u8g2.setFontPosTop();
  u8g2.drawUTF8(0, 50, "\xE2\x8F\xB3");
  u8g2.drawUTF8(0, 24, "\xE2\x8F\xB1");
  u8g2.drawUTF8(0, 35, "\xE2\x8F\xA9"); 
  u8g2.sendBuffer();
  }

1 Like

Comme expliqué il permet d’insérer dans une chaîne des caractères non représentés dans l’alphabet. On appelle cela une séquence d’échappement

Le \x introduit un caractère en hexadécimal donc quand je dis \xE2 ça met l’octet qui vaut 0xE2 à cet endroit de la chaîne,

Oui effectivement je suis allé un peu vite
le bon code pour ne pas avoir de problème devrais être plutôt le suivant, mais je n'ai pas pu le tester :frowning:

const unsigned char sablier[4] = {0xe2, 0x23, 0xf0, 0x00};
u8g2.drawUTF8(5, 36, (const char*)sablier);

c'est pas le même code mais ce type d'écriture c'est similaire à fournir directement les octets dans la chaîne "\xE2\x8F\xB3"

Oui, c'est la même chose que ce que tu as proposer en plus de ligne :slight_smile:
Même si je préfère passer par des tableaux, je ne sais pas trop pourquoi d'ailleurs, ta manière est plus simple et approprié :+1:

disons que l'écriture "\xE2\x8F\xB3" montre bien qu'on construit une cString
on préfère généralement l'initialisation par liste

const unsigned char sablier[4] = {0xe2, 0x23, 0xf0, 0x00};

au tableaux généraux, pas aux chaînes de caractères si on peut

@J-M-L Merci pour ton lien sur la séquence d'échappement, c'est plus clair, et l'exemple en bas de page est très parlant (rien ne vaut un exemple).

@terwal Désolé de ne pas tester ton code mais effectivement la solution de J-M-L en une ligne est tout de même pas mal et là je viens de calculer les 3 coefficient C1, C2, et C3 de la CTN intégrée au bol du Soup & Co, il ne me reste plus qu'a faire une régulation en température et un générateur d'ultrason, une broutille :sweat_smile:

J'ai commencé par le plus facile est le plus fun pour me motiver.
Ca donne donc ça mon affichage:

Et c'est tout beau, ça me plait bien.
Encore merci !

1 Like

joli :wink:

@sax80 pas de soucis, la solution de @J-M-L est bien plus évidente et de toutes façon on ne change pas un truc qui marche, juste pour tester :slight_smile:

@terwal j'ai quand même testé, car c'est en essayant qu'on progresse au final, bien que ce coup ci il n'y ai pas de problème de compilation, le sablier ne s'affiche pas.
J'imagine que le tableau ne renvoie à aucun caractère connu, quelque chose comme ça, ci dessous mon bout de code pour tester:

#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>

U8G2_ST7565_JLX12864_F_4W_SW_SPI u8g2(U8G2_R0, 13, 11, 10, 9, 8);

const unsigned char sablier[4] = {0xe2, 0x23, 0xf0, 0x00};
void setup() {
  // put your setup code here, to run once:
  u8g2.begin();
  u8g2.setContrast(85);
 }

void loop() {
  // put your main code here, to run repeatedly:
 u8g2.clearBuffer();
 u8g2.setFont(u8g2_font_unifont_t_symbols);
 u8g2.drawUTF8(30, 36, (const char*)sablier);
 u8g2.drawUTF8(62, 50, "\xE2\x98\x95"); // Tasse chaude

 u8g2.sendBuffer(); 
}

La tasse chaude s'affiche bien par contre.