[ resolu] affichage sur Grove - OLED Display 96x96

Bonjour ,
je n 'arrive pas à afficher des caracteres corrects sur mon afficheur Oled quand il s'agit de recuperer des variables "int" ou "float"
ça marche pour des "string" mais pour le reste l'affichage est incorrecte

des idées .....

merci

Si c'est juste pour te familiariser tu peux convertir ce que tu veux afficher en string
String(MonInt);

Pas de code = aucune aide possible

j'ai deja essayer de convertir mais rien ne marche
pour le code c'est ça:
et pour le resultat sur l'afficheur tout ce que je veux afficher en direct marche mais quand je veux afficher une valeur que j'ai stocké là c'est des caracteres illisibles voir photo

#include <SeeedOLED.h>
#include <Wire.h>
#include <SeeedGrayOLED.h>
#include <avr/pgmspace.h>

int c = 0;
int i = 0;
int pulse = 2;                 // fil blanc connectée à la broche numérique n° 1
int capteurH = A0;             //renomme la broche A0 en capteurH pour fil rouge
int ValeurcapteurH = 0; // definie la variable d'Humidité
int Vcor;
void setup()
{
  Serial.begin(9600);
  pinMode(pulse, OUTPUT);      // met la broche utilisée pour la pulse en SORTIE  
  pinMode(capteurH, INPUT);      // met la broche utilisée pour la pulse en SORTIE
  Wire.begin();	
  SeeedGrayOled.init();  //initialize SEEED Gray OLED display
  SeeedGrayOled.clearDisplay();           //clear the screen and set start position to top left corner
  SeeedGrayOled.setNormalDisplay();       //Set display to Normal mode
  SeeedGrayOled.setVerticalMode();        // Set to vertical mode for displaying text
  if(int i=0);
  {
  SeeedGrayOled.setTextXY(i,0);  //set Cursor to ith line, 0th column
  SeeedGrayOled.putString("Humectation"); //Print oled
  }
}

void loop()
{
  digitalWrite(pulse,HIGH);   // pulse pendant 10ms
  delay(10);  
  ValeurcapteurH = analogRead(capteurH);
  Vcor = ValeurcapteurH*4.88;
  Serial.print("Humectation = " ); //affichage sur ordi    
  Serial.print(Vcor);
  Serial.println(" mV");
  digitalWrite(pulse, LOW);    // fin de pulse
  Serial.println(c);                 
  
  i++;
  c++;
  SeeedGrayOled.setTextXY(i,0);  //set Cursor to i line, 0th column
  SeeedGrayOled.putString("Vcor="); //Print oled
  SeeedOled.putFloat(Vcor);
  //SeeedGrayOled.putNumber(563);
  SeeedGrayOled.putString(" ");
  String(c);
  SeeedOled.putString(c);
  
  if (i == 12)
    {i=1;}
  else{}
  
  if (c == 100)
    {c=0;}
  else{}
  
  delay(60000);// pause 60 secondes avant nouvelle mesure

}

Alors :

  if(int i=0);
  {
  SeeedGrayOled.setTextXY(i,0);  //set Cursor to ith line, 0th column
  SeeedGrayOled.putString("Humectation"); //Print oled
  }

Ça n'a pas de relation avec ton problème mais ce qui est sur c'est que ce qui à l'intérieur du if ne sera jamais executé

Ensuite :

ValeurcapteurH = analogRead(capteurH);
  Vcor = ValeurcapteurH*4.88;

Tu travaille avec des integer et des float, donc déjà ton calcul doit ou un jour l'autre renverra des truc bizarre.

Pour mieux faire, Vcor doit être un float et tu dois procéder ainsi :

ValeurcapteurH = analogRead(capteurH);
  Vcor = float(ValeurcapteurH)*4.88;

Et du coup c'est quand même plus logique pour utiliser putFloat() de lui passer un float :wink: même si normalement ça doit marcher même avec un int.

Enfin String != string (tableau de char)

Ce qu'attend putString() est un tableau de char. Donc il faut faire:

char c[10]={'\0'};
sprintf(c,%f,Vcor);
SeeedOled.putString(c);

merci b@tto pour ces conseils
par contre en modifiant mon code :

char c[10]={'\0'};
sprintf(c,%f,Vcor);
SeeedOled.putString(c);

j'ai ces messages d'erreurs :
lecture_sonde_06_affich.ino: In function 'void loop()':
lecture_sonde_06_affich:49: error: expected primary-expression before '%' token
lecture_sonde_06_affich:49: error: 'f' was not declared in this scope
lecture_sonde_06_affich:56: error: ISO C++ forbids comparison between pointer and integer
lecture_sonde_06_affich:57: error: incompatible types in assignment of 'int' to 'char [10]'

et je ne comprends pas ta ligne : char c[10]={'\0'};

je debute.......

'\0' ==> caractère NULL ==> en fait normalement à l'initialisation, un tableau de char est rempli de '\0'
Cependant comme j'ai déjà eu des mésaventures dans le domaine, je préfère toujours bien spécifier que je veux un tableau vide. Ca mange pas de pain comme on dit.

Et le fait de le déclarer comme ça le rempli avec des caractère null, par exemple si j'avais écris :

int buffer[3]={1,2,3};

Mon tableau aurait été rempli avec 1 2 et 3. Si maintenant j'écris :

int buffer[3]={1};

Mon tableau est rempli de 1 à tous les index.

A noter que pour les string, il faut prévoir le caractère NULL finale qui doit terminer la chaîne. Par exemple :

char MaChaine[3]={'1','2','3'}; // 3 char + 1 '\0' = 4 !

==> pas bon. Pour que ça marche il faut :

char MaChaine[4]={'1','2','3','\0'};

ou bien

char MaChaine[4]="123";

pour le sprintf j'avais un doute, mais tu viens de le confirmer : il ne prend pas en charge l'argument %f sur arduino (demande trop de ressource mémoire)

Alternative :

char c[10]={'\0'};
dtostrf(Vcor,4,2,c);
SeeedOled.putString(c);

c'est bon ça compile
mais toujours la même erreur d'affichage hieroglyphe....

Pas bon

sprintf(c,%f,Vcor);

Faut faire ça

sprintf(c,"%f",Vcor);

j'avais relevé l'oubli des "" mais ça ne marche pas non plus...
je tourne en rond sur ce problème !

après une bonne nuit de sommeil et des recherches
il fallait utiliser la formule magique "dtostrf" et ça marche pour convertir mes données vers mon Oled96*96
exemple de code :

void loop()
{
  digitalWrite(pulse,HIGH);   // pulse pendant 10ms
  delay(10);  
  ValeurcapteurH = analogRead(capteurH);
  Vcor = ValeurcapteurH*4.88;
  Serial.print("Humectation = " ); //affichage sur ordi par serie   
  Serial.print(Vcor);
  Serial.println(" mV");
  Serial.println(c);
  digitalWrite(pulse, LOW);    // fin de pulse
                   
  
  i++;
  c++;
  dtostrf(Vcor,4,0,ybuffer); //fait un "double to string" pour convertir le int
  dtostrf(c,2,0,zbuffer);    //idem
  SeeedGrayOled.setTextXY(i,0);  //met le curseur ligne i et colonne 0
  SeeedGrayOled.putString("H="); //envoie sur oled
  SeeedGrayOled.putString(ybuffer); //recupere la valeur du buffer y
  SeeedGrayOled.putString("    ");
  SeeedGrayOled.putString(zbuffer); //recupere la valeur du buffer z
  
  if (i == 11)
    {i=0;}
  else{}
  
  if (c == 99)
    {c=0;}
  else{}
  
  delay(60000);// pause 60 secondes avant nouvelle mesure

}

en tout cas merci pour votre aide qui m'a mis sur la bonne voie