ESPNOW - Échec de communication aléatoire

Bonjour,

Je veux faire communiquer 2 cartes ESP-12E avec le protocole ESPNOW.

Mes premières tentatives ont été un succès et ce à plusieurs reprises.

Sans raison apparente, la transmission du message s’est arrêtée. Le message “Delivery fail” venant de la fonction “OnDataSent” de l’émetteur s’affichait. J’ai affiché des prints dans le moniteur Arduino IDE pour comprendre la source du problème, mais en vain. L’ESPNOW s’initialisait bien sur les 2 cartes, l’adresse MAC était correcte, le pairage était fait correctement, … J’ai fini par téléverser à nouveau mon code dans les 2 cartes, mais cela n’a pas réglé le problème sur le moment. Quelques minutes plus tard, sans que je sache pourquoi, le protocole s’était mis à bien fonctionner… jusqu’à aujourd’hui, quelques semaines plus tard!!!

Plut tôt aujourd’hui, le message “Delivery fail” s’est affiché quand j’ai appuyé sur le reset de l’émetteur (bouton rst du ESP-12E). Au branchement de carte, le message se transmettait en succès. Ce que j’ai trouvé assez étrange. J’ai fait quelques tests (reset à plusieurs reprises, branchement-débranchement, source d’alimentation différente, rebranchement de la carte réceptrice, rapprochement physique des cartes, …) jusqu’à ce que finalement plus rien ne fonctionne : le message “Delivery fail” s’affiche en permanence, soit sur le bouton rst de la carte et au branchement de la carte.

Après maintes recherches sur le web, je ne trouve rien qui puisse m’aider.

Pouvez-vous m’aider à trouver des pistes de solution?

Code de l’émetteur

#include <espnow.h>

// Set your Board ID (ESP8266 Sender #1 = BOARD_ID 1, ESP8266 Sender #2 = BOARD_ID 2, etc)
#define BOARD_ID 1

//MAC Address of the receiver -- ESP-12E
uint8_t broadcastAddress[] = {0x99, 0x99, 0x99, 0x99, 0x99, 0x99};

//Structure example to send data
//Must match the receiver structure
typedef struct struct_message {
    int topic;
    char payload[2];
} struct_message;

//Create a struct_message called myData
struct_message myData;


// Callback when data is sent
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
  Serial.print("Last Packet Send Status: ");
  if (sendStatus == 0){
    Serial.println("Delivery success\n");
  }
  else{
    Serial.println("Delivery fail\n" + String(sendStatus));
  }
}


void setup() {

  //Init Serial Monitor
  Serial.begin(9600);
  delay(10);

  // Init ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  
  // Once ESPNow is successfully Init, we will register for Send CB to
  // get the status of Trasnmitted packet
  esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);

  // Once ESPNow is successfully Init, we will register for Send CB to
  // get the status of Trasnmitted packet
  esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
  esp_now_register_send_cb(OnDataSent);

  //Préparer les données à transmettre
  myData.topic = BOARD_ID;
  strcpy(myData.payload, "&1");
  
  Serial.println("\nMyData : " );
  Serial.println(*((uint8_t *) &myData.topic));
  Serial.println(*((uint8_t *) &myData.payload));
  Serial.println("\n");
  //Send data
  esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

}


void loop() {
  
}

Code du récepteur

#include <espnow.h>
#include <ESP8266WiFi.h>

// Structure example to receive data
// Must match the sender structure
typedef struct struct_message {
  int topic;
  char payload[2];
} struct_message;

struct_message incomingReadings;

// callback function that will be executed when data is received
void OnDataRecv(uint8_t * mac_addr, uint8_t *incomingData, uint8_t len) { 
  // send the received data to the Raspberry Pi
  // copier les résultats en mémoire
  memcpy(&incomingReadings, incomingData, sizeof(incomingReadings));
  //cout<<incomingReadings.topic<<incomingReadings.payload;
  Serial.printf("%d%s\n",incomingReadings.topic,incomingReadings.payload);
  
}


void setup() {
  // Initialize Serial Monitor
  Serial.begin(9600);

  // Set the device as a Station and Soft Access Point simultaneously
  WiFi.mode(WIFI_AP_STA);

  // Init ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;}
  else{
    Serial.println("Initializing ESP-NOW completed");
  }

  // Once ESPNow is successfully Init, we will register for recv CB to
  // get recv packer info
  esp_now_register_recv_cb(OnDataRecv);

}

  void loop() {

}

Mise à jour - Après 3 heures

Je viens de refaire des tests :

Quand je branche ma carte ESP-12E émettrice (via port USB) : Delivery success
Quand je pèse sur le bouton reset de ma carte ESP-12E émettrice : Delivery fail

Je reviens au comportement observé en début de journée.

Bonjour

Qu’appelles -tu ‘carte ESP12’ ?
ESP-12E c’est ça :
ESP-12E
Pour bien fonctionner une carte ESP12 , montrée ci-dessus, a besoin d’un câblage particulier
Quel est le câblage en place sur GPIO0, GPIO2, GPIO15… ?

N’aurais-tu pas , en fait, une carte genre NodeMCU, Lolin D1 MIni ou autre possédant un ESP-12E ainsi que d’autres composants pour complétter le câblage ?

Bonjour,

Oui, tu as raison! Ce sont 2 cartes NodeMCU comme celle-ci :

image

Ma carte émettrice est branchée seulement sur l’alimentation, via le port micro-usb.

Ma carte réceptrice est branchée à un Raspberry pour transmettre les données à Red-Node et s’alimenter. Les broches VIN, GND, TX et RX sont connectées au Raspberry (en rouge sur l’image)

OK donc , partons du principe que l’ESP-12E a tout ce qu’il faut comme composants additionnels.

-Est-tu certain que l’alimentation de la carte NodeMCU par le Raspberry Pi soit parfaite ?

-Le port série du Rasbetty Pi n’envoit-il l pas à certains moments des données indésirables (console) à la carte NodeMCU ? Tu as peut fait une petite manip en ligne de commande sur le Raspberry Pi pour éviter celà.

@al1fch
J’ai retiré les branchements au Raspberry PI et j’ai alimenté mes 2 cartes NodeMCU au port USB de mon PC afin d’éliminer tes 2 hypothèses. Malheureusement, j’ai le même résultat :frowning:

Au branchement : Delivery success
Au reset : Delivery fail

Par contre, au bout d’un moment à manipuler mes cartes NodeMCU (brancher/débrancher, bouton rst sur les 2 cartes), le bouton RST de ma carte émettrice s’est remis à fonctionner. :roll_eyes: Pourquoi?

Autre point : Dans le moniteur d’Arduino, je vois bien passer les messages reçus dans ma carte réceptrice. Mais quand je clique sur le bouton “Effacer la sortie” plus aucun message ne passe. Je dois débrancher et rebrancher à nouveau la carte MCU émettrice pour les voir à nouveau.

J’ai rebranché à mon Raspberry Pi et ça continue à passer avec succès.

Quel pourrait être la cause de cet arrêt mystérieux qui servient de temps à temps?

A quoi sont réventuellement encore reliées les bornes RX et TX des cartes NodeMCU (en plus de leur propre puce CP2102 ) ? L’utilsation de ces deux bornes (pas réellement libres car reliées aux CP2102) peut donner des réactions bizarres

(je n’ai absolument aucune expérience de ESP-NOW, mes cartes à ESP8266 fonctionnent toutes en ‘pur’ WiFi)

La communication ESPNOW s’est encore arrêtée.

J’ai retiré les branchement de mon Raspberry et j’ai connecté mes cartes sur mon PC.

Je réussi à faire fonctionner, mais la communication s’arrête sans raison à nouveau :

Je regarde la piste du canal de communication (en lien avec mon réseau wifi?) .

Auriez-vous d’autres pistes à me suggérer?
Est-il possible d’avoir plus de détails sur l’échec de la transmission?

peut être en activant l’option Debug Level : Wifi dans le menu Outils , elle couvre peut être également ce protocole rarement utilsié par les membres du forum

les essais s’inspirent-il de cette page web : https://randomnerdtutorials.com/esp-now-two-way-communication-esp8266-nodemcu/

Bienvenue,

payload n’a pas une taille suffisante pour contenir “&1” (3 caractères en comptant le 0 qui termine le string) donc ton strcpy écrit le 0 en dehors de payload, ça s’appelle un dépassement de tampon et ça peut provoquer toutes sortes de problèmes pouvant même faire crasher le programme.

Merci!!! C’est une excellente piste.

Avant de lire ton message, j’ai utilisé l’option pour tout flasher sur ma carte :

image

Jusqu’à maintenant, ça fonctionne de façon stable. Mais je me doute qu’il y a de fortes chances que je revienne en problème si je ne corrige pas la taille du payload. Ce que je vais faire à l’instant.

Oui, c’est bien mon inspiration!

Je vais voir comment utiliser le debug Level. Ça risque de m’aider pour de futurs projets.