[résolu] Afficher une variable sur un OLED SSD1306

Bonjour à tous,

J'ai un soucis d'affichage de variable (byte) sur un OLED équipé d'un driver SSD1306.
J'utilise la librairie ss_oled, qui par ailleurs me donne satisfaction pour afficher du texte.

Le problème vient du fait que je n'arrive pas à afficher une variable (genre une tension ou une température).

sommairement je fais cela :

byte potardValue;
potardValue=128;
oledWriteString(&Front_OLED, 0,0,0,(potardValue), FONT_8x8, 0, 1);

Le résultat est qu'il affiche une chaine de caractère imbitable, mais pas mon "128".

j'ai essayé de convertir ma variable en char, avec un peu plus de succès :

byte potardValue;
potardValue=128;
char potardValue[8];
oledWriteString(&Front_OLED, 0,0,0,(potardValue), FONT_8x8, 0, 1);

Cette fois ci il m'affiche bien le 128, par contre impossible de le modifier par la suite, il me sort un conflit comme quoi il ne peut pas ré-écrire la variable qui est une int, en conflit avec char. Cette méthode m'est donc inutile car je ne peux plus modifier la variable par la suite.

Si quelqu'un sait comment faire pour lui faire afficher une variable venue d'un autre process, sans pourrir ladite variable ça m'aiderait bien.

merci.

Salut,

Je suis même surpris que cela compile sans problème, en ayant deux variables de types différents portant le même nom.

Est-ce que tu as essayé ceci :

byte potardValue;
potardValue = 128;
oledWriteString(&Front_OLED, 0, 0, 0, String(potardValue), FONT_8x8, 0, 1);

Egalement, est-ce que potardValue a besoin d'être du type 'byte' ou pas ? Généralement les valeurs vont de 0 à 1023, donc ton byte est trop petit pour stocker ces valeurs.

Salut, merci pour ta réponse.

le string ne marche pas, le compilateur me répond ça :

cannot convert 'String' to 'char*' for argument '5' to 'int oledWriteString(SSOLED*, int, int, int, char*, int, int, int)'

t'inquiète pour le byte, c'est pour mon essai, il dépasse pas 255, je lui force la valeur à la main, c'est pas issue d'un vrai potard pour l'instant. et toute façon la valeur analogique brute du ADC, je la map en 0-255, donc je pourrai rester en byte. Je l'ai déjà fait et ça pose pas de problème.

Alors essai ceci :

byte potardValue;
potardValue = 128;
oledWriteString(&Front_OLED, 0, 0, 0, String(potardValue).c_str(), FONT_8x8, 0, 1);

Tu perds de la précision en faisant ceci, mais c'est toi qui sait ce que tu veux faire !

Regarde comment fonctionne l'affichage d'un nombre dans le code de démonstration simple_demo.ino installé avec la librairie.

J'y ai pensé, dans les exemples il y a souvent des trucs utiles, mais là j'ai pas pu trouver de relation entre mon appli et l'exemple. J'ai fouillé le .ccp pour trouver comment lui parler :rofl:

J'ai essayé ton truc Anthony, et ça marche !!! merci pour le tuyau.
Juste pour ma curiosité le c_str() il sert à quoi ?

Voici la doc :

En gros, ça permet de fournit l'adresse de la String et non pas la String elle-même

Comme tu peux le voir ici, le compilateur te dit qu'il attend un pointeur (donc une adresse) de type 'char'. Donc xx.c_str() permet de fournir cette fameuse adresse.

Lignes 95-98 de simple_demo.ino

  ms = millis() - ms;
  sprintf(szTemp, "%dms", (int)ms);
  oledWriteString(&ssoled, 0,0,0,szTemp, FONT_NORMAL, 0, 1);
  oledWriteString(&ssoled, 0,0,1,(char *)"Without backbuffer", FONT_SMALL,0,1);

Yes, j'ai bien essayé ça, remplacer "szTemp" par ma variable, sauf que ça ne marchait pas.

merci pour les explications.

Si besoin d'aide pour comprendre pourquoi ça ne fonctionnait pas tu peux présenter ce que tu as essayé
Quoi qu'il en soit j'aime moins cette méthode c'est chiant je trouve de rajouter une ligne de code pour faire ça, + il faut un buffer de la bonne taille etc

Les String c'est à utiliser avec parcimonie mais de la manière dont on les utilise ici, tout va bien.

N'hésites pas à mettre le topic en résolu, ça pourrait en aider certains.

Oui mais ce n'est pas szTemp qu'il faut remplacer.
szTemp c'est une c-string (char szTemp[32];) qui va contenir le contenu de la variable sous forme de texte.
C'est le 3ème argument de sprintf qu'il faut changer
sprintf(szTemp, "%d", LA_VARIABLE_QUE_JE_VEUX_FAIRE_AFFICHER);

Merci pour la précision, effectivement je tapais pas le bon argument du sprintf. Comme vous le voyez, mon noobisme me perdra. :rofl:

Donc l'appel de la fonction xx.c_str() ou la conversion via sprintf ça donne à peu près la même chose, ça convertit la variable utilisée dans le programme en un "char" que l'instruction "oledWriteString" saura utiliser.

J'ai essayé les 2, ça fonctionne, et les 2 utilisent sensiblement le même volume mémoire.

Dans mon projet, j'ai au maximum 6 variables différentes à afficher, donc 6 conversions variable>char, c'est pas énorme ça devrait aller.

Surtout que je pense pas que tu utilises les variables en même temps pour les envoyer à l'écran donc tu pourrais utiliser le même buffer.
L'avantage avec la méthode String(...).c_str() est que la mémoire utilisée pour faire ceci est directement libérée après son usage, contrairement à l'utilisation d'un buffer (mais on parle de quelques octects...)

Et la méthode String(...).c_str() est plus flexible, tu peux mettre quasiment n'importe quoi entre les paranthèses. Pour utiliser sprintf(szTemp, "%dms", (int)ms);, il faut faire attention au type de la variable (3e argument).

Bref, have fun

Hello,

Je vous confirme, ça marche super bien avec l'appel du String(...).c_str() .
j'arrive à manipuler mes écrans comme je veux (j'en ai 15 que je multiplexe) et faire afficher les variables.
J'ai maintenant des questions sur ma librairie DMX, mais je vais ouvrir un autre sujet pour pas etre HS sur celui là.

merci à vous pour votre aide.

Salut,

Tant mieux ça fait plaisir. Pour mettre un topic en résolu, normalement on ne modifie pas son nom. Sous chacune des réponses que tu as pu avoir dans ce topic, tu as une case cochée (un bouton). Si tu cliques dessus, ça désigne le post comme solution et classe ton topic dans les topics résolu.

Bonne continuation !