Comment afficher sur le LCD et le port série un nombre avec 3 décimales après la virgule ?

Bonjour. Encore en phase d'apprentissage , je butte sur un problème d'affichage :

J'ai une variable "float" de nom "fréquence".
J'ai une ligne
Fréquence = 27.275;

Quand je fais afficher fréquence sur le pc par le port série, ça me donne quelque chose du genre "27.00" .

Je ne trouve pas comment :
Faire afficher après la virgule autre que 00
avoir 3 decimales après la virgule.

Si quelqu'un a une idée ?

A terme, fréquence sera aussi affichée sur un écran LCD.

Merci de votre aide .

Bonjour,

Est ce que votre variable d'affichage est bien déclaré en float ?

Bonsoir Toby64

void setup() {
	Serial.begin(115200);

	float valeur = 123.456789;

	Serial.print("Valeur : ");
	Serial.println(valeur, 3); // Affiche 123.457
}

void loop() {
}

Cordialement
jpbbricole

quand on se demande come quelque chose fonctionne, le premier réflexe c'est d'aller consulter la la doc de la fonction — ici print()

ils disent

An optional second parameter specifies the base (format) to use; permitted values are BIN(binary, or base 2), OCT(octal, or base 8), DEC(decimal, or base 10), HEX(hexadecimal, or base 16). For floating point numbers, this parameter specifies the number of decimal places to use. For example-

  • Serial.print(78, BIN) gives "1001110"

  • Serial.print(78, OCT) gives "116"

  • Serial.print(78, DEC) gives "78"

  • Serial.print(78, HEX) gives "4E"

  • Serial.print(1.23456, 0) gives "1"

  • Serial.print(1.23456, 2) gives "1.23"

  • Serial.print(1.23456, 4) gives "1.2346"

les bibliothèques pour LCD supportent aussi la classe Print donc vous pourrez utiliser la même approche

merci de me répondre.

"La moindre des choses ..." Ok je l'ai fait , sauf que j'ai d'une part mal compris, mais surtout que ça ne semble pas répondre ( ou je n'ai pas saisis la subtilité a un de mes 2 problèmes.

Ok pour les 3 chiffres après la virgule .
Mais je n'ai que des zéros après la virgule quand la valeur est issue d'un calcul
Elle est bien déclarée en float comme l'a écrit jpbbricole, et son exemple ou la valeur est définie , fonctionne aussi ici.
Mais ensuite. Cette valeur est calculée par une division par 1000 d'une autre valeurs entière ( fréquence = fréquence / 1000 )
Par ex 27275 / 1000 qui devrait donner 27.275, ça donne 27.000 via serialprint .

Bonsoir

Il faut faire:
fréquence = fréquence / 1000.0

Cordialement
jpbbricole

1 Like

merci beaucoup, c'est bien ca, ca fonctionne .

j'avoue que je n'ai pas lu cette subtilité, je vais me replonger dans les manuels.

merci Jpbbricole .

Non ce n’est pas la peine si fréquence est déjà un float car dans ce cas la division se fait en float aussi (1000 est implicitement promu en float)..

Il doit y avoir autre chose que @Toby64 ne nous dit pas sur la façon dont la formule est écrite et sur le type des éléments de la formule.

C’est pour cela qu’on demande le code…

Je pense qu’il y a deux variables, une en float et une en entier et qu’il faisait la division entière. C’est cela qu’il faudrait comprendre

Bonjour J-M-L

Ou que fréquence soit un int.

Bonne journée
jpbbricole

Tout est possible, bien qu'il indique que c'est un float, sans code malheureusement difficile d'être sûr de son problème dans la multitude des possibilités.

Si fréquence était un int alors la division par un float se ferait bien en float mais le résultat serait à nouveau tronqué pour retourner dans un int et donc le print ne fonctionnera pas. Hors il nous dit que ça marche maintenant.

De plus pour un int la fonction print n’accepte pas de nombre après la virgule. Le second paramètre dans ce cas est la base d’affichage

Il y a autre chose donc mais sans le code difficile de dire ce que c’est et difficile donc de permettre à @Toby64 de comprendre exactement ce qu’il avait sous estimé et d’apprendre ainsi de ses erreurs.

(À mon avis il avait deux variables et pas qu’une seule. La première était un int et la seconde un float mais il faisait la division avec le int)

frequence de départ 27.275 en anglosaxon çà équivaut a 27,275 en européen ?

la réponse devrait etre 0.027275 ? Serial.print (frequence); tronque les décimales à 2 par défaut et arrondi
çà dépend des réglages préférences arduino IDE ou du systeme OS ?

çà m'énervait sur mon pc win11 : la calculatrice était en "européen, me mettait un point pour les miliers et une virgule pour les décimales, jamais eu le cas de win95 à win7, en anglosaxon par défaut

float freq = 27.2755;

void setup() {
  Serial.begin(115200);

  freq = freq/1000;

  Serial.print (freq);   

}

void loop() {
  // put your main code here, to run repeatedly:

}

réponse du moniteur : 0.03

De votre code… la fonction print, quand on lui passe un float ou un double, prend un argument supplémentaire qui est le nombre de chiffres après la virgule. Si vous ne fournissez pas ce paramètre, il vaut 2 par défaut. C’est documenté…

Arduino ne gère pas la localisation des nombres et met un point décimal au lieu de la virgule chez nous. C’est donc le texte envoyé sur le flux sortant qui comporte le point, l’affichage se borne à retranscrire ce qu’il reçoit..

Les OS des ordinateurs et fonctions associées à la localisation savent par contre prendre cela en compte pour les programmes bien écrits.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.