Mon arduino mesure la température et donne des valeurs comme: 28,58 degrés Celsius. Je voudrais arrondir ce chiffre à une décimale. Je pourrais raccourcir la variable en coupant le « 8 » qui désafficherait 28,5. Pourtant, cela ressemble un peu à de la triche car il nest pas mathématiquement correct. Quelquun sait-il arrondir vers le haut / vers le bas. Ce qui montrerait ma température comme 28,6.
Des conseils supplémentaires sont nécessaires. Jenvoie la tempature par Serial à mon RPi qui a un code python en cours dexécution. Suggérez-vous de faire larrondi dans le code Arduino ou dans le code Python.
Merci davance!
Commentaires
Réponse
Autant que je sache, Serial.print (ou println) arrondit vers le haut et vers le bas. Tout ce que vous avez à faire est de prendre une variable flottante et de faire Serial.print( value, 1);
Sans paramètre supplémentaire, la valeur par défaut est choisie, soit 2 chiffres décimaux: Serial.print( value, 2);
Pourquoi voulez-vous raccourcir les octets sur le Serial? Vous pouvez tout aussi bien envoyer deux chiffres décimaux et traiter la valeur en Python.
Commentaires
- Cest sur quoi porte la dernière partie de ma question; ) se demandant où traiter, en python sur mon Rpi ou avant lenvoi.
- Tout arrondi doit être effectué au plus près de la sortie finale. Si votre port série est assez rapide, envoyez 2 ou 3 chiffres et arrondissez lorsque le Pi sort les données. Vous n ' pas vouloir baser les calculs sur des valeurs arrondies si vous pouvez l’aider, ce qui introduit la possibilité d’erreurs. Cela dit, ' est une perte de temps totale à envoyer des nombres aléatoires, si le capteur de température a une erreur de +/- 1 degré, la première décimale peut être utile, tout ce qui suit est sans signification.
- Daccord, daccord! Il est plus précis de traiter à létape finale, mais la précision du capteur nest pas là, donc je vais économiser de la bande passante en utilisant Serial.print (valeur, 1);
Réponse
Vous pouvez arrondir à C en multipliant la signification, en ajoutant +0,5, en arrondissant vers le bas (équivaut à une conversion en entier) et en divisant.
float f_rounded = ((int) (f * 10.0 + 0.5) / 10.0);
28,6 sera:
float f_rounded = ((int) (28.6 * 10.0 + 0.5) / 10.0) = ((int) 286.5) / 10.0 = 286 / 10.0 = 28.6
En Python, il est égal (sauf que lopérateur de conversion est int ( …)
Mise à jour: pour les nombres négatifs +0,5 devrait être -0,5
Crédits pour Edgar Bonet: en utilisant des rondes pour les nombres positifs et négatifs:
float f_rounded = round(f * 10) / 10.0;
Commentaires
- Cela arrondirait
-28.58
à-28.5
. - @JohnnyMopp Jai mis à jour mes réponses, merci pour le commentaire
- Pourquoi pas simplement
float f_rounded = round(f * 10) / 10.0;
? les cas positifs et négatifs.
Serial.print()
faire l’arrondi, comme par réponse de @Jot '.