[Resolu] S1D13700 :: Conversion de données vers char *

Yep!

Je rencontre quelques difficultés à convertir des variables afin qu'elles puissent être afficher sur mon ecran.

J'utilise la librairie S1D13700_beta de cafelogic.com (http://www.cafelogic.com/2011/new-s1d13700-beta-library-for-arduino/)

La fonction à compléter est celle-ci :

void writeBitmapText(char * text,int x, int y, unsigned int * font);

J'ai parcouru les diverses possibilités il me semble, snprintf, dtostrf.

La fonction snprintf me retourne des resultats étranges, soit la valeur ne s'affiche pas du tout, soit elle est tronquée.

Exemple :

char hour_buff[2], minute_buff[2], time_buff[17];
  char ibuff1[5], obuff1[14];
  char buf2[5];
  glcd.clearText();
  glcd.clearGraphic();
  dtostrf(temperature1,5,2,ibuff1);
  dtostrf(_hour,2,0,hour_buff);
  dtostrf(_minute,2,0,minute_buff);
  snprintf(time_buff, 17, "%s h %s", hour_buff, minute_buff);
  snprintf(obuff1, 14, "T1 : %s", ibuff1);
  glcd.writeBitmapText(time_buff, 30, 17, LUCIDA_FONT);
  glcd.writeBitmapText(ibuff1, 20, 100, LUCIDA_FONT);
  glcd.writeBitmapText(dtostrf(temperature1,5,2,buf2),50, 150, LUCIDA_FONT);

Resultat :

1730 h 30
T1 :
20.12

Seule la troisième fonction glcd.write me donne le resultat escomté. Mais elle a l'inconvenient de me cantoner à n'écrire uniquement que les variables brutes, sans offrir la possibilité d'écrire une jolie phrase. Je suis obligé de compter les pixels !!! Ouch !!! :astonished:

Merci pour votre aide.

@+

Zoroastre.

Salut,

Le problème vient de tes buffers hour_buff et minute_buff : ils sont trop petits (tu as oublié le caractère de fin de chaîne '\0') et non initialisés. La fonction snprintf formate tes buffers jusqu'à ce qu'elle trouve le '\0'. Comme elle ne le trouve pas, on ne sait pas trop ce qu'elle fait et surtout quand elle s'arrête...

Il faudrait écrire ce genre de chose :

char hour_buff[3] = { '\0' };
char minute_buff[3] = { '\0' };
char time_buff[17] = { '\0' };

avec taille = nombre de caractères + 1 pour le '\0'.

Je te laisse vérifier les autres buffers...

++

Yep!

Super ! Ca marche impec, merci SesechXP.

Auriez vous une idée pour ajouter un zero lorsque la minute ou l'heure sont inferieures à 10. La methode conventionnelle ne semble pas correspondre...

@+

Zoroastre.

De rien ;)

Je suppose que les variables _hour et _minutes sont des entiers. Tu peux les formater directement à l'aide de la fonction snprintf, les deux appels à dtostrf ne sont pas utiles.

snprintf(time_buff, 17, "%02d h %02d", _hour, _minutes);

++

Yep!

Encore merci ;)

Cela devrait fonctionner, j'ai uploader le nouveau code à 19h12... :stuck_out_tongue_closed_eyes: So, wait & see.

J'ai tenté différentes solutions pour convertir ma température, apparement dans ce cas là, je suis obligé de passer par dtostrf.

J'ai passé du temps à chercher une méthode aisée, sans veritable solution parfaite...Surprenant je trouve d'ailleurs !!! Mais bon, je suis débutant...

@+

Zoroastre.

Pour la température, c’est normal que tu ne puisses pas la formater à l’aide de snprintf : par défaut Arduino utilise une version allégée qui ne fonctionne pas avec les nombres réels. A noter que le comportement est le même en utilisant directement avr-gcc. Il y a une solution à ça mais très couteuse en mémoire sur un atmega328 : presque +85% de mémoire flash pour le snprintf :cold_sweat:

Le mieux est de trouver une autre solution, ce que tu as fait. Sinon il est possible de se dépatouiller avec des divisions par 10 et des modulos, mais pas sûr que ce soit mieux…

++