ESP-NOW Two-Ways ESP32-ESP8266
Posted: Mon Oct 31, 2022 3:37 pm
Hello everyone,
I am trying to connect 2 MCU with ESP-NOW.
The code works fine on the way ESP8266->ESP32, but on the way ESP32->ESP8266. Sometimes a messsage arrives, but most of time the message is lost.
I tried also with different roles, and only sending, but I failed. Also with broadcast address...
The code of ESP32:
The code of the ESP8266:
PLease, Could somebody help me?
Thanks,
Juan Carlos
I am trying to connect 2 MCU with ESP-NOW.
The code works fine on the way ESP8266->ESP32, but on the way ESP32->ESP8266. Sometimes a messsage arrives, but most of time the message is lost.
I tried also with different roles, and only sending, but I failed. Also with broadcast address...
The code of ESP32:
- // Librerias
- #ifdef ESP32
- #include <WiFi.h>
- #else
- #include <ESP8266WiFi.h>
- #endif
- #include <esp_now.h>
- #include <Arduino.h>
- #include <iostream>
- //Variables ESP-NOW
- int id_pcb = 111; //ID de MCU
- String success; //Varible para saber que el mensaje se ha entregado
- uint8_t broadcastAddress1[] = { 0xC8, 0xC9, 0xA3, 0x60, 0xFA, 0x67 }; //Direccion MAC donde queremos mandar los datos { 0xC8, 0xC9, 0xA3, 0x60, 0xFA, 0x67 }
- //34:B4:72:4E:32:8C - esp32c3_1
- //34:B4:72:4E:2A:84 - esp32c3_2
- //30:C6:F7:29:01:28 - esp32-wroom-32d
- //C8:C9:A3:60:FA:67 - lolin D1 mini
- //Estructura para enviar datos
- typedef struct struct_message {
- int id; //ID de MCU
- bool rst; //resetear
- bool aut; //autoreset
- int cnt; //contador
- int set_tiempo; //ajustar tiempo
- int set_aviso; //ajustar aviso
- bool upt_master;//Flag actualizar master
- bool upt_slave;//Flag actualizar slave
- float vsense; //Valor de tension del master
- bool pau;
- } struct_message;
- struct_message datos_master; //creamos estructura para MANDAR datos al esclavo
- struct_message datos_slave; //creamos estructura para RECIBIR los datos del esclavo
- esp_now_peer_info_t peerInfo;//
- //FUNCIONES
- /*ESP - NOW Callback when data is sent*/
- void OnDataSent(const uint8_t* mac_addr, esp_now_send_status_t status) {
- Serial.print("\r\nLast:\t");
- Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery SL OK" : "Fallo Entrega en ESCLAVO");
- }
- /*ESP - NOW Callback when data is received*/
- void OnDataRecv(const uint8_t* mac, uint8_t* incomingData, int len) {
- memcpy(&datos_slave, incomingData, sizeof(datos_slave));
- Serial.print("Bytes on SLAVE: ");
- Serial.println(len);
- }
- void setup()
- {
- /*Iniciamos monitor serie*/
- Serial.begin(115200);
- /*Inicializamos a WIFI*/
- WiFi.mode(WIFI_STA);
- /*******************Init ESP-NOW***********************/
- if (esp_now_init() != ESP_OK) {
- Serial.println("Error initializando ESP-NOW");
- return;//Esto estaba comentado
- }
- // Once ESPNow is successfully Init, we will register for Send CB to
- // get the status of Trasnmitted packet
- esp_now_register_send_cb(OnDataSent);
- // Preparamos info para registrar esclavo
- memcpy(peerInfo.peer_addr, broadcastAddress1, 6);
- peerInfo.channel = 0;
- peerInfo.encrypt = false;
- // AƱadimos esclavo
- if (esp_now_add_peer(&peerInfo) != ESP_OK) {
- Serial.println("Fallo aƱadiendo peer");
- return;
- }
- // Registramos funcion callback que sera llamada cuando recibimos datos
- esp_now_register_recv_cb(OnDataRecv);
- /*******************FIN Init ESP-NOW********************/
- }
- /*####################### BUCLE PRINCIPAL ######################*/
- void loop() {
- /*Enviamos info ESP-NOW*/
- //Actualizar datos de envio
- delay(1500);
- datos_master.id = id_pcb;
- datos_master.cnt = 0;
- datos_master.rst = false;
- datos_master.aut = false;
- datos_master.set_tiempo = 20;
- datos_master.set_aviso = 10;
- datos_master.upt_master = false;
- datos_master.pau = false;
- // Enviamos mensaje ESP-NOW
- esp_err_t result = esp_now_send(broadcastAddress1, (uint8_t*)&datos_master, sizeof(datos_master));
- if (result == ESP_OK) {
- Serial.print("Envio a esclavo desde ");
- Serial.print(datos_master.id);
- Serial.print(" ");
- Serial.print(millis());
- Serial.println(" OK");
- }
- else {
- Serial.println("Envio a esclavo NOK");
- }
- /*FIN Enviamos info ESP-NOW*/
- }
The code of the ESP8266:
- // Librerias
- #ifdef ESP32
- #include <WiFi.h>
- #else
- #include <ESP8266WiFi.h>
- #endif
- #include <espnow.h>
- #include <Arduino.h>
- #include <iostream>
- //Variables ESP-NOW
- int id_pcb = 121; //ID de MCU
- String success; //Varible para saber que el mensaje se ha entregado
- uint8_t broadcastAddress1[] = { 0x34, 0xB4, 0x72, 0x4E, 0x2A, 0x84 }; //Direccion MAC donde queremos mandar los datos{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }
- //34:B4:72:4E:32:8C - esp32c3_2
- //34:B4:72:4E:2A:84 - esp32c3_1
- //30:C6:F7:29:01:28 - esp32-wroom-32d
- //C8:C9:A3:60:FA:67 - lolin D1 mini
- //Estructura para enviar datos
- typedef struct struct_message {
- int id; //ID de MCU
- bool rst; //resetear
- bool aut; //autoreset
- int cnt; //contador
- int set_tiempo; //ajustar tiempo
- int set_aviso; //ajustar aviso
- bool upt_master;//Flag actualizar master
- bool upt_slave;//Flag actualizar slave
- float vsense; //Valor de tension del master
- bool pau;
- } struct_message;
- struct_message datos_slave; //creamos estructura para MANDAR datos del esclavo
- struct_message datos_master; //creamos estructura para RECIBIR los datos del maestro
- //FUNCIONES
- // ESP-NOW Callback when data is sent
- void OnDataSent(uint8_t* mac_addr, uint8_t sendStatus) {
- if (sendStatus == 0) {
- /*Serial.print("Envio a maestro desde ");
- Serial.print(datos_slave.id);
- Serial.print(" ");
- Serial.print(millis());
- Serial.println(" OK");*/
- }
- else {
- Serial.println("Delivery fail to Master");
- }
- }
- // ESP-NOW Callback when data is received
- void OnDataRecv(uint8_t* mac, uint8_t *incomingData, uint8_t len) {
- memcpy(&datos_master, incomingData, sizeof(datos_master));
- Serial.print("Bytes on MASTER: ");
- Serial.println(len);
- }
- void setup()
- {
- /*Iniciamos monitor serie*/
- Serial.begin(115200);
- /*Inicializamos a WIFI*/
- WiFi.mode(WIFI_STA);
- // Register peer
- esp_now_add_peer(broadcastAddress1, ESP_NOW_ROLE_COMBO, 1, NULL, 0);
- /*******************Init ESP-NOW***********************/
- if (esp_now_init() != 0) {
- Serial.println("Error initializando ESP-NOW");
- return;
- }
- // Set ESP-NOW Role
- esp_now_set_self_role(ESP_NOW_ROLE_COMBO);//Exclusivo espnow.h
- // Once ESPNow is successfully Init, we will register for Send CB to
- // get the status of Trasnmitted packet
- esp_now_register_send_cb(OnDataSent);
- // Registramos funcion callback que sera llamada cuandop recibimos datos
- esp_now_register_recv_cb(OnDataRecv);
- /*******************FIN Init ESP-NOW********************/
- }
- /*####################### BUCLE PRINCIPAL ######################*/
- void loop() {
- delay(1500);
- /*Enviamos info ESP-NOW*/
- //Actualizar datos de envio
- datos_slave.id = id_pcb;
- datos_slave.cnt = 10;
- datos_slave.rst = false;
- datos_slave.aut = false;
- datos_slave.set_tiempo = 30;
- datos_slave.set_aviso = 10;
- datos_slave.upt_master = false; //Activamos actualizacion del master si esta activo
- datos_slave.pau = false;
- // Enviamos mensaje ESP-NOW
- // Send message via ESP-NOW
- esp_now_send(broadcastAddress1, (uint8_t*)&datos_slave, sizeof(datos_slave));
- /*FIN Enviamos info ESP-NOW*/
- }
Thanks,
Juan Carlos