Go Down

Topic: Convertir un entier en chaine de caratère (Read 5 times) previous topic - next topic

demss

#10
Apr 08, 2010, 09:48 am Last Edit: Apr 08, 2010, 10:26 am by userid3456789 Reason: 1
Merci flaith j'avais oublier que pour l'Arduino une variable int = 16 bits!

Avec des variable long j'ai toujours une erreur ça me donne:  la valeur est -30969.0
Code: [Select]
#include <Stdio.h>

void loop()
{
}

void setup()
{
 Serial.begin(9600);
 
 char tampon[32];
 float temp = 34567.567;
 long temp1 = (temp - (long)temp) * 100;
 sprintf(tampon,"la valeur est %0d.%d", (long)temp, temp1);
 Serial.println(tampon);
 delay(2000);
}

Et avec des variable unsigned int j'ai toujours une erreur ça me donne:  la valeur est -30969.56


Ici avec des variable unsigned int et une variable float = 30968.567 ça va mieux ça me donne:  la valeur est 30968.566
Code: [Select]
#include <Stdio.h>

void loop()
{
}

void setup()
{
 Serial.begin(9600);
 
 char tampon[32];
 float temp = 30968.567;
 unsigned int temp1 = (temp - (unsigned int)temp) * 1000;
 sprintf(tampon,"la valeur est %0d.%d", (unsigned int)temp, temp1);
 Serial.println(tampon);
 delay(2000);
}

Les Variable float sont réputé pour être non exacte alors .566 au lieu de .567 c'est surement satisfaisant pour des float.

Est ce que les variable float on une limite de 30969 pourtant ce sont des variables 32 bits selon la doc?
http://arduino.cc/en/Reference/Float
Quand je programme avec Visual C++ pour un processeur PC les variable float sont aussi = 32 bits et j'ai pas la limite de 30969.

Merci

flaith

et en indiquant que c'est un un long que tu utilises dans ton '%d' :
Code: [Select]
sprintf(tampon,"la valeur est %0ld.%d", (long)temp, temp1);  :D

demss

#12
Apr 08, 2010, 10:46 pm Last Edit: Apr 08, 2010, 11:04 pm by userid3456789 Reason: 1
Merci flaith maintenant ça fonctionne!  :D

Voici le code fonctionnel et voici ce qu'il donne:    la valeur est 34567.56
Code: [Select]
#include <Stdio.h>

void loop()
{
}

void setup()
{
 Serial.begin(9600);
 
 char tampon[32];
 float temp = 34567.567;
 long temp1 = (temp - (long)temp) * 100;                     // * 100 pour 2 chiffre après la virgule. pour 3 chiffre "* 1000"...
 sprintf(tampon,"la valeur est %0ld.%0ld", (long)temp, temp1);
 Serial.println(tampon);
 delay(2000);
}  

Attention: on rajoute un L minuscule après le zéro pour dire que c'est une variable long 32 bits.
À ne pas confondre, le L minuscule et le chiffre 1 ce ressemble beaucoup.

Merci

Bidouille

Merci à toi demss pour avoir trouvé la solution à ce problème.

demss

#14
Apr 09, 2010, 10:37 am Last Edit: Apr 09, 2010, 11:35 am by userid3456789 Reason: 1
J'ai trouver une méthode très simple pour afficher une variable float lol.

Code: [Select]
float var = 45.6;
Serial.print(var);

Mais cette méthode par défaut affiche seulement 2 chiffre après la virgule.
Le dernier chiffre est arrondie à l'entier suppérieur.
Je trouve que c'est bien car après le deuxième chiffres après la virgule la variable float devient imprécise pour l'Arduino.

Pour ceux que ça peut intéresser voici le résultat de mes testes:
Code: [Select]
float t_Float = 34567.5622;
int t_Int = 3470;
int t_Int_Bin = B1001110;  // Variable Binaire
long t_Int_Hex = 0x5AF7;  // Variable Hexadecimale
long t_Long = 3456789;
char t_Char = 'A';
char t_chaine[32] = "Salut";

char tampon[32];


void loop()
{
}

void setup()
{
 Serial.begin(9600);
 delay(500);
 
 Serial.println("Afficher les variable en utilisant seulement la fonction Serial.print():");
 Serial.print("La variable float = ");
 Serial.println(t_Float, 4);                  // Ici seulment 2 chiffre après la virgule vont être affiché si on met pas le 4. Le dernier chiffre est arrondie à l'entier suppérieur.
 Serial.print("La variable int = ");
 Serial.println(t_Int);
 Serial.print("La variable Binaire = ");
 Serial.println(t_Int_Bin, BIN);
 Serial.print("La variable Hexadecimal = ");
 Serial.println(t_Int_Hex, HEX);
 Serial.print("La variable long = ");
 Serial.println(t_Long);
 Serial.print("La variable char = ");
 Serial.println(t_Char);
 Serial.print("La variable char[32] = ");
 Serial.println(t_chaine);
 Serial.println("");

 Serial.println("Afficher les variable en utilisant les fonction sprintf() et Serial.print():");
 long temp1 = (t_Float - (long)t_Float) * 10000;                     // * 100 pour 2 chiffre après la virgule. pour 3 chiffre "* 1000"...
 sprintf(tampon,"La variable float = %0ld.%0ld", (long)t_Float, temp1);
 Serial.println(tampon);
 sprintf(tampon,"La variable int = %d", t_Int);
 Serial.println(tampon);
 sprintf(tampon,"La variable Hexadecimal = %0lX", t_Int_Hex);
 Serial.println(tampon);
 sprintf(tampon,"La variable long = %0ld", t_Long);
 Serial.println(tampon);
 sprintf(tampon,"La variable char = %c", t_Char);
 Serial.println(tampon);
 sprintf(tampon,"La variable char[32] = %s", t_chaine);
 Serial.println(tampon);

 delay(2000);
}

Et le résultat:
Quote
Afficher les variable en utilisant seulement la fonction Serial.print():
La variable float = 34567.5625
La variable int = 3470
La variable Binaire = 1001110
La variable Hexadecimal = 5AF7
La variable long = 3456789
La variable char = A
La variable char[32] = Salut

Afficher les variable en utilisant les fonction sprintf() et Serial.print():
La variable float = 34567.5625
La variable int = 3470
La variable Hexadecimal = 5AF7
La variable long = 3456789
La variable char = A
La variable char[32] = Salut

Pour l'affichage LCD la fonction lcd.print() ressemble beaucoup à la fonction pour l'affichage Serial Serial.print().
Alors je pense qu'on a pas besoin de faire de conversion de variable numérique en variable chaine de character pour afficher nos variable.
Tous le travaille de conversion à déjà été fait par les concepteur de c'est 2 librairies.
http://arduino.cc/en/Reference/LiquidCrystalPrint
http://arduino.cc/en/Serial/Print

Go Up