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
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
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