Bonjour qui a une idée pour simplifier mon code

Bonjour voila j’ai fait un petit montage simple c’est une carte arduino uno qui capte une température et une humidité qui l’envoie en 433mhz sur une carte arduino mega qui affiche la température et humidité sur un écran lcd basic.

Le truc c’est que les envoie en 433mhz sont pas ciblé. Et s’il loupe un envoie il a vite fait d’inverser les valeur température et humidité. Donc dans l’envoie j’ai cacher une valeur 1 pour l’humidité et 2 pour les température. Puis après je teste les valeurs et vérifie que la valeur recue et bien une température ou humidité. comme sa j’ai plus de problème d’inversion. Sa marche super bien mais c’est une usine a gaz pour pas grand chose je trouve qui a une autre idée ?

Code émetteur :

#include <VirtualWire.h>
 
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22   
//
DHT dht(DHTPIN, DHTTYPE);

void setup() {
 

  // Initialisation de la bibliothèque VirtualWire
  // Vous pouvez changez les broches RX/TX/PTT avant vw_setup() si nécessaire
  vw_setup(2000);
  dht.begin();
 
}
 
void loop() {

  float h = dht.readHumidity();   //relever humiditer
  
  float t = dht.readTemperature();  //relever température

  delay(500); // delay pour pas aller trop vite sa me rassure :D
  
 float vh = h + 1; //creation d'une valeur test humiditer
 float  vt = t + 2; //creation d'une valeur test temperature
  

  vw_send((byte *) &t, sizeof(t)); // envoie température
  delay(1000);
  vw_send((byte *) &vt, sizeof(vt)); // envoie valeur de test température
  delay(500);
  vw_send((byte *) &h, sizeof(h)); //envoie humiditer
  delay(1000);
  vw_send((byte *) &vh, sizeof(vh)); //envoie valeur de test humiditer
  vw_wait_tx(); // Attente de la fin de l'envoi


delay(1000);
}

code récepteur :

#include <LiquidCrystal.h>

#include <VirtualWire.h>
float temp = 0;
float hum = 0;
LiquidCrystal lcd(11 , 10, 5, 4, 3, 2);
void setup() {
  
  lcd.begin(16,2);
  // Initialisation de la bibliothèque VirtualWire
  // Vous pouvez changez les broches RX/TX/PTT avant vw_setup() si nécessaire
  vw_set_rx_pin(12);
  vw_setup(2000);
  
  vw_rx_start(); // On peut maintenant recevoir des messages
   lcd.print("couco");
 
}

void loop() {
 
  float t;
  byte taille_t = sizeof(float);

  vw_wait_rx();

vw_get_message((byte *) &t, &taille_t) ; //on recoie la valeur de la température 


  
delay(1000);
   


float vt;
  byte taille_vt = sizeof(float);

vw_wait_rx();
vw_get_message((byte *) &vt, &taille_vt) ; // on recoie la valeur de test température

 temp = vt - t; // on vérifie que les valeurs sont bien les température
if (temp == 2 ){ // si c'est bien les température on l'envoie sur l'écran ligne en haut
   
   lcd.setCursor(0,0);
   lcd.print(t);
   lcd.setCursor(6,0);
   lcd.write("C");

}


   float h;
  byte taille_h = sizeof(float);

  vw_wait_rx();
 
  vw_get_message((byte *) &h, &taille_h);// on recoie la valeur humiditer 
  delay(1000);
  
   float vh;
  byte taille_vh = sizeof(float);

  vw_wait_rx();
 
  vw_get_message((byte *) &vh, &taille_vh);// on recoie la valeur test humiditer 

hum = vh - h;// on vérifie que c'est bien une valeur humiditer
if (hum == 1){// si c'est bien une valeur humiditer on l'envoie sur l'écran
  lcd.setCursor(0,1);
   
 lcd.print(h);
    lcd.setCursor(6,1);
   lcd.write("%");
  
}}

Recepteur

void loop() {
  float v;
  float vt;
  float difference;
  byte taille_v = sizeof(float);
  byte taille_vt = sizeof(float);

  vw_wait_rx();
  vw_get_message((byte *) &v, &taille_v) ; //on recoit une valeur  
  delay(1000);
  vw_wait_rx();
  vw_get_message((byte *) &vt, &taille_vt) ; // on recoit la valeur de test 

  difference = vt - t; // on calcule la difference des valeurs
  switch(difference) {
    case 2 :
      // c'est la temperature
      lcd.setCursor(0,0);
      lcd.print(v);
      lcd.setCursor(6,0);
      lcd.write("C");
      break;
    case 1 :
      // c'est l'humidite
      lcd.setCursor(0,1);
      lcd.print(v);
      lcd.setCursor(6,1);
      lcd.write("%");
      break;
     }  
  }

Enlevez les délais, envoyez les 2 valeurs en ascii séparées par un espace et ensuite un séparateur genre '\n'

Côté récepteur lisez une chaîne de caractère jusqu'à trouver le séparateur, analyser la ligne (strtok) pour extraire les 2 valeurs (atof pour les nombres flottants ou atoi pour les entiers)

Vous aurez ainsi un code générique pour échanger des données

Bonjour,

Le plus simple est de transmettre les mesures dans une structure.
Tu déclares la même structure dans l’émission et la réception

struct SMesures
{
  float hum;
  float temp;
};

Tu envoies et reçois la même structure donc c’est complètement transparent et ça donne un programme très simple

envoi

#include <VirtualWire.h>

#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
//
DHT dht(DHTPIN, DHTTYPE);

// structure des mesures effecutées
struct SMesures
{
  float hum;
  float temp;
};

void setup() {
  // Initialisation de la bibliothèque VirtualWire
  // Vous pouvez changez les broches RX/TX/PTT avant vw_setup() si nécessaire
  vw_setup(2000);
  dht.begin();

}

void loop() {
  SMesures mesures;             // pour mémorisation des mesures
  
  mesures.hum = dht.readHumidity();   //relever humiditer
  mesures.temp = dht.readTemperature();  //relever température

  vw_send((byte *) &mesures, sizeof mesures); // envoie des mesures

  delay(1000);
}

réception:

#include <LiquidCrystal.h>
#include <VirtualWire.h>
LiquidCrystal lcd(11 , 10, 5, 4, 3, 2);

// structure des mesures effecutées
// doit être la même que pour l'émission
struct SMesures
{
  float hum;
  float temp;
};


void setup() {

  lcd.begin(16, 2);
  // Initialisation de la bibliothèque VirtualWire
  // Vous pouvez changez les broches RX/TX/PTT avant vw_setup() si nécessaire
  vw_set_rx_pin(12);
  vw_setup(2000);

  vw_rx_start(); // On peut maintenant recevoir des messages
  lcd.print("couco");

}

void loop() {
  SMesures mesures;

  uint8_t sz=sizeof mesures;
  vw_wait_rx();
  if (vw_get_message((uint8_t *) &mesures, &sz)) // on recoie les mesures
  {
    lcd.setCursor(0, 0);
    lcd.print(mesures.temp);
    lcd.write(" C");

    lcd.setCursor(0, 1);
    lcd.print(mesures.hum);
    lcd.write(" %");
  }
}

merci beaucoup pour toute vaut solution sa vas beaucoup m'aidé .