Reception données température

Bonjour à tous

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

  temporaryValue = String(mySwitch.getReceivedValue());
    if(temporaryValue.substring(0,3) == "999"){
      temperature = temporaryValue.substring(3).toInt() ;
    }  
    if(temporaryValue.substring(0,3) == "888"){
      humidite = temporaryValue.substring(3).toInt() ;
    }

je pense que le problème vient de la partie substring.toInt qui ne gère il me semble que de nombre entiers, mais je ne sais pas par quoi la remplacer

merci d'avance pour vos réponses

jean-christophe

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);
    }
//Partie recepteur

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

float temporaryValue ;
double T = 0;
long oldDataTime;

void setup() {
 Serial.begin(9600);
  mySwitch.enableReceive(0);

}

void loop() {
if (mySwitch.available()) {
 
    int value = mySwitch.getReceivedValue();
 
    if (value == 0) {
      Serial.print("Unknown encoding");
    } else {
     Serial.print("Received ");
      Serial.print( mySwitch.getReceivedValue() );
      Serial.print(" / ");
      Serial.print( mySwitch.getReceivedBitlength() );
      Serial.print("bit ");
      Serial.print("Protocol: ");
      Serial.println( mySwitch.getReceivedProtocol() );
    }

temporaryValue = float(mySwitch.getReceivedValue());
[T = temporaryValue() ;

mySwitch.resetAvailable();
 
    oldDataTime = millis();
 
  }
  if(millis() > (oldDataTime + 10000) ){
    T = 999 ;
  }
   Serial.print("Temperature: ");
      Serial.println(T);

      delay(2000);
}

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.

Je vous remercie d’avance pour votre aide

Jean-Christophe

testes ca

temporaryValue = mySwitch.getReceivedValue();
T = temporaryValue/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

Jean-Christophe

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.

Il affiche 999 à cause de ça :

  if(millis() > (oldDataTime + 10000) ){
    T = 999 ;
  }

Le 0.00 : je ne sais pas, combien doit-il afficher normalement ?

Peux-tu mettre dans un message ce que l'émetteur envoie et ce que le récepteur affiche ?

Bonjour
Merci encore pour vos réponses que me permet de comprendre.

Normalement le moniteur série de la partie récepteur devrait afficher la température de la sonde

Je joint une copie d’écran du moniteur série de la partie émetteur.
Mais les données ont elles été envoyées ??

la deuxième copie d’écran est ce qu’affiche le moniteur série de la partie récepteur

cordialement

essaye ca

  if (status != 0)
    {
      // Print out the measurement:
      /*Serial.print("temperature: ");*/
      Serial.println(T,2);
int temp = T*100;
Serial.println(temp);
mySwitch.send(temp, 24);
    }

Copie d’écran du moniteur série de la partie émetteur avec la modification

je me doutais que ca allait faire ca, et c'est normal.
mais niveau réception, ca donne quoi maintenant?

rien n'a changé au niveau réception
toujours température = 0.00

bonjour,
Pour information, si cela peux aider des personnes, mon problème a été résolu en déplaçant , pour la partie émetteur, la fonction:

mySwitch.enableTransmit(10);
juste au dessous de

Serial.begin(9600);
cordialement