system
January 7, 2014, 1:58pm
1
Bonjour
Je cherche à convertir un float (récupéré à partir d'un encodeur rotatif) en char pour pouvoir l'afficher sur 5 afficheurs 7 segments
(les valeurs vont de 118.00 à 136.00)
Le code C suivant fonctionne bien :
#include <stdio.h>
int main(int argc, const char * argv[])
{
float x = 125.65;
char buffer[20];
sprintf(buffer, "%f", x);
printf("%c\n", buffer[0]);
printf("%c\n", buffer[1]);
printf("%c\n", buffer[2]);
printf("%c\n", buffer[3]);
printf("%c\n", buffer[4]);
printf("%c\n", buffer[5]);
return 0;
}
J'ai essayé de l'adapté pour le C arduino comme ça :
#include <stdio.h>
int x = 125;
char buffer[7];
void setup(){
Serial.begin(9600);
}
void loop(){
sprintf(buffer, "%d", x);
Serial.print(printf("%s\n", buffer[0]));
Serial.print(printf("%s\n", buffer[1]));
Serial.print(printf("%s\n", buffer[2]));
Serial.print(printf("%s\n", buffer[3]));
Serial.print(printf("%s\n", buffer[4]));
Serial.print(printf("%s\n", buffer[5]));
Serial.println ();
}
Ca ne fonctionne pas, sur la console, je ne récupère que "-1 -1 -1 -1 -1 -1
Quelqu'un aurait une idée ?
Merci
c'est logique : printf retourne un INT qui indique comment tout s'est passé.
fais simplement
Serial.print(buffer[0]);
system
January 7, 2014, 2:28pm
3
Merci ça fonctionne
Mais c'était juste un test avec un int
J'ai donc modifié le code avec un float
#include <stdio.h>
float x = 125.45; // au lieu de int x = 125
char buffer[7];
void setup(){
Serial.begin(9600);
}
void loop(){
sprintf(buffer, "%f", x); // %f au lieu de %d
Serial.print(buffer[0]);
Serial.print(buffer[1]);
Serial.print(buffer[2]);
Serial.print(buffer[3]);
Serial.print(buffer[4]);
Serial.print(buffer[5]);
Serial.println ();
}
Maintenant je n'ai que des ? sur la console
B_tto
January 7, 2014, 3:58pm
5
Essaye :
sprintf(buffer, "%6.2f", x);
system
January 7, 2014, 5:55pm
6
Nan, marche poa
erreur : no matchin function for call to 'HardwareSerial::print(char[7], const char[6], float&)
on a dit sprintf, pas Serial.sprintf
system
January 7, 2014, 7:53pm
8
toutes mes excuses
je vais essayer
je vous dit quoi !!!
system
January 8, 2014, 9:47am
9
Il y a du mieux
voila mon dernier code
#include <stdio.h>
float x = 125.45;
char buffer[7];
void setup(){
Serial.begin(9600);
}
void loop(){
sprintf(buffer, "%d", (char)x);
//
Serial.print(buffer[0]);
Serial.print(buffer[1]);
Serial.print(buffer[2]);
Serial.print(buffer[3]);
Serial.print(buffer[4]);
Serial.print(buffer[5]);
Serial.println ();
delay(500);
}
Mais je ne récupère que que les 3 chiffres avant la virgule
Any sugestions ?
tu transformes ton float en entier (char)
tu utilises %d pour afficher un entier.
C'est donc normal.
utilise plutôt %f, comme préconisé plus tôt dans ce sujet.
Si tu ne t'en sort pas; sépare la partie entière des décimales que tu traitera comme deux entiers.
Et tu affiche:
serial.print(partie_entière) //pas de retour ligne
serial.print( " , ") //pas de retour ligne
serial.println(partie_décimale) //retour ligne
B_tto
January 8, 2014, 1:36pm
12
XavierMiller:
tu transformes ton float en entier (char)
tu utilises %d pour afficher un entier.
C'est donc normal.
utilise plutôt %f, comme préconisé plus tôt dans ce sujet.
+1
je comprend pas, on te donne %f et tu reposte avec un %d .... on peut continuer longtemps comme ça
system
January 8, 2014, 1:57pm
13
Euh !!
Je sépare comment la partie entiere de la partie décimale ?
Pour répondre à la réponse précedente, "%f" ne fonctionne pas, ça ne me renvoi un "?"
B_tto
January 8, 2014, 2:11pm
14
Et %6.2f ?
Sinon pour séparer c'est pas difficile : si je prend x=125.45 :
int Ent= int (x); // Ent = 125
int Fract=abs(x*100-Ent*100); // Fract = |(128.45*100) - (128*100)|= |(12845-12800)| = 45 abs() pour le cas ou x < 0
system
January 8, 2014, 2:26pm
15
Merci les amis
J'ai trouvé la solution avec la librairie PString de Mikal Hart
http://arduiniana.org/libraries/PString
Voila le code
#include <PString.h>
float x=125.55;
char buffer[20];
void setup(){
Serial.begin(9600);
}
void loop(){
PString mystring(buffer, sizeof(buffer));
mystring.print(x);
Serial.print(buffer[0]);
Serial.print(buffer[1]);
Serial.print(buffer[2]);
Serial.print(buffer[3]);
Serial.print(buffer[4]);
Serial.print(buffer[5]);
Serial.println ();
delay(500);
}
system
January 8, 2014, 2:32pm
16
En plus clean et plus court
#include <PString.h>
float x=125.55;
char buffer[20];
void setup(){
Serial.begin(9600);
}
void loop(){
PString mystring(buffer, sizeof(buffer));
mystring.print(x);
for (int i=0;i<=5;i++){
Serial.print(buffer[i]);
}
Serial.println ();
delay(500);
}
Il y a aussi
dtostrf(floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf);
B_tto
January 8, 2014, 4:16pm
18
john_lenfr:
Il y a aussi
dtostrf(floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf);
+1
PString.h en plus n'est pas très utile depuis la 1.0 et la classe String (à éviter par ailleurs)
system
January 8, 2014, 6:54pm
19
dtostrf(floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf);
Je vais essayer
Merci
system
January 8, 2014, 8:03pm
20
Oui mais PString fonctionne ?