[Résolu]Conversion float en char

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]);

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

Pas de solution ? :frowning:

Essaye :

sprintf(buffer, "%6.2f", x);

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

toutes mes excuses
je vais essayer
je vous dit quoi !!!

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

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

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

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

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);
}

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

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)

dtostrf(floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf);

Je vais essayer
Merci

Oui mais PString fonctionne ?