ESP-NOW Two-Ways ESP32-ESP8266

jrodrila
Posts: 2
Joined: Mon Oct 31, 2022 3:21 pm

ESP-NOW Two-Ways ESP32-ESP8266

Postby jrodrila » 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:
  1. // Librerias
  2. #ifdef ESP32
  3. #include <WiFi.h>
  4. #else
  5. #include <ESP8266WiFi.h>
  6. #endif
  7.  
  8. #include <esp_now.h>
  9. #include <Arduino.h>
  10. #include <iostream>
  11.  
  12. //Variables ESP-NOW
  13. int id_pcb = 111;                   //ID de MCU
  14.  
  15. String success;                     //Varible para saber que el mensaje se ha entregado
  16. uint8_t broadcastAddress1[] = { 0xC8, 0xC9, 0xA3, 0x60, 0xFA, 0x67 };  //Direccion MAC donde queremos mandar los datos { 0xC8, 0xC9, 0xA3, 0x60, 0xFA, 0x67 }
  17.  
  18. //34:B4:72:4E:32:8C - esp32c3_1
  19. //34:B4:72:4E:2A:84 - esp32c3_2
  20. //30:C6:F7:29:01:28 - esp32-wroom-32d
  21. //C8:C9:A3:60:FA:67 - lolin D1 mini
  22.  
  23. //Estructura para enviar datos
  24. typedef struct struct_message {
  25.     int id;          //ID de MCU
  26.     bool rst;        //resetear
  27.     bool aut;        //autoreset
  28.     int cnt;         //contador
  29.     int set_tiempo;  //ajustar tiempo
  30.     int set_aviso;   //ajustar aviso
  31.     bool upt_master;//Flag actualizar master
  32.     bool upt_slave;//Flag actualizar slave
  33.     float vsense; //Valor de tension del master
  34.     bool pau;
  35. } struct_message;
  36.  
  37. struct_message datos_master;   //creamos estructura para MANDAR datos al esclavo
  38. struct_message datos_slave;  //creamos estructura para RECIBIR los datos del esclavo
  39.  
  40. esp_now_peer_info_t peerInfo;//
  41.  
  42. //FUNCIONES
  43. /*ESP - NOW Callback when data is sent*/
  44. void OnDataSent(const uint8_t* mac_addr, esp_now_send_status_t status) {
  45.     Serial.print("\r\nLast:\t");
  46.     Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery SL OK" : "Fallo Entrega en ESCLAVO");
  47. }
  48.  
  49.  
  50. /*ESP - NOW Callback when data is received*/
  51. void OnDataRecv(const uint8_t* mac, uint8_t* incomingData, int len) {
  52.     memcpy(&datos_slave, incomingData, sizeof(datos_slave));
  53.    
  54.     Serial.print("Bytes on SLAVE: ");
  55.     Serial.println(len);
  56.  
  57. }
  58.  
  59. void setup()
  60. {
  61.     /*Iniciamos monitor serie*/
  62.     Serial.begin(115200);
  63.     /*Inicializamos a WIFI*/
  64.     WiFi.mode(WIFI_STA);
  65.  
  66.     /*******************Init ESP-NOW***********************/
  67.     if (esp_now_init() != ESP_OK) {
  68.         Serial.println("Error initializando ESP-NOW");
  69.         return;//Esto estaba comentado
  70.     }
  71.     // Once ESPNow is successfully Init, we will register for Send CB to
  72.     // get the status of Trasnmitted packet
  73.     esp_now_register_send_cb(OnDataSent);
  74.     // Preparamos info para registrar esclavo
  75.     memcpy(peerInfo.peer_addr, broadcastAddress1, 6);
  76.     peerInfo.channel = 0;
  77.     peerInfo.encrypt = false;
  78.     // Añadimos esclavo
  79.     if (esp_now_add_peer(&peerInfo) != ESP_OK) {
  80.         Serial.println("Fallo añadiendo peer");
  81.         return;
  82.     }
  83.     // Registramos funcion callback que sera llamada cuando recibimos datos
  84.     esp_now_register_recv_cb(OnDataRecv);
  85.     /*******************FIN Init ESP-NOW********************/
  86.  
  87. }
  88.  
  89. /*####################### BUCLE PRINCIPAL ######################*/
  90. void loop() {
  91.  
  92.     /*Enviamos info ESP-NOW*/
  93.     //Actualizar datos de envio
  94.     delay(1500);
  95.  
  96.     datos_master.id = id_pcb;
  97.     datos_master.cnt = 0;
  98.     datos_master.rst = false;
  99.     datos_master.aut = false;
  100.     datos_master.set_tiempo = 20;
  101.     datos_master.set_aviso = 10;
  102.     datos_master.upt_master = false;
  103.     datos_master.pau = false;
  104.  
  105.     // Enviamos mensaje ESP-NOW
  106.     esp_err_t result = esp_now_send(broadcastAddress1, (uint8_t*)&datos_master, sizeof(datos_master));
  107.     if (result == ESP_OK) {
  108.         Serial.print("Envio a esclavo desde ");
  109.         Serial.print(datos_master.id);
  110.         Serial.print(" ");
  111.         Serial.print(millis());
  112.         Serial.println(" OK");
  113.     }
  114.     else {
  115.         Serial.println("Envio a esclavo NOK");
  116.     }  
  117.  
  118.     /*FIN Enviamos info ESP-NOW*/
  119.  
  120.  
  121. }

The code of the ESP8266:
  1.  
  2. // Librerias
  3. #ifdef ESP32
  4. #include <WiFi.h>
  5. #else
  6. #include <ESP8266WiFi.h>
  7. #endif
  8.  
  9. #include <espnow.h>
  10. #include <Arduino.h>
  11. #include <iostream>
  12.  
  13.  
  14. //Variables ESP-NOW
  15. int id_pcb = 121;                   //ID de MCU
  16.  
  17.  
  18. String success;                     //Varible para saber que el mensaje se ha entregado
  19. uint8_t broadcastAddress1[] = { 0x34, 0xB4, 0x72, 0x4E, 0x2A, 0x84 };  //Direccion MAC donde queremos mandar los datos{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }
  20.  
  21. //34:B4:72:4E:32:8C - esp32c3_2
  22. //34:B4:72:4E:2A:84 - esp32c3_1
  23. //30:C6:F7:29:01:28 - esp32-wroom-32d
  24. //C8:C9:A3:60:FA:67 - lolin D1 mini
  25.  
  26. //Estructura para enviar datos
  27. typedef struct struct_message {
  28.     int id;          //ID de MCU
  29.     bool rst;        //resetear
  30.     bool aut;        //autoreset
  31.     int cnt;         //contador
  32.     int set_tiempo;  //ajustar tiempo
  33.     int set_aviso;   //ajustar aviso
  34.     bool upt_master;//Flag actualizar master
  35.     bool upt_slave;//Flag actualizar slave
  36.     float vsense; //Valor de tension del master
  37.     bool pau;
  38. } struct_message;
  39.  
  40. struct_message datos_slave;   //creamos estructura para MANDAR datos del esclavo
  41. struct_message datos_master;  //creamos estructura para RECIBIR los datos del maestro
  42.  
  43.  
  44.  
  45. //FUNCIONES
  46. // ESP-NOW Callback when data is sent
  47. void OnDataSent(uint8_t* mac_addr, uint8_t sendStatus) {
  48.    
  49.     if (sendStatus == 0) {
  50.         /*Serial.print("Envio a maestro desde ");
  51.         Serial.print(datos_slave.id);
  52.         Serial.print(" ");
  53.         Serial.print(millis());
  54.         Serial.println(" OK");*/
  55.     }
  56.     else {
  57.         Serial.println("Delivery fail to Master");
  58.     }
  59. }
  60. // ESP-NOW Callback when data is received
  61. void OnDataRecv(uint8_t* mac, uint8_t *incomingData, uint8_t len) {
  62.     memcpy(&datos_master, incomingData, sizeof(datos_master));
  63.     Serial.print("Bytes on MASTER: ");
  64.     Serial.println(len);
  65.  
  66.  
  67. }
  68.  
  69.  
  70.  
  71. void setup()
  72. {
  73.     /*Iniciamos monitor serie*/
  74.     Serial.begin(115200);
  75.     /*Inicializamos a WIFI*/
  76.     WiFi.mode(WIFI_STA);
  77.  
  78.     // Register peer
  79.     esp_now_add_peer(broadcastAddress1, ESP_NOW_ROLE_COMBO, 1, NULL, 0);
  80.  
  81.     /*******************Init ESP-NOW***********************/
  82.     if (esp_now_init() != 0) {
  83.         Serial.println("Error initializando ESP-NOW");
  84.         return;
  85.     }
  86.  
  87.     // Set ESP-NOW Role
  88.     esp_now_set_self_role(ESP_NOW_ROLE_COMBO);//Exclusivo espnow.h
  89.  
  90.     // Once ESPNow is successfully Init, we will register for Send CB to
  91.     // get the status of Trasnmitted packet
  92.     esp_now_register_send_cb(OnDataSent);
  93.    
  94.  
  95.  
  96.     // Registramos funcion callback que sera llamada cuandop recibimos datos
  97.     esp_now_register_recv_cb(OnDataRecv);
  98.     /*******************FIN Init ESP-NOW********************/
  99.  
  100. }
  101.  
  102. /*####################### BUCLE PRINCIPAL ######################*/
  103. void loop() {
  104.  
  105.  
  106.     delay(1500);
  107.  
  108.         /*Enviamos info ESP-NOW*/
  109.         //Actualizar datos de envio
  110.         datos_slave.id = id_pcb;
  111.         datos_slave.cnt = 10;
  112.         datos_slave.rst = false;
  113.         datos_slave.aut = false;
  114.         datos_slave.set_tiempo = 30;
  115.         datos_slave.set_aviso = 10;
  116.         datos_slave.upt_master = false; //Activamos actualizacion del master si esta activo
  117.         datos_slave.pau = false;
  118.         // Enviamos mensaje ESP-NOW
  119.  
  120.         // Send message via ESP-NOW
  121.         esp_now_send(broadcastAddress1, (uint8_t*)&datos_slave, sizeof(datos_slave));
  122.  
  123.         /*FIN Enviamos info ESP-NOW*/
  124.  
  125.  
  126. }
  127.  
PLease, Could somebody help me?

Thanks,
Juan Carlos

jrodrila
Posts: 2
Joined: Mon Oct 31, 2022 3:21 pm

Re: ESP-NOW Two-Ways ESP32-ESP8266

Postby jrodrila » Tue Nov 01, 2022 9:39 pm

Hello again,

I tried to connect two ESP8266 with the same code, ans works fine. Works with specific MAC and broadcast MAC without problem.

I think that maybe we have a compatibility problem.

Some idea? :roll:

Thanks,
Juan Carlos

bocmau
Posts: 1
Joined: Tue Feb 06, 2024 5:28 pm

Re: ESP-NOW Two-Ways ESP32-ESP8266

Postby bocmau » Tue Feb 06, 2024 5:31 pm

HI,
did you solve the problem

Mauri

Leogala
Posts: 1
Joined: Sat Jun 08, 2024 9:40 am

Re: ESP-NOW Two-Ways ESP32-ESP8266

Postby Leogala » Sat Jun 08, 2024 9:48 am

I had the same problem, while on old versions of ESP32 the communication ESP32->ESP8266 was working fine, on more recent versions of the same module (ESP-WROOM-32) it was working very bad.
However, in my case, I solved by setting on ESP32 the rate of ESP-NOW as follows:

WiFi.mode(WIFI_STA);
esp_wifi_config_espnow_rate(WIFI_IF_STA,(wifi_phy_rate_t) 8);

that, according to https://docs.espressif.com/projects/esp ... _wifi.html , corresponds to 48Mbps.
Also higher rate seem to work but not the default one, apparently.

Who is online

Users browsing this forum: No registered users and 93 guests