Go Down

Topic: Reception données température (Read 696 times) previous topic - next topic

CANNET

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

Code: [Select]
  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

J-M-L

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 toInt() transforme votre chaîne en entier. Il faudrait utiliser toFloat()

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
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

infobarquee

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.
AUCUNE AIDE PAR MP

CANNET

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

Code: [Select]
//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);
    }


Code: [Select]
//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

infobarquee

testes ca

Code: [Select]
temporaryValue = mySwitch.getReceivedValue();
T = temporaryValue/100 ;
AUCUNE AIDE PAR MP

CANNET

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


lesept

#6
Mar 31, 2018, 08:45 am Last Edit: Mar 31, 2018, 08:49 am by lesept
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 :
Code: [Select]
  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 ?
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

CANNET

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

infobarquee

essaye ca

Code: [Select]
  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);
    }
AUCUNE AIDE PAR MP

CANNET

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




infobarquee

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

CANNET

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



CANNET

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




Go Up