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() {
}