J'avance petit à petit sur mon projet de création d'une station méteo. ( je precise que je suis debutant en arduino et en programmation) Je suis maintenant sur la partie communication des données en 433Mgz
J'utilise deux cartes arduino et un module emeteur -recepteur 433 Mgz. j'aimerais transmettre les données température et humidité d'une carte à l'autre. Tout fonctionne j'arrive bien à récupérer les données mais j'ai juste un problème de précision sur la donnée température . J'aimerai que celle-ci soit un nombre à virgule pour justement plus de précision.
voici la partie du code qui récupéré les données du capteur DHT22
Pourquoi passez vous par une String ? D’une part c’est une mauvaise idée d’utiliser cett classe sur arduino car la mémoire est limitée et cette classe risque de fragmenter la mémoire suivant ce que vous faites, d’autre part comme son nom l’indique [url=https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/toint/]toInt()[/url] transforme votre chaîne en entier. Il faudrait utiliser [url=https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/tofloat/]toFloat()[/url]
La bonne approche est de ne pas passer par une String et d’utiliser directement un float (envoyé et reçu en tant que tel plutôt que sous forme ascii)
Notez aussi que votre capteur n’a pas une super précision donc vous ne pouvez même pas faire confiance à un chiffre après la virgule
bonjour,
pour éviter les conflits avec les float et le 433mhz, une chose simple
multiplier par 100 la temp et hum en émission
diviser par 100 à la réception.
Bonsoir
Merci beaucoup de vos réponses.
J’ai essayé de me servir de vos conseils et je suis bloqué sur la partie “reception” Pour l’instant je me suis limité a essayer faire fonctionner la partie “température”
Je joins mes deux codes
//partie emetteur
#include <SFE_BMP180.h>
#include <RCSwitch.h>
SFE_BMP180 pressure;
RCSwitch mySwitch = RCSwitch();
void setup() {
Serial.begin(9600);
// Initialize the sensor (it is important to get calibration values stored on the device).
if (pressure.begin())
Serial.println("BMP180 init success");
else
{
// Oops, something went wrong, this is usually a connection problem,
// see the comments at the top of this sketch for the proper connections.
Serial.println("BMP180 init fail\n\n");
while(1); // Pause forever.
mySwitch.enableTransmit(10);
}
}
void loop()
{
char status;
double T;
status = pressure.startTemperature();
if (status != 0)
{
// Wait for the measurement to complete:
delay(status);
// Retrieve the completed temperature measurement:
// Note that the measurement is stored in the variable T.
// Function returns 1 if successful, 0 if failure.
status = pressure.getTemperature(T);
if (status != 0)
{
// Print out the measurement:
/*Serial.print("temperature: ");*/
Serial.println(T,2);
}
}
mySwitch.send((100 * T), 24);
delay(5000);
}
Lors de la compilation de la partie récepteur j’ai un message d’erreur “temporaryValue’ cannot be used as a function” sur la ligne: T = temporaryValue() ;
J’ai essayé beaucoup de chose en utilisant float sans succès. En sachant que si j’ai bien compris la donnée T doit etre divisé par 100.
Merci
Effectivement avec cette commande je n'ai plus d'erreur de compilation.
Le problème maintenant est que sur le moniteur série il m'affiche "température= 0.00 "cinq fois puis "température= 999"
Une chose de certaine : mon capteur de température fonctionne puisque quand je branche la carte arduino " emetteur" le moniteur série affiche les bonnes températures
L'idée d'infobarquee (multiplier par 100 puis diviser par 100) visait à ne conserver que 2 chiffres après la virgule. Si tu as une donnée float avec plein de chiffres après la virgule qui n'ont pas de réalité physique, un moyen de es utiliser est de faire ce qu'il propose : pour conserver 2 chiffres, tu multiplies par 100, tu stockes dans un int, tu envoies la donnée en int. A réception, tu divises par 100 et mets dans un float que tu peux afficher.
Exemple :
Mesure 25.123456789
*100 : 2512.3456789
stocke dans int : 2512
Envoie, rception : 2512
divise pas 100 dans float, affiche : 25.12
Si tu veux un seul chiffre après la virgule, c'est 10 au lieu de 100. Si tu veux des nombres arrondis à des valeurs à 2 chiffres se terminant par 5 ou 0 (comme 25,15) c'est 20 au lieu de 100, etc.