Communication serie entre Arduino MEGA et ESP32

Bien le bonsoir.

J'ai écrit un code pour faire la communication série entre un arduino MEGA 2560 et un ESP32.

je souhaite envoyer des variables ( 2 variables dans un premier temps) de l'ESP32 vers arduino MEGA.

Les variables envoyées sont : WIFI.localIP et state_Alarme.

Lorsque je relis les 2 cartes ensemble, sur le moniteur serie de l'Arduino Mega, je peux voir que les données ( 2 variables ) n'arrivent pas correctement sur la carte Arduino MEGA.

Pour le câblage j'ai fait :

RX2 arduino ===> TX2 ESP32
TX2 arduino ===> RX2 ESP32

SVP quelqu'un peut-il m'aider à comprendre pourquoi les données envoyées ne sont pas reçu correctement ?

Voici le code de l'ESP32 :

#include <Arduino.h>
#include <ESPAsyncWebServer.h>
#include <SPIFFS.h>
#include <Key.h>
#include <Keypad.h>



const char *ssid = "galaxynoutsa";
const char *password = "hqwd2630";


/*-----------------------------déclaration des variables de gestion du clavier-------------------------------*/
    const int ROW_NUM = 4; //four rows
    const int COLUMN_NUM = 4; //four columns
    
    char keys[ROW_NUM][COLUMN_NUM] = {
    
    {'1','2','3', 'A'},
    
    {'4','5','6', 'B'},
    
    {'7','8','9', 'C'},
    
    {'*','0','#', 'D'}
    
    };
        
    byte pin_rows[ROW_NUM] = {33, 25, 26, 27}; //broche a configure uniquement en entree
    byte pin_column[COLUMN_NUM] = {19, 5, 14, 22}; //connect to the column pinouts of the keypad{34, 36, 38, 40}{48, 46, 44, 42}
    Keypad clavier = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
/*-----------------------------déclaration des variables de gestion du clavier-------------------------------*/





/*--------------------------------------------------declaration des des variables pour la gestion de l'éclairage-------------------------*/
 //------------variables pour emissiom/reception des données
String Donnee_envoi ="";
String Donnee_recu ="";
String Adresse_IP = "";
bool Fin_reception = false; 
 
 int state_Mode = 0 ;

/*--------------------------------------declaration des Pins des lampes----------------*/
    int lampeSalon = 13;
    int lampeChambre = 32;
    int lampeCuisine = 2;
    int lampeGarage = 4;
    int lampeDouche = 21;

    int priseSalon = 23; // à rectifier
    int priseCuisine = 18; // à rectifier  
/*--------------------------------------declaration des Pins des lampes------------------*/
/*-------------------variables pour gérer le les capteurs sur la pge web-----------------*/
String temp_valeur;
String hum_valeur;
String gaz_status = "0";
String intru_status = "0" ;
String flamme_status = "0" ;
/*-------------------variables pour gérer le les capteurs sur la pge web-----------------*/

//------------variables des switch/case de la fonction éclairage
int sal = 0 ;
int cha = 0 ;
int cui = 0 ;
int gar = 0 ;
int dou = 0 ;
//------------variables du switch/case de la fonction éclairage

//------------variables de gestion des états des lampes
int state_Salon = 0 ;
int state_Chambre = 0 ;
int state_Cuisine = 0 ;
int state_Garage = 0 ;
int state_Douche = 0 ;
//------------variables de gestion des états des lampes

//------------------------variables de gestion de l'alarme
unsigned long temps_A ;
unsigned long temps_B ;
int alarme = 0 ;     // activer/désactiver l'alarme
int state_Alarme = 0 ;
//------------------------variables de gestion de l'alarme 
//---------------variables de gestion des prises de courant
int prise_sal = 0;
int prise_cui = 0;
int state_Prise_Salon = 0;
int state_Prise_Cuisine = 0;
//---------------variables de gestion des prises de courant

//------------variables de gestion du clavier
    bool touche_0  = false;
    bool touche_1  = false;
    bool touche_2  = false;
    bool touche_3  = false;
    bool touche_4  = false;
    bool touche_5  = false;
    bool touche_6  = false;
    bool touche_7  = false;
    bool touche_8  = false;
    bool touche_9  = false;
    bool touche_A  = false;
    bool touche_B  = false;
    bool touche_C  = false;
    bool touche_D  = false;
    bool touche_x  = false;
    bool touche_dieze  = false;
//------------variables de gestion du clavier
/*--------------------------------------------------declaration des des variables pour la gestion de l'éclairage-------------------------*/

/*----------------------------------------Déclaration des fonctions---------------------------------------------*/
   void eclairage_et_prise (); // fontion de gestion de l'éclairage
   void gestion_clavier(); // fonction de gestion du clavier
   void desactivation_touche(); // fonction de désactivation des touches
   void Emission();
   //String Traitement(String donnee, int index);
   void Reception();
/*----------------------------------------Déclaration des fonctions---------------------------------------------*/



AsyncWebServer server(80);



void setup()
{
  //----------------------------------------------------Serial
  Serial.begin(115200);
  Serial2.begin(115200);
  //Serial.println("\n");


/*--------------------------------------configuration des Pins en entrée/sortie--------------------------------------*/
 pinMode(lampeSalon, OUTPUT);
 pinMode(lampeChambre, OUTPUT);
 pinMode(lampeCuisine, OUTPUT);
 pinMode(lampeGarage, OUTPUT);
 pinMode(lampeDouche, OUTPUT);
 pinMode(priseSalon, OUTPUT);
 pinMode(priseCuisine, OUTPUT);
 /*--------------------------------------configuration des Pins en entrée/sortie--------------------------------------*/
 
 
  //----------------------------------------------------SPIFFS
  if(!SPIFFS.begin())
  {
    Serial.println("Erreur SPIFFS...");
    return;
  }

  File root = SPIFFS.open("/");
  File file = root.openNextFile();

  while(file)
  {
    Serial.print("File: ");
    Serial.println(file.name());
    file.close();
    file = root.openNextFile();
  }

  //----------------------------------------------------WIFI
  WiFi.begin(ssid, password);
  Serial.print("Tentative de connexion...");
  
  while(WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(100);
  }
  
  Serial.println("\n");
  Serial.println("Connexion etablie!");
  Serial.print("Adresse IP: ");
  Serial.println(WiFi.localIP());
  

  //----------------------------------------------------SERVER
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    request->send(SPIFFS, "/index.html", "text/html");
  });

  server.on("/w3.css", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    request->send(SPIFFS, "/w3.css", "text/css");
  });

  server.on("/script.js", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    request->send(SPIFFS, "/script.js", "text/javascript");
  });



/*-----------------------------gestion du Mode de fonctionnement---------------------------------------------*/
  server.on("/manuel", HTTP_GET, [](AsyncWebServerRequest *request)
  {

      // je dois coder l'action à executer dans cette fonction
      state_Mode = 1 ;
    request->send(200);
  });
  server.on("/voyage", HTTP_GET, [](AsyncWebServerRequest *request)
  {
      
      // je dois coder l'action à executer dans cette fonction
      state_Mode = 2 ;
    request->send(200);
  });

  server.on("/etatMode", HTTP_GET, [](AsyncWebServerRequest *request)
    {
          if (state_Mode == 1){
            String text = "Manuel";
            request->send(200, "text/plain", text);
          }
          else{
            String text = "Voyage";
            request->send(200, "text/plain", text);
          }
    });
/*-----------------------------gestion du Mode de fonctionnement---------------------------------------------*/

/*-----------------------------récupération des requettes et gestion de l'éclairage intérieur---------------------------------------------*/
 //-----------------------------------------------------------------globale
  server.on("/onTout", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    sal = 1 ;
    cha = 1 ;
    cui = 1 ;
    gar = 1 ;
    dou = 1 ;
    request->send(200);
  });
  server.on("/offTout", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    sal = 2 ;
    cha = 2 ;
    cui = 2 ;
    gar = 2 ;
    dou = 2 ;
    request->send(200);
  });
  //-----------------------------------------------------------------Salon
  server.on("/on1", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    sal = 1 ;
    request->send(200);
  });
  server.on("/off1", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    sal = 2 ;
    request->send(200);
  });

  //-----------------------------------------------------------------chambre
  server.on("/on2", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    cha = 1 ;
    request->send(200);
  });
  server.on("/off2", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    cha = 2 ;
    request->send(200);
  });

  //-----------------------------------------------------------------Scuisine
  server.on("/on3", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    cui = 1 ;
    request->send(200);
  });
  server.on("/off3", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    cui = 2 ;
    request->send(200);
  });

  //-----------------------------------------------------------------garage
  server.on("/on4", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    gar = 1 ;
    request->send(200);
  });
  server.on("/off4", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    gar = 2 ;
    request->send(200);
  });

  //-----------------------------------------------------------------douche
  server.on("/on5", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    dou = 1 ;
    request->send(200);
  });
  server.on("/off5", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    dou = 2 ;
    request->send(200);
  });

/*-----------------------------récupération des requettes et gestion de l'éclairage intérieur---------------------------------------------*/

/*-------------------------------------------------Gestion des états des lampes-----------------------------------------------*/
server.on("/etatSalon", HTTP_GET, [](AsyncWebServerRequest *request)
    {
          if (state_Salon == 1){
            String text = "Allumée";
            request->send(200, "text/plain", text);
          }
          else{
            String text = "Eteinte";
            request->send(200, "text/plain", text);
          }
    });

server.on("/etatChambre", HTTP_GET, [](AsyncWebServerRequest *request)
    {
      if (state_Chambre == 1){
        String text = "Allumée";
        request->send(200, "text/plain", text);
      }
      else{
        String text = "Eteinte";
        request->send(200, "text/plain", text);
      }
    });

server.on("/etatCuisine", HTTP_GET, [](AsyncWebServerRequest *request)
    {
      if (state_Cuisine == 1){
        String text = "Allumée";
        request->send(200, "text/plain", text);
      }
      else{
        String text = "Eteinte";
        request->send(200, "text/plain", text);
      }
    });

server.on("/etatGarage", HTTP_GET, [](AsyncWebServerRequest *request)
    {
      if (state_Garage == 1){
        String text = "Allumée";
        request->send(200, "text/plain", text);
      }
      else{
        String text = "Eteinte";
        request->send(200, "text/plain", text);
      }
    });

server.on("/etatDouche", HTTP_GET, [](AsyncWebServerRequest *request)
    {
      if (state_Douche == 1){
        String text = "Allumée";
        request->send(200, "text/plain", text);
      }
      else{
        String text = "Eteinte";
        request->send(200, "text/plain", text);
      }
    });

/*-------------------------------------------------Gestion des états des lampes-----------------------------------------------*/


/*-----------------------------récupération et affichage des valeurs de température, humidité, gaz et flamme---------------*/
 
 //----------------------------------------------------------------------------temperature
  server.on("/valeurTemperature", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    String tempe = temp_valeur;
    request->send(200, "text/plain", tempe);
  });

 //-------------------------------------------------------------------------------humidite
  server.on("/valeurHumidite", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    String humidite = hum_valeur;
    request->send(200, "text/plain", humidite);
  });

 //------------------------------------------------------------------------------------gaz
  server.on("/valeurGaz", HTTP_GET, [](AsyncWebServerRequest *request)
  { 
    if ( gaz_status == "1" ){    
          String text = "<i class='w3-red'>Fuite de gaz !</i>";
          request->send(200, "text/plain", text);
        } 
    else {
         String text = "<i class='w3-teal'>Normale</i>";
         request->send(200, "text/plain", text);
         } 
  });

  //--------------------------------------------------------------------------------flamme
  server.on("/flamme", HTTP_GET, [](AsyncWebServerRequest *request)
  { 
      if ( flamme_status == "1"){    
             String text = "<i class='w3-red'>Attention Incendie !</i>";
             request->send(200, "text/plain", text);
           }
      else {
             String text = "<i class='w3-teal'>Normale</i>";
             request->send(200, "text/plain", text);
           }
  });
     
/*-----------------------------récupération et affichage des valeurs de température, humidité, gaz et flamme---------------*/

/*-----------------------------gestion de l'alarme, Activation/désactivation -----------------------------------*/
//-----------------------------------------------------------------activer/désactiver
  server.on("/onAlarme", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    state_Alarme = 1 ;
    request->send(200);
  });
  server.on("/offAlarme", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    state_Alarme = 0 ;
    request->send(200);
  });

server.on("/etatAlarme", HTTP_GET, [](AsyncWebServerRequest *request)
    {
      if (state_Alarme == 1){
        String text = "Activée";
        request->send(200, "text/plain", text);
      }
      else{
        String text = "Désactivée";
        request->send(200, "text/plain", text);
      }
    });
//-----------------------------------------------------------------------------intrusion  
  server.on("/intrusion1", HTTP_GET, [](AsyncWebServerRequest *request)
       {
         if ( intru_status == "1" ){
               String text = "<i class='w3-red'>Intrusion !</i>";
               request->send(200, "text/plain", text);
             }
         else {
               String text = "<i class='w3-teal'>Normale !</i>";
               request->send(200, "text/plain", text);
             }    
       }); 
/*-----------------------------Activation/désactivation de l'alarme-----------------------------------*/


/*-----------------------------gestion des prises de courant-----------------------------------*/

//--------------------------------------------------------------------prise du salon
  server.on("/onSalon", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    prise_sal = 1 ;
    request->send(200);
  });
  server.on("/offSalon", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    prise_sal = 2 ;
    request->send(200);
  });
  server.on("/etatPriseSalon", HTTP_GET, [](AsyncWebServerRequest *request)
    {
      if (state_Prise_Salon == 1){
        String text = "Allumée";
        request->send(200, "text/plain", text);
      }
      else{
        String text = "Eteinte";
        request->send(200, "text/plain", text);
      }
    });
    
//-----------------------------------------------------------------prise de la cuisine
  server.on("/onCuisine", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    prise_cui = 1 ;
    request->send(200);
  });
  server.on("/offCuisine", HTTP_GET, [](AsyncWebServerRequest *request)
  {
    prise_cui = 2 ;
    request->send(200);
  });
  server.on("/etatPriseCuisine", HTTP_GET, [](AsyncWebServerRequest *request)
    {
      if (state_Prise_Cuisine == 1){
        String text = "Allumée";
        request->send(200, "text/plain", text);
      }
      else{
        String text = "Eteinte";
        request->send(200, "text/plain", text);
      }
    });
/*-----------------------------gestion des prises de courant-----------------------------------*/


  server.begin();
  Serial.println("Serveur actif!");


}






void loop()
{
//Reception();
gestion_clavier();
Emission(); 
eclairage_et_prise() ;
}


/*----------------------------------fonction de reccupération des touches enfoncées du clavier-------------------------------------*/
void gestion_clavier(){

    char code = clavier.getKey();
    /*if(code)
    {
      Serial.println(code);
     Serial.print("etoile : ");
      Serial.println(touche_x);
      Serial.print("dieze : ");
      Serial.println(touche_dieze);
    }*/
    
   if (code != NO_KEY){

             switch (code){

              case '*' :               
                desactivation_touche();
                touche_x = true;
              break;

              case '#' :
                desactivation_touche();
                touche_dieze = true;
              break;

              case '1' :
               if(touche_x == true){sal = 1 ; }
               else if(touche_dieze == true){sal = 2; }
               desactivation_touche();
              break;
              
              case '2' :
               if(touche_x == true){cha = 1 ;  }
               else if(touche_dieze == true){cha = 2; }              
               desactivation_touche();
              break;
              
              case '3' :
               if(touche_x == true){cui = 1 ; }
               else if(touche_dieze == true){cui = 2; }              
               desactivation_touche();
              break;
               
              case '4' :
               if(touche_x == true){gar = 1 ; }
               else if(touche_dieze == true){gar = 2; }
               desactivation_touche();              
              break;
              
              case '5' :
               if(touche_x == true){dou = 1 ;  }
               else if(touche_dieze == true){dou = 2;  }
               desactivation_touche();
              break;

              case '6' :
               if(touche_x == true){prise_sal = 1 ;  }
               else if(touche_dieze == true){prise_sal = 2; }
               desactivation_touche();
              break;

              case '7' :
               if(touche_x == true){prise_cui = 1 ;  }
               else if(touche_dieze == true){prise_cui = 2; }
               desactivation_touche();
              break;

              case 'A' :
                desactivation_touche();
                touche_A = true;
                temps_A = millis();               
              break;

              case 'B' :
                if(touche_A == true && millis() - temps_A <= 2000 ){ state_Alarme = 1; }
                desactivation_touche();
              break;

              case 'C' :     
                desactivation_touche();
                touche_C = true;
                temps_B = millis();                                             
              break;
    
              case 'D' :
                if(touche_C == true && millis() - temps_B <= 2000 ){ state_Alarme = 0; }
                desactivation_touche();
              break;                         
        }
  
       }     
      }
/*----------------------------------fonction  de reccupération des touches enfoncées du clavier-------------------------------------*/


/*-----------------------------fonction gestion de l'éclairage à partir des requetes obtenues précédemment--------------------*/
void eclairage_et_prise (){

          switch (sal){
            
            case 1 :
              digitalWrite(lampeSalon, HIGH);
              state_Salon = 1 ;
              sal = 0 ;
            break;

            case 2 :
              digitalWrite(lampeSalon, LOW); 
              state_Salon = 0 ;
              sal = 0 ;
            break;  
         }


          switch (cha){
            
            case 1 :
              digitalWrite(lampeChambre, HIGH);
              state_Chambre = 1 ;
              cha = 0 ;
            break;

            case 2 :
              digitalWrite(lampeChambre, LOW);
              state_Chambre = 0 ; 
              cha = 0 ;
            break;  
         }


          switch (cui){
            
            case 1 :
              digitalWrite(lampeCuisine, HIGH);
              state_Cuisine = 1 ; 
              cui = 0 ;
            break;

            case 2 :
              digitalWrite(lampeCuisine, LOW);
              state_Cuisine = 0 ; 
              cui = 0 ;
            break;  
         } 


          switch (gar){
            
            case 1 :
              digitalWrite(lampeGarage, HIGH);
              state_Garage = 1 ;
              gar = 0 ;
            break;

            case 2 :
              digitalWrite(lampeGarage, LOW);
              state_Garage = 0 ; 
              gar = 0 ;
            break;  
         } 


          switch (dou){
            
            case 1 :
              digitalWrite(lampeDouche, HIGH);
              state_Douche = 1 ;
              dou = 0 ;
            break;

            case 2 :
              digitalWrite(lampeDouche, LOW);
              state_Douche = 0 ;
              dou = 0 ;
            break;  
         }


          switch (prise_sal){
            
            case 1 :
              digitalWrite(priseSalon, HIGH);
              state_Prise_Salon = 1 ;
              prise_sal = 0 ;
            break;

            case 2 :
              digitalWrite(priseSalon, LOW);
              state_Prise_Salon = 0 ;
              prise_sal = 0 ;
            break;  
         }


          switch (prise_cui){
            
            case 1 :
              digitalWrite(priseCuisine, HIGH);
              state_Prise_Cuisine = 1 ;
              prise_cui = 0 ;
            break;

            case 2 :
              digitalWrite(priseCuisine, LOW);
              state_Prise_Cuisine = 0 ;
              prise_cui = 0 ;
            break;  
         }
}
/*-----------------fonction gestion de l'éclairage à partir des requetes obtenues précédemment--------------------*/


/*---------------------------------fonction d'émission et de reception des données---------------------------------*/
//------------------------------------fonction pour l'émission des données
void Emission(){
               
               //Donnee_envoi += char(WiFi.localIP());
               //Donnee_envoi += (String)state_Alarme + "," ;  
               //Serial.print("envoi:  ");                   
               Serial.print(WiFi.localIP());
               Serial2.print(WiFi.localIP());
               Serial.print(",");
               Serial2.print(",");
               Serial.print(state_Alarme);
               Serial2.print(state_Alarme);
               Serial.println(",");
               Serial2.println(",");
               
               //delay(100);
               //Donnee_envoi =""; 
                                     
}
//------------------------------------fonction pour la reception des données
void Reception(){     
  while (Serial2.available()) {
    // get the new byte:
    char inChar = (char)Serial2.read();
    // add it to the inputString:
    Donnee_recu += inChar;
    if (inChar == '\n') {
     Fin_reception = true;
     delay(10);
    }
  }
 if (Fin_reception == true)
 {
  temp_valeur = Traitement(Donnee_recu, 1);
 hum_valeur = Traitement(Donnee_recu, 2);
 gaz_status = Traitement(Donnee_recu, 3);
 intru_status = Traitement(Donnee_recu, 4);
 flamme_status = Traitement(Donnee_recu, 5);
 Fin_reception = false ;
 }
 /*Serial.print("temp_valeur");
 Serial.println(temp_valeur);
 Serial.print("hum_valeur");
 Serial.println(hum_valeur);*/
 }
//------------------------------------fonction pour le traitement des données
String Traitement(String donnee, int index)
{ 
 int stringData = 0; 
 String dataPart = "";
 for(int i = 0; i<donnee.length()-1; i++){ 
 if(donnee[i]==','){
 stringData++;}
 
 else if(stringData==index){
 dataPart.concat(donnee[i]);}
 
 else if(stringData>index){
 return dataPart;
 break;
 } 
 } return dataPart;
}
/*---------------------------------fonction d'émission et de reception des données---------------------------------*/


void desactivation_touche(){
  
 touche_0 = false;
 touche_1 = false;
 touche_2 = false;
 touche_3 = false;
 touche_4 = false;
 touche_5 = false;
 touche_6 = false;
 touche_7 = false;
 touche_8 = false;
 touche_9 = false;
 touche_A = false;
 touche_B = false;
 touche_C = false;
 touche_D = false;
 touche_x = false;
 touche_dieze = false;
  
  }

Voici le code de l'Arduino MEGA :


#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "DHT.h"

#define DHTPIN 2
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27



/*----------------------------------------declaration des PIN----------------------------------------*/
const int capteur_GAZ = A3; //capteur de GAZ
const int capteur_intru = 4; //capteur de presence
const int capteur_flamme = A7; //capteur de flamme
const int buzzer = 10 ; // module sonore
const int venti_clim = 22 ; //climatiseur
const int venti_evacuation = 9 ; // ventillateur évacuation des fuites de GAZ
const int ledR=12;
const int ledV=13;
/*----------------------------------------declaration des PIN----------------------------------------*/

/*----------------------------------------variables de gestion du systeme----------------------------*/
//------------variables de gestion DHT11
int temp_valeur;
int hum_valeur;
int temp_status = 0 ;
//------------variables de gestion capteur de GAZ
float gaz_valeur = 0.00;
int gaz_status = 0; 
unsigned long temps_gaz = millis();
//------------variables de gestion capteur d'intrusion
int intru_status = 0 ;
int intru_valeur= 0 ;
unsigned long temps_intru = millis();
//------------variables de gestion capteur de flamme
int flamme_valeur = 0 ;
int flamme_status = 0 ;
unsigned long temps_flamme = millis();
//------------variables pour emissiom/reception des données
String Donnee_envoi ="";
String Donnee_recu ="";
String Adresse_IP = "2.2.2.2";
String state_Alarme ="1";
bool Fin_reception = false ;

//------------variables de gestion de l'affichage
 bool aff_aucun = true;
 bool aff_gaz = true;
 bool aff_intru = true;
 bool aff_flamme = true;
 bool aff_gaz_intru = true;
 bool aff_gaz_flamme = true;
 bool aff_intru_flamme = true;
 bool aff_gaz_intru_flamme = true;

/*----------------------------------------variables de gestion du systeme----------------------------*/

/*----------------------------------------Déclaration des fonctions----------------------------------*/
void lire_DHT11();
void lire_gaz();
void lire_intru();
void lire_flamme();
void capteur_actif();
void capteur_inactif();
void affichage_lcd();
void activation_affichage();
void Emission();
//String Traitement(String donnee, int index);
void Reception();
/*----------------------------------------Déclaration des fonctions----------------------------------*/ 

void setup() {
//---------configuration des PINS en E/S
pinMode(capteur_GAZ,INPUT);
pinMode(capteur_intru,INPUT);
pinMode(capteur_flamme,INPUT);
pinMode(venti_evacuation,OUTPUT);
pinMode(venti_clim,OUTPUT);
pinMode(buzzer,OUTPUT);
pinMode(ledR,OUTPUT);
pinMode(ledV,OUTPUT);


//---------Initialisation de la communication serie
Serial.begin(115200);
Serial2.begin(115200);
dht.begin();


//---------Initialisation de l'afficheur LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
//--------- reception et traitement de l'adresse IP

}

void loop() {
  
 Reception();
 Donnee_recu = "";
 
 lire_DHT11();
 lire_gaz();
 lire_intru();
 lire_flamme();
 //Emission();
 affichage_lcd();
 
}


/*--------------------------fonction pour lire le capteur de temperature--------------------------*/
void lire_DHT11(){

   hum_valeur = dht.readHumidity();
   temp_valeur = dht.readTemperature();
   if ( temp_valeur > 27 ){
    //temp_status = 1; 
    digitalWrite(venti_clim, HIGH);
    //Serial.println("venti_clim HIGH");
    }
   else{
   // temp_status = 0;
    digitalWrite(venti_clim, LOW);
    //Serial.println("venti_clim LOW");
    }
  }
/*--------------------------fonction pour lire le capteur de temperature--------------------------*/

/*--------------------------fonction pour lire le capteur de gaz----------------------------------*/
void lire_gaz(){
  gaz_valeur = ((analogRead(capteur_GAZ)*5.00)/1023.00);
  if ( gaz_valeur > 1.00 ){ // on doit effectuer une conversion sur la variable 
    gaz_status = 1;         //'a' pour avoir la bonne valeur du taux de gaz en ppm
    temps_gaz = millis();
    digitalWrite(venti_evacuation,HIGH);
    capteur_actif();
    }
  else{
    gaz_status = 0;
    digitalWrite(venti_evacuation,LOW);
    }
  }
/*--------------------------fonction pour lire le capteur de gaz-----------------------------------*/

/*--------------------------fonction pour lire le capteur de d'intrusion---------------------------*/
void lire_intru(){

intru_valeur = digitalRead(capteur_intru);

      if ( intru_valeur == LOW && state_Alarme == "1" ){
        intru_status = 1; 
        capteur_actif();
        }
      else {
        intru_status = 0;
        }
      }
/*--------------------------fonction pour lire le capteur de d'intrusion---------------------------*/

/*--------------------------fonction pour lire le capteur de flamme--------------------------------*/
void lire_flamme(){
  
    flamme_valeur = analogRead(capteur_flamme);
      if ( flamme_valeur < 100 ){
        flamme_status = 1; 
        temps_flamme = millis();
        capteur_actif();       
        }
      else{
        flamme_status = 0;
        }
      }
/*--------------------------fonction pour lire le capteur de flamme--------------------------------*/
 
/*--------------------------fonctions gerer l'etat du buzzer et des LED de signalisation-----------*/
 void capteur_actif(){
      digitalWrite(ledR,HIGH);
      digitalWrite(ledV,LOW);
      tone(buzzer, 200, 700); // on doit améliorer le code du buzzer pour produire un bon son (sirène de police)
  }
  
void capteur_inactif(){
      digitalWrite(ledR,LOW);
      digitalWrite(ledV,HIGH);
      noTone(buzzer);
  }
/*--------------------------fonctions gerer l'etat du buzzer et des LED de signalisation-----------*/

/*---------------------------------fonction gerer l'afficheur LCD---------------------------------*/
void affichage_lcd(){
    
    if(gaz_status == 0 && intru_status == 0 && flamme_status == 0){ 
    capteur_inactif() ;
    activation_affichage();
      lcd.clear();       
      lcd.setCursor(3,0);
      lcd.print("temperature : ");
      lcd.setCursor(17,0);
      lcd.print(temp_valeur);
      lcd.setCursor(3,1);
      lcd.print("humidite : ");
      lcd.setCursor(14,1);
      lcd.print(hum_valeur);

    }
    else if(gaz_status == 1 && intru_status == 0 && flamme_status == 0 &&  aff_gaz == true){ 
    
      lcd.clear();       
      lcd.setCursor(3,0);
      lcd.print("Atention !");
      lcd.setCursor(2,1);
      lcd.print("!! Fuite de Gaz !!");
      activation_affichage();
      aff_gaz = false ; 
    }
    else if(gaz_status == 0 && intru_status == 1 && flamme_status == 0 && aff_intru == true){ 
    
      lcd.clear();       
      lcd.setCursor(3,0);
      lcd.print("Atention !");
      lcd.setCursor(3,1);
      lcd.print("!! Intrusion !!");
      activation_affichage();
      aff_intru = false ;  
    }
    else if(gaz_status == 0 && intru_status == 0 && flamme_status == 1 && aff_flamme == true){ 
    
      lcd.clear();       
      lcd.setCursor(3,0);
      lcd.print("Atention !");
      lcd.setCursor(3,1);
      lcd.print("!! Incendie !!");
      activation_affichage();
      aff_flamme = false ; 
    }

    else if(gaz_status == 1 && intru_status == 1 && flamme_status == 0 && aff_gaz_intru == true){ 
    
      lcd.clear();       
      lcd.setCursor(3,0);
      lcd.print("Atention !");
      lcd.setCursor(3,1);
      lcd.print("!! Fuite de Gaz !!");
      lcd.setCursor(3,2);
      lcd.print("!! Intrusion !!");
      activation_affichage();
      aff_gaz_intru = false ;  
    }
    
    else if(gaz_status == 1 && intru_status == 0 && flamme_status == 1 && aff_gaz_flamme == true){ 
    
      lcd.clear();       
      lcd.setCursor(3,0);
      lcd.print("Atention !");
      lcd.setCursor(3,1);
      lcd.print("!! Fuite de Gaz !!");
      activation_affichage();
      aff_gaz_flamme = false ;   
    }
    else if(gaz_status == 0 && intru_status == 1 && flamme_status == 1 && aff_intru_flamme == true){ 
    
      lcd.clear();       
      lcd.setCursor(3,0);
      lcd.print("Atention !");
      lcd.setCursor(3,1);
      lcd.print("!! Fuite de Gaz !!");
      activation_affichage();
      aff_intru_flamme = false ;   
    }
    else if(gaz_status == 1 && intru_status == 1 && flamme_status == 1 && aff_gaz_intru_flamme == true){ 
    
      lcd.clear();       
      lcd.setCursor(3,0);
      lcd.print("Atention !");
      lcd.setCursor(3,1);
      lcd.print("!! Fuite de Gaz !!");
      activation_affichage();
      aff_gaz_intru_flamme = false ;  
    }
    
  }
/*---------------------------------fonction gerer l'afficheur LCD---------------------------------*/


/*---------------------------------fonction d'émission et de reception des données---------------------------------*/
//------------------------------------fonction pour l'émission des données
void Emission(){
               Donnee_envoi +=','+(String)temp_valeur +',' ;  
               Donnee_envoi += (String)hum_valeur +',' ;   
               Donnee_envoi += (String)gaz_status +',' ;
               Donnee_envoi += (String)intru_status +',';
               Donnee_envoi += (String)flamme_status +',' ;
               //Serial.print("envoi: ");      
               //Serial.println(Donnee_envoi);
               //Serial1.println(Donnee_envoi);
                //delay(100);
                Donnee_envoi ="";                                        
}
//------------------------------------fonction pour la reception des données
void Reception(){     
  while (Serial2.available()) {
    // get the new byte:
    char inChar = (char)Serial2.read();
    // add it to the inputString:
    Donnee_recu += inChar;
    if (inChar == '\n') {
      Fin_reception = true;
     //delay(10);
    }
  }
 if (Fin_reception == true)
 {
 Adresse_IP = Traitement(Donnee_recu, 0);
 state_Alarme = Traitement(Donnee_recu, 1);
 Serial.print("Donnee_recu: ");
Serial.println(Donnee_recu);
 Serial.print("IP: ");
Serial.println(Adresse_IP);
Serial.print("Alarme: ");
Serial.println(state_Alarme);
 Fin_reception = false ;
 }
 
 
 }
//------------------------------------fonction pour le traitement des données
String Traitement(String donnee, int index)
{ 
 int stringData = 0; 
 String dataPart = "";
 for(int i = 0; i<donnee.length()-1; i++){ 
 if(donnee[i]==','){
 stringData++;}
 
 else if(stringData==index){
 dataPart.concat(donnee[i]);}
 
 else if(stringData>index){
 return dataPart;
 break;
 } 
 } return dataPart;
}
/*---------------------------------fonction d'émission et de reception des données---------------------------------*/

void activation_affichage(){
 aff_aucun = true;
 aff_gaz = true;
 aff_intru = true;
 aff_flamme = true;
 aff_gaz_intru = true;
 aff_gaz_flamme = true;
 aff_intru_flamme = true;
 aff_gaz_intru_flamme = true;
}

Voici une capture du moniteur série de l'Arduino MEGA :

Bonsoir fullproject

Pour te faciliter des transmissions de diverses variables par le port série, tu aurais avantage de les regrouper dans une structure, structure que tu peux envoyer et recevoir en une seule opération. J'avais fait un exemple ici.

Cordialement
jpbbricole

L’esp est en 3.3V et le MEGA zen 5V

Il faut au moins une adaptation de tension entre le Tx du Mega et le Rx de l’ESP

Il faut aussi relier les GND

Et bien sûr si vous utilisez le moniteur série il ne faut pas que ce soit aussi ce Serial qui soit connecté à l’ESP. Utilisez Serial2 par exemple.

Je ne comprend pas encore les structures.
Et je travaille sur un projet de domotique que je dois absolument terminer au plutard dans 2 semaines et je ne me sens pas capable d'étudier les structures jusqu'à les comprendre en ce laps de temps.

C'est pourquoi je serai très ravit que vous me proposiez une solution qui se rapproche de celle que j'ai utilisé dans mes codes.

J'ai déjà écrit les 2 programmes ( pours arduino MEGA et pour ESP32 ), à présent il faut juste que je réussisse à faire communiquer les 2 cartes ensemble pour qu'elles puissent s'envoyer les données entre elles.

Déjà merci pour votre réactivité.

Ça je le sais.

Là je crois que je vais faire un pont diviseur de tension entre la Tx2 du Mega et le Rx2 de l'ESP ( vue qu'elle sont reliées ensemble).

Oops, là par contre je ne l'avais pas vu venir.
J'ai souvent tendance à oublier de connecter les GND ensemble.

J'ai utilisé 2 Serials pour chaque carte :
Un Serial pour le moniteur série et l'autre Serial pour la transmission/ Réception des données.

En gros le Serial du moniteur série est différent du Serial de transmission ou de réception.

Ok avec le GND ça devrait aider

Bonjour fullproject

Voilà, je me suis amusé à l’exercice, avec une structure :

//------------------------------------ Données (data)
struct __attribute__((packed)) dataDef     // Structure des données
{
	uint8_t localAddress[4];     // IP locale
	uint8_t alarmState;     // Etat de l'alarme
};
dataDef data;     // Création de l'objet data

Attention que celles-ci soient identique des deux côtés. L’idéal est de mettre cette définition dans un seul fichier accessible par les 2 sketches. Si tu ne sais pas comment faire, dis-le moi.

La difficulté principale vient du fait que l’on a 2 machines d’architectures différentes et le compilateur ne s’occupe pas des variables de façon identiques. Ainsi je n’ai pas réussi de faire « passer » la variable de type IPAddress, j’ai dû mettre l’adresse IP en tableau (uint8_t localAddress[4];).
Tu peux ajouter des variables à la structure data en faisant attention d’utiliser le même type de déclaration comme uint8 ainsi on est sûre que cette variable fait 8 bits aux 2 bouts.
Pour exemple :

int esp32alarmState = 0;
Serial.println(sizeof(esp32alarmState));

Donne 4 du côté ESP32 et 2 du côté Mega

Le programme côté ESP32 :

/*
    Name:       Test_SerialESP32toMega.ino
    Created:	18.06.2023 11:54:48
    Author:     BUREAU\admin

	https://forum.arduino.cc/t/communication-serie-entre-arduino-mega-et-esp32/1139015
	https://forum.arduino.cc/t/probleme-denvoi-de-float-sous-forme-doctet/872978/76
*/
#include <WiFi.h>

char myWifiSsid[] = "jpbbricoleAp";      //SSID of your network
char myWifiPassword[] = "123-456-789-abc";      //SSID password

//------------------------------------ Données (data)
struct __attribute__((packed)) dataDef     // Structure des données
{
	uint8_t localAddress[4];     // IP locale
	uint8_t alarmState;     // Etat de l'alarme
};
dataDef data;     // Création de l'objet data

//------------------------------------- Tempo d'affichage/transmission des données
unsigned long displayTempo = 500;     // Toutes les 1/2 sec.
unsigned long displayMillis = millis();     // Display chrono

void setup()
{
	Serial.begin(115200);
	Serial2.begin(115200);

	WiFi.begin(myWifiSsid, myWifiPassword );
	Serial.print("Tentative de connexion...");
  
	while(WiFi.status() != WL_CONNECTED)
	{
		Serial.print(".");
		delay(100);
	}
  
	Serial.println("\n");
	Serial.println("Connexion etablie!");
	Serial.print("Adresse IP: ");
	Serial.println(WiFi.localIP());

  
	IPAddress tempIp = WiFi.localIP();     // ip temporaire
	for (byte b = 0; b < 4; b ++)     // Misde de l'adresse IP dans le tableau data.localAddress[n]
	{
		data.localAddress[b] = tempIp[b];
	}
	data.alarmState = 0;
}

void loop () 
{
	if (millis() - displayMillis >= displayTempo)     // Si temps d'afficher/envoyer
	{
		Serial2.write((byte *)&data, sizeof(data));     // Envoi de la structure data

		data.alarmState ++;     // Incrémentation de la variable data.alarmState pour faire bouger quelque chose

		displayMillis = millis();     // Redémarrer le chrono
	}
}

Le programme côté Mega :

/*
Name:       Test_SerialMegaFromEsp32.ino
Created:	18.06.2023
Author:     jpbbricole

https://forum.arduino.cc/t/communication-serie-entre-arduino-mega-et-esp32/1139015
https://forum.arduino.cc/t/probleme-denvoi-de-float-sous-forme-doctet/872978/76
*/
#include <WiFi.h>

//------------------------------------ Données (data)
struct __attribute__((packed)) dataDef     // Structure des données
{
	uint8_t localAddress[4];     // IP locale
	uint8_t alarmState;     // Etat de l'alarme
};
dataDef data;     // Création de l'objet data

boolean dataNew = false;

IPAddress esp32IpAddress;
int esp32alarmState = 0;

void setup()
{
	Serial.begin(115200);
	Serial2.begin(115200);
}

void loop ()
{
	if (Serial2.available())
	{
		Serial2.readBytes((byte*)&data, sizeof data);     // Lecture des données reçues (data)
		dataNew = true;
	}
	
	if (dataNew)
	{
		esp32IpAddress = data.localAddress;     // On mets le tableau data.localAddress dans une variable de type IPAddress
		esp32alarmState = data.alarmState;

		Serial.print(esp32IpAddress); Serial.print("\t");
		Serial.println(esp32alarmState);
		
		dataNew = false;
	}
}

Le câblage est, la patte 17 (Tx2) de l’ESP32 et connecté à la patte 17 (Rx2) du Mega.

A ta disposition pour toutes questions.

A+
Cordialement
Jpbbricole

1 Like

L’ennui avec ce genre d’envoi c’est que si le récepteur est démarré (reboot) pendant une émission il n’y a aucun moyen de se synchroniser. Un protocole binaire inclura généralement un marqueur de début de communication et un code de contrôle qui permet de vérifier la validité de ce que l’on a reçu

Sinon c’est pas mal de rajouter aussi attribute packed à la définition de la structure pour avoir un bon niveau de confiance sur le fait que la structure est traitée de la même façon des deux côtés (sur une architecture 32 bits le compilateur pourrait décider de mettre des trous pour aligner sur 4 octets)

Bonsoir J-M-L

J'avais mis, mais ça n'avait aucun effet, je n'arrivais quand même pas à "passer" IPAddress.
Est ce que, en utilisant les déclarations dans le style uint8_t, uint16_t ..., on s'assure que le compilateur traitera ces valeurs de la même façon aux 2 bouts ?

Cordialement
jpbbricole

IPAddress est une classe, son implémentation peut être différente sur des architectures différentes (par exemple pour le support IPv6). Ce doit être le cas entre AVR et ESP32. L’attribut packed ne peut pas résoudre cela.

Bonsoir @jpbbricole.

J'ai lu l'exemple que vous avez envoyé et je commence à comprendre même si je ne comprends pas très la syntaxe.

De mon côté j'ai bossé entre temps et j'ai pu écrire des programmes qui font l'envoi et la réception des données entre L'ESP32 et l'Arduino MEGA.

J'ai réalisé un pont diviseur sur la broche Tx1 de l'Arduino MEGA ( mais mon problème n'était pas dû à l'absence du pont diviseur)

Voici le code du côté Arduino MEGA :


#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "DHT.h"

#define DHTPIN 2
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27



/*----------------------------------------declaration des PIN----------------------------------------*/
const int capteur_GAZ = A3; //capteur de GAZ
const int capteur_intru = 4; //capteur de presence
const int capteur_mouvement = 7 ; //capteur de mouvement
const int capteur_flamme = A7; //capteur de flamme
const int buzzer = 10 ; // module sonore
const int venti_clim = 22 ; //climatiseur
const int venti_evacuation = 9 ; // ventillateur évacuation des fuites de GAZ
const int ledR=12;
const int ledV=13;
/*----------------------------------------declaration des PIN----------------------------------------*/

/*----------------------------------------variables de gestion du systeme----------------------------*/
//------------variables de gestion DHT11
int temp_valeur;
int hum_valeur;
int temp_status = 0 ;
//------------variables de gestion capteur de GAZ
float gaz_valeur = 0.00;
int gaz_status = 0; 
unsigned long temps_gaz = millis();
//------------variables de gestion capteur d'intrusion
int intru_status = 0 ;
int intru_valeur = 0 ;
int mouvement_valeur = 0 ;
unsigned long temps_intru = millis();
//------------variables de gestion capteur de flamme
int flamme_valeur = 0 ;
int flamme_status = 0 ;
unsigned long temps_flamme = millis();
//------------variables pour emissiom/reception des données
String Donnee_envoi ="";
String Donnee_recu ="";
String Adresse_IP = "";
String state_Alarme ="1";
bool Fin_reception = false ;



/*----------------------------------------variables de gestion du systeme----------------------------*/

/*----------------------------------------Déclaration des fonctions----------------------------------*/
void lire_DHT11();
void lire_gaz();
void lire_intru();
void lire_flamme();
void capteur_actif();
void capteur_inactif();
void Emission();
//String Traitement(String donnee, int index);
void Reception();
/*----------------------------------------Déclaration des fonctions----------------------------------*/ 

void setup() {
//---------configuration des PINS en E/S
pinMode(capteur_GAZ,INPUT);
pinMode(capteur_intru,INPUT);
pinMode(capteur_mouvement,INPUT);
pinMode(capteur_flamme,INPUT);
pinMode(venti_evacuation,OUTPUT);
pinMode(venti_clim,OUTPUT);
pinMode(buzzer,OUTPUT);
pinMode(ledR,OUTPUT);
pinMode(ledV,OUTPUT);



//---------Initialisation de la communication serie
Serial.begin(115200);
Serial1.begin(115200);

dht.begin();


//---------Initialisation de l'afficheur LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);

}

void loop() {
  
 Reception();
 
 lire_DHT11();
 lire_gaz();
 lire_intru();
 lire_flamme();
 
 Emission();
 
}


/*--------------------------fonction pour lire le capteur de temperature--------------------------*/
void lire_DHT11(){

   hum_valeur = dht.readHumidity();
   temp_valeur = dht.readTemperature();
   if ( temp_valeur > 27 ){   
    digitalWrite(venti_clim, HIGH);
    }
   else{ 
    digitalWrite(venti_clim, LOW);
    }
  }
/*--------------------------fonction pour lire le capteur de temperature--------------------------*/

/*--------------------------fonction pour lire le capteur de gaz----------------------------------*/
void lire_gaz(){
  gaz_valeur = ((analogRead(capteur_GAZ)*5.00)/1023.00);
  if ( gaz_valeur > 1.00 ){ 
    gaz_status = 1;         
    temps_gaz = millis();
    digitalWrite(venti_evacuation,HIGH);
    capteur_actif();
    }
  else{
    gaz_status = 0;
    digitalWrite(venti_evacuation,LOW);
    }
  }
/*--------------------------fonction pour lire le capteur de gaz-----------------------------------*/

/*--------------------------fonction pour lire le capteur de d'intrusion---------------------------*/
void lire_intru(){

intru_valeur = digitalRead(capteur_intru);
mouvement_valeur = digitalRead(capteur_mouvement);
      if ( (intru_valeur == LOW || mouvement_valeur == HIGH )&& state_Alarme == "1" ){
        intru_status = 1; 
        capteur_actif();
        }
      else {
        intru_status = 0;
        }
      }
/*--------------------------fonction pour lire le capteur de d'intrusion---------------------------*/

/*--------------------------fonction pour lire le capteur de flamme--------------------------------*/
void lire_flamme(){
  
    flamme_valeur = analogRead(capteur_flamme);
      if ( flamme_valeur < 100 ){
        flamme_status = 1; 
        temps_flamme = millis();
        capteur_actif();       
        }
      else{
        flamme_status = 0;
        }
      }
/*--------------------------fonction pour lire le capteur de flamme--------------------------------*/
 
/*--------------------------fonctions gerer l'etat du buzzer et des LED de signalisation-----------*/
 void capteur_actif(){
      digitalWrite(ledR,HIGH);
      digitalWrite(ledV,LOW);
      tone(buzzer, 200, 700);
  }
  
void capteur_inactif(){
      digitalWrite(ledR,LOW);
      digitalWrite(ledV,HIGH);
      noTone(buzzer);
  }
/*--------------------------fonctions gerer l'etat du buzzer et des LED de signalisation-----------*/



/*---------------------------------fonction d'émission et de reception des données---------------------------------*/
//------------------------------------fonction pour l'émission des données
void Emission(){
               Donnee_envoi +=','+(String)temp_valeur +',' ;  
               Donnee_envoi += (String)hum_valeur +',' ;   
               Donnee_envoi += (String)gaz_status +',' ;
               Donnee_envoi += (String)intru_status +',';
               Donnee_envoi += (String)flamme_status +',' ;
               Serial.print("envoiMEGA: ");      
               Serial.println(Donnee_envoi);
               Serial1.println(Donnee_envoi);
                delay(50); 
                Donnee_envoi ="";                                        
}
//------------------------------------fonction pour la reception des données
void Reception(){     
  while (Serial1.available()) {
    // get the new byte:
    char inChar = (char)Serial1.read();
    // add it to the inputString:
    Donnee_recu += inChar;
    if (inChar == '\n') {
      Fin_reception = true;
    }
  }
 if (Fin_reception == true)
 {
 Donnee_recu.trim();
 Adresse_IP = Traitement(Donnee_recu, 0);
 state_Alarme = Traitement(Donnee_recu, 1);
Serial.print("recuESP: ");
Serial.println(Donnee_recu);
Serial.print("IP: ");
Serial.println(Adresse_IP);
Serial.print("Alarme: ");
Serial.println(state_Alarme);
Donnee_recu = "";
 Fin_reception = false ;
 }
 
 
 }
//------------------------------------fonction pour le traitement des données
String Traitement(String donnee, int index)
{ 
 int stringData = 0; 
 String dataPart = "";
 for(int i = 0; i<donnee.length()-1; i++){ 
 if(donnee[i]==','){
 stringData++;}
 
 else if(stringData==index){
 dataPart.concat(donnee[i]);}
 
 else if(stringData>index){
 return dataPart;
 break;
 } 
 } return dataPart;
}
/*---------------------------------fonction d'émission et de reception des données---------------------------------*/

Voici le code côté ESP32 :

#include <Arduino.h>
#include <ESPAsyncWebServer.h>
#include <SPIFFS.h>
#include <Key.h>
#include <Keypad.h>



const char *ssid = "galaxy";
const char *password = "fgde2358";



/*--------------------------------------------------declaration des des variables pour la gestion de l'éclairage-------------------------*/
 //------------variables pour emissiom/reception des données
String Donnee_envoi ="";
String Donnee_recu ="";
String Adresse_IP = "";
bool Fin_reception = false; 
 

/*-------------------variables pour gérer le les capteurs sur la pge web-----------------*/
String temp_valeur;
String hum_valeur;
String gaz_status = "0";
String intru_status = "0" ;
String flamme_status = "0" ;
/*-------------------variables pour gérer le les capteurs sur la pge web-----------------*/

//------------------------variables de gestion de l'alarme
unsigned long temps_A ;
unsigned long temps_B ;
int alarme = 0 ;     // activer/désactiver l'alarme
int state_Alarme = 0 ;
//------------------------variables de gestion de l'alarme 


/*--------------------------------------------------declaration des des variables pour la gestion de l'éclairage-------------------------*/

/*----------------------------------------Déclaration des fonctions---------------------------------------------*/
   void Emission();
   //String Traitement(String donnee, int index);
   void Reception();
/*----------------------------------------Déclaration des fonctions---------------------------------------------*/



AsyncWebServer server(80);



void setup()
{
  //----------------------------------------------------Serial
  Serial.begin(115200);
  Serial2.begin(115200);


/*--------------------------------------configuration des Pins en entrée/sortie--------------------------------------*/
 pinMode(lampeSalon, OUTPUT);
 pinMode(lampeChambre, OUTPUT);
 pinMode(lampeCuisine, OUTPUT);
 pinMode(lampeGarage, OUTPUT);
 pinMode(lampeDouche, OUTPUT);
 pinMode(priseSalon, OUTPUT);
 pinMode(priseCuisine, OUTPUT);
 /*--------------------------------------configuration des Pins en entrée/sortie--------------------------------------*/
 
  //----------------------------------------------------WIFI
  WiFi.begin(ssid, password);
  Serial.print("Tentative de connexion...");
  
  while(WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(100);
  }
  
  Serial.println("\n");
  Serial.println("Connexion etablie!");
  Serial.print("Adresse IP: ");
  Serial.println(WiFi.localIP());
}


void loop()
{
Reception();
Emission(); 
delay(50);

}


/*---------------------------------fonction d'émission et de reception des données---------------------------------*/
//------------------------------------fonction pour l'émission des données
void Emission(){
               
               //Donnee_envoi += char(WiFi.localIP());
               //Donnee_envoi += (String)state_Alarme + "," ;  
               Serial.print("envoiESP:  ");                   
               Serial.print(WiFi.localIP());
               Serial2.print(WiFi.localIP());
               Serial.print(",");
               Serial2.print(",");
               Serial.print(state_Alarme);
               Serial2.print(state_Alarme);
               Serial.println(",");
               Serial2.println(",");
                              
}
//------------------------------------fonction pour la reception des données
void Reception(){     
  while (Serial2.available()) {
    // get the new byte:
    char inChar = (char)Serial2.read();
    // add it to the inputString:
    Donnee_recu += inChar;
    if (inChar == '\n') {
     Fin_reception = true;
     delay(10);
    }
  }
 if (Fin_reception == true)
 {
 Donnee_recu.trim();
 temp_valeur = Traitement(Donnee_recu, 1);
 hum_valeur = Traitement(Donnee_recu, 2);
 gaz_status = Traitement(Donnee_recu, 3);
 intru_status = Traitement(Donnee_recu, 4);
 flamme_status = Traitement(Donnee_recu, 5);

 Serial.print("recuMEGA: ");
 Serial.println(Donnee_recu);
 Serial.print("temp_valeur: ");
 Serial.println(temp_valeur);
 Serial.print("hum_valeur: ");
 Serial.println(hum_valeur);
 Serial.print("gaz_status: ");
 Serial.println(gaz_status);
 Serial.print("intru_status: ");
 Serial.println(intru_status);
 Serial.print("flamme_status: ");
 Serial.println(flamme_status);
 Donnee_recu ="";
 Fin_reception = false ;
 }
 
 
 }
//------------------------------------fonction pour le traitement des données
String Traitement(String donnee, int index)
{ 
 int stringData = 0; 
 String dataPart = "";
 for(int i = 0; i<donnee.length()-1; i++){ 
 if(donnee[i]==','){
 stringData++;}
 
 else if(stringData==index){
 dataPart.concat(donnee[i]);}
 
 else if(stringData>index){
 return dataPart;
 break;
 } 
 } return dataPart;
}
/*---------------------------------fonction d'émission et de reception des données---------------------------------*/

J'ai pu faire l'envoi et la réception des données sur ces deux cartes.

Les 2 cartes se synchronisent toutes seules.

Pour l'instant (et pour ce projet ) je préfère utiliser une approche différentes des structures car je ne comprends pas encore les structures ( en tout cas pas assez ).

Merci à vous pour le temps que vous prenez à me proposer des solutions à mon problème.

Bonjour fullproject

L'essentiel est que ça fonctionne et, surtout, que l'on comprenne pourquoi :wink:

Bonne continuation.
Cordialement
jpbbricole

1 Like

Comme @jpbbricole si cela fonctionne et que tu comprends ce que tu fais c'est bien le principal :slight_smile:

Une structure est un peu comme une chaine contenant des valeurs séparé par un caractère spécifique(ex ,).
Sauf qu'il n'y a pas de caractère de séparation, car la séparation est faite par la définition de la structure. Ce qui fait que tout les éléments sont définis et de taille fixe.
De toutes façon même si personnellement j'aime bien l'utilisation de structure pour faire dialoguer deux machines, son utilité est à étudier au cas par cas :slight_smile:

Bonjourterwal

L'usage de structures pour communiquer des données complexes comme, aussi, pour les sauver en EEPROM est super pratique. Mais, pour moi, l'essentiel de l'usage de structures est surtout à l'écriture du programme, surtout quand on doit faire fonctionner des objets comme des moteurs, servo etc, qui nécessitent de nombreux paramètres. La création d'une structure qui réunit toutes les variables propres à cet objet, facilite grandement l'écriture, surtout avec l'autocomplétions.

Cordialement
jpbbricole

Bonjour @jpbbricole
Oui son usage ne se limite pas au dialogue inter-processus, mais comme c'était le cas ici, j'y ais fait référence.

Après je ne suis pas sûre que ça facilite tant que ça, même si je les utilises de la même façon que toi et encore si je n'ai pas à les envoyer, je préfère utiliser un objet, si la place n'est pas un soucis.
Cela permet surtout de structurer l'image mental que tu te fait des données que tu manipule.

Il n’y a qu’une infime différence entre classe et structure.

Les ennuis principaux de la communication en binaire restent liés au besoin de synchronisation entre les deux processus (formalisation de la trame pour la détection du début) et la compatibilité de la représentation binaire entre les deux machines.

L’avantage c’est que c’est efficace.

Et encore c'est relatif, car si il y a beaucoup de chaine à faire passer, l'efficacité en terme d'occupation mémoire est très faible, par rapport au format texte.
Bien que l'on puisse toujours utiliser des structures "dynamique"(sans fin)

Bonjour jpbbricole

Qu'est l'autocompletion?
Y-a-t-il un truc pareil dans les IDE Arduino?

(ce n'est pas tout à fait une question rhétorique : sur Arduino IDE 1.18.x pour ARM -RPi-, je n'ai rien vu de tel. et je suis sûr, quoique ce soit un peu hors sujet, que ça interesse pas mal de gens)

Oui, c’est rarement le cas quand même pour la communication entre deux machines, sauf si bien sûr c’est pour transporter du texte. Et en ce cas (si c’est nécessaire) on peut utiliser des algos de compression qui fonctionnent très bien sur le texte.

En pratique quand on prend une approche objet, les différentes instances ont une méthode de sérialisation et de désérialisation ce qui permet d’organiser le transfert tout en respectant l’encapsuluation.

Oui on est tout à fait d'accord.
C'était plus pour mettre en perspective les façon de faire compliqués des plus expérimentés alors qu'une méthode simple peut aussi avoir quelques avantages.