IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Communication entre deux ESP32 (maitre-esclave) message reçu incorrect sur esclave [Arduino ESP32]


Sujet :

Arduino

  1. #1
    cal
    cal est déconnecté
    Membre habitué
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Par défaut Communication entre deux ESP32 (maitre-esclave) message reçu incorrect sur esclave
    Bonjour à tous,

    mon projet est de transmettre via ESPNOW la valeur d'un TAG RFID lue sur l'esp32 maitre vers l'esclave pour la traiter. La communication se fait bien, le maitre indique bien le bon UID du tag il l'envoie au maitre qui reçoit bien une information en provenance du maitre mais dans la console il affiche une valeur (deux chiffres) qui ne correspond pas à ce qui a (théoriquement) été envoyé. J'ai effectué des recherches mais sans succès. Quelqu'un a-t-il une idée ?

    code maitre (transmetteur)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    #include <SPI.h>
    #include <MFRC522.h>
    #include <esp_now.h>
    #include <WiFi.h>
    //on défini nos pin
    #define SS_PIN 5
    #define RST_PIN 22
    // definition des pin du RC522
    MFRC522 mfrc522(SS_PIN, RST_PIN); 
     
    // Stockage de l'adresse MAC du récepteur pour usage ultérieur. Remplacer les 'FF' par les valeur notées plus avant.
    uint8_t MAC_recepteur[] = {0xD8, 0xBC, 0x38, 0xE4, 0x3D, 0x09};
    String maValeurEnvoyee;
    char st[20];
    boolean mes_ok;
     
    // La fonction de rappel qui nous assurera de la bonne livraison du message
    void quand_donnees_Envoyees(const uint8_t *mac_addr, esp_now_send_status_t status) {
      Serial.print("\r\nDernier paquet envoyé:\t");
      Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Succès" : "Échec");
    }
     
    // Une variable qui servira à stocker les réglages concernant le récepteur
    esp_now_peer_info_t infosRecepteur;
     
     
     
     
     
    void setup() 
    {
     SPI.begin();
     mfrc522.PCD_Init();
     // On initialise la comm série à 115200 Bauds
      Serial.begin(115200);
     
      // On démarre le Wifi en mode Station
      WiFi.mode(WIFI_STA);
     
      // Puis on initialise ESP-NOW
      if (esp_now_init() != ESP_OK) {
        Serial.println("Erreur d'initialisation ESP-NOW");
        return;
      }
     
      // Si ESP-NOW a correctement démarré, il est temps d'enregistrer la fonction de rappel:
      esp_now_register_send_cb(quand_donnees_Envoyees);
     
      // Tout est prêt pour l'appairage avec notre récepteur:
      memcpy(infosRecepteur.peer_addr, MAC_recepteur, 6);
     
      // On définit un canal (0 utilisera automatiquement le même canal que celui utilisé par le wifi)
      infosRecepteur.channel = 0;  
     
      // On ne chiffre pas les échanges
      infosRecepteur.encrypt = false;
     
      // Appairage        
      if (esp_now_add_peer(&infosRecepteur) != ESP_OK){
        Serial.println("Échec de l'appairage");
        return;
      }
     
    }
     
    void loop() // le corps du programme
    {
      if ( ! mfrc522.PICC_IsNewCardPresent()) 
      {
        return;
      }
      if ( ! mfrc522.PICC_ReadCardSerial()) 
      {
        return;
      }
      Serial.print("UID de tag :");
      String content= "";
      byte letter;
      for (byte i = 0; i < mfrc522.uid.size; i++) 
      {
         Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
         Serial.print(mfrc522.uid.uidByte[i], HEX);
         content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
         content.concat(String(mfrc522.uid.uidByte[i], HEX));
      }
      Serial.println();
      Serial.print("Message : ");
     content.toUpperCase();
      Serial.println(content.substring(1));
      delay (3000);
     
      // On définit la valeur à envoyer avec la valeur du TAG RFID
     //modif
     // maValeurEnvoyee = content.substring(1);
    maValeurEnvoyee = " 1234";
     //fin de modif
      // On envoie le message
      esp_err_t resultat = esp_now_send(MAC_recepteur, (uint8_t *) &maValeurEnvoyee, sizeof(maValeurEnvoyee));
     
      if (resultat == ESP_OK) {
        Serial.println("Envoi OK");
      }
      else {
        Serial.println("Erreur envoi");
      }
     
    }
    Code esclave (récepteur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #include <esp_now.h>
    #include <WiFi.h>
     
    #define CHANNEL 1
     
    // Initialisation espnow
    void InitESPNow() {
      WiFi.disconnect();
      if (esp_now_init() == ESP_OK) {
        Serial.println("ESPNow Init Success");
      }
      else {
        Serial.println("ESPNow Init Failed");
        ESP.restart();
      }
    }
     
    // config AP SSID
    void configDeviceAP() {
      const char *SSID = "Slave_1";
      bool result = WiFi.softAP(SSID, "Slave_1_Password", CHANNEL, 0);
      if (!result) {
        Serial.println("AP Config failed.");
      } else {
        Serial.println("AP Config Success. Broadcasting with AP: " + String(SSID));
        Serial.print("AP CHANNEL "); Serial.println(WiFi.channel());
      }
    }
     
    void setup() {
      Serial.begin(115200);
      Serial.println("ESPNow/Basic/Slave Example");
      //Définition en mode AP
      WiFi.mode(WIFI_AP);
      // configuration en mode AP
      configDeviceAP();
      // Impression de l'@MAC en mode AP
      Serial.print("AP MAC: "); Serial.println(WiFi.softAPmacAddress());
      // Re init espnow
      InitESPNow();
      // Enregistrement pour le CB
      esp_now_register_recv_cb(OnDataRecv);
    }
     
    // CallBack quand des donnée sont reçues du maitre
    void OnDataRecv(const uint8_t *mac_addr, const uint8_t *data, int data_len) {
    //void OnDataRecv(const uint8_t *mac_addr, const uint8_t *donnees, int data_len) {  
      char macStr[18];
     
     
      snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
               mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
     
      Serial.print("Last Packet Recv from: "); Serial.println(macStr);
     
      Serial.print("Last Packet Recv Data: "); Serial.println(*data);
      Serial.println("");
    }
     
    void loop() {
     
    }
    Merci pour votre aide.
    Cordialement

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 196
    Billets dans le blog
    47
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    maValeurEnvoyee = " 1234";
     //fin de modif
      // On envoie le message
      esp_err_t resultat = esp_now_send(MAC_recepteur, (uint8_t *) &maValeurEnvoyee, sizeof(maValeurEnvoyee));
    Il doit en effet y avoir un souci sur le typage des données, tu devrais suivre la documentation qui propose d'encapsuler les données à envoyer dans une structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // Structure example to send data
    // Must match the receiver structure
    typedef struct struct_message {
        char maValeurEnvoyee[32];
    } struct_message;
     
    // Create a struct_message called myData
    struct_message myData;
     
    // ...
     
    // Set values to send
      strcpy(myData.maValeurEnvoyee, "1234");
     
    // ...
     
     // Send message via ESP-NOW
      esp_err_t result = esp_now_send(MAC_recepteur, (uint8_t *) &myData, sizeof(myData));
     
    // ...

  3. #3
    cal
    cal est déconnecté
    Membre habitué
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Par défaut
    Bonjour f-leb,

    effectivement le typage était incorrect. La solution consiste à déclarer une structure pour le message à envoyer qui définit la donnée à envoyer comme une chaine de caractères on fait ça coté émetteur et coté récepteur et là ça marche nickel. Je me suis inspiré d'un tuto de DroneBot Workshop. Pour ceux que ça intéressent je met un lien ci-dessous.

    https://dronebotworkshop.com

    Je passe à résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Communication entre deux applets?
    Par Danny Blue dans le forum Windows
    Réponses: 1
    Dernier message: 31/03/2006, 12h43
  2. Communication entre deux Executables ?
    Par QAYS dans le forum Langage
    Réponses: 8
    Dernier message: 11/05/2005, 14h41
  3. communication entre deux executables
    Par semenzato dans le forum MFC
    Réponses: 8
    Dernier message: 13/04/2005, 22h19
  4. Communication entre deux Threads
    Par rvzip64 dans le forum Langage
    Réponses: 13
    Dernier message: 28/01/2005, 09h14
  5. Réponses: 5
    Dernier message: 25/03/2003, 19h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo