Índice:

Como fazer vários ESP falar via ESP-NOW usando ESP32 e ESP8266: 8 etapas
Como fazer vários ESP falar via ESP-NOW usando ESP32 e ESP8266: 8 etapas
Anonim
Como fazer vários ESP falar via ESP-NOW usando ESP32 e ESP8266
Como fazer vários ESP falar via ESP-NOW usando ESP32 e ESP8266

No meu projeto em andamento, preciso de vários ESP para se comunicarem sem um roteador. Para fazer isso, usarei o ESP-NOW para fazer a comunicação sem fio entre nós sem um roteador no ESP.

Suprimentos

Coisas que eu usei:

Módulo ESP32 DEV

NODEMCU 1.0 (Módulo ESP12E)

Etapa 1: Obtenha o endereço Mac da placa

Obtenha o endereço Mac da placa
Obtenha o endereço Mac da placa
Obtenha o endereço Mac da placa
Obtenha o endereço Mac da placa

Por meio do ESP-now, os dispositivos ESP conversam entre si enviando dados para seu endereço exclusivo enquanto estão conectados a uma rede de pontos de acesso interna feita ao inicializar o esp now.. Portanto, determine o endereço MAC de cada dispositivo. Em anexo estão minhas configurações de placa ESP32 e ESP8266

PARA ESP32

#include "WiFi.h" // Para acessar os recursos do ESP32 WIFI

void setup () {Serial.begin (115200); Serial.print ("Endereço MAC da placa ESP32:"); Serial.println (WiFi.macAddress ()); // imprime seu endereço MAC} void loop () {}

PARA ESP8266

#include // Biblioteca usada para acessar os recursos WIFI do ESP8266

void setup () {Serial.begin (115200); Serial.println (); Serial.print ("Endereço MAC da placa ESP8266:"); Serial.println (WiFi.macAddress ()); // imprime seu endereço MAC} void loop () {}

Meu endereço MAC é:

  • ESP32 - 30: AE: A4: F5: 03: A4
  • ESP8266: A4: CF: 12: C7: 9C: 77

Etapa 2: como fazer o ESP-NOW funcionar

Aqui está uma visão geral de como fazer isso funcionar:

  1. Incluir esp agora e bibliotecas wi-fi
  2. Salve o endereço mac do ESP destinatário
  3. Defina a estrutura de dados da mensagem enviada / recebida
  4. Na configuração, defina o wi-fi para o modo de estação
  5. Inicializar esp_now
  6. fazer e registrar a função de retorno de chamada chamada após enviar e receber dados
  7. Para Esp8266, defina sua função
  8. registrar o par ou destinatário esp
  9. Enviar dados

Etapa 3: FUNÇÕES ESP-NOW (ESP32)

esp_now_init (vazio)

Retornar:

  • ESP_OK: sucesso
  • ESP_ERR_ESPNOW_INTERNAL: Erro interno

Descrição:

Inicializar a função ESPNOW

esp_now_register_send_cb (cb)

Retorna:

  • ESP_OK: sucesso
  • ESP_ERR_ESPNOW_NOT_INIT: ESPNOW não foi inicializado
  • ESP_ERR_ESPNOW_INTERNAL: erro interno

Parâmetros:

  • cb: nome da função de retorno de chamada após enviar dados ESPNOW com estes parâmetros:

    • void cb (const uint8_t * mac_addr, esp_now_send_status_t status)

      • mac_addr: endereço mac do receptor
      • status:

        • 1 = sucesso
        • 0 = falha

Descrição:

Chame a função OnDataSent após enviar dados ESPNOW

esp_now_add_peerconst esp_now_peer_info_t * peer)

Retorna:

  • ESP_OK: sucesso
  • ESP_ERR_ESPNOW_NOT_INIT: ESPNOW não foi inicializado
  • ESP_ERR_ESPNOW_ARG: argumento inválido
  • ESP_ERR_ESPNOW_FULL: a lista de pares está cheia
  • ESP_ERR_ESPNOW_NO_MEM: sem memória
  • ESP_ERR_ESPNOW_EXIST: par já existia

Parâmetros:

  • peer: informações de peer com os seguintes dados:

    • uint8_t

      peer_addr [ESP_NOW_ETH_ALEN]; Endereço MAC do peer ESPNOW que também é o endereço MAC da estação ou softap

    • uint8_t lmk [ESP_NOW_KEY_LEN]

      ESPNOW chave mestre local de ponto que é usada para criptografar dados

    • canal uint8_t

      Canal Wi-Fi que o par usa para enviar / receber dados ESPNOW. Se o valor for 0, use o canal atual em que a estação ou softap está ligado. Caso contrário, deve ser definido como o canal em que a estação ou softap está

    • wifi_interface_t ifidx

      Interface Wi-Fi que o par usa para enviar / receber dados ESPNOW

    • criptografar bool

      Os dados ESPNOW que este par envia / recebe são criptografados ou não

    • void * priv

      Dados privados de pares ESPNOW

Descrição:

Adicionar uma lista ponto a ponto

esp_now_send (const uint8_t * peer_addr, const uint8_t * data, size_t len)

Retorna:

  • ESP_OK: sucesso
  • ESP_ERR_ESPNOW_NOT_INIT: ESPNOW não foi inicializado
  • ESP_ERR_ESPNOW_ARG: argumento inválido
  • ESP_ERR_ESPNOW_INTERNAL: erro interno
  • ESP_ERR_ESPNOW_NO_MEM: sem memória
  • ESP_ERR_ESPNOW_NOT_FOUND: par não foi encontrado
  • ESP_ERR_ESPNOW_IF: a interface WiFi atual não corresponde à do par

Parâmetros:

  • peer_addr: endereço MAC do peer
  • dados: dados para enviar
  • len: comprimento dos dados

Descrição:

Envie dados ESPNOW. Para alguns casos, isso acontece:

  • Se peer_addr não for NULL, envia dados para o peer cujo endereço MAC corresponde a peer_addr
  • Se peer_addr for NULL, envia dados para todos os pares que são adicionados à lista de pares
  • O comprimento máximo dos dados deve ser inferior a ESP_NOW_MAX_DATA_LEN
  • O buffer apontado pelo argumento de dados não precisa ser válido após esp_now_send retornar

esp_now_register_recv_cb (cb)

Retorna:

  • ESP_OK: sucesso
  • ESP_ERR_ESPNOW_NOT_INIT: ESPNOW não foi inicializado
  • ESP_ERR_ESPNOW_INTERNAL: erro interno

Parâmetros:

  • cb: função de retorno de chamada para receber dados ESPNOW

    • void cb (const uint8_t * mac_addr, const uint8_t * data, int data_len)

      • mac_addr:

        endereço mac do receptor

      • *dados:

        dados recebidos

      • data_len

        comprimento do byte de dados

Descrição:

Chame a função cb após receber dados ESPNOW

Etapa 4: FUNÇÕES ESP-NOW (ESP8266)

DESCRIÇÃO DAS FUNÇÕES ESP32 ESP8266

int esp_now_init (vazio)

Retorna:

  • 1 = sucesso
  • 0 = falha

Descrição

Inicializar função ESPNOW

int esp_now_set_self_role (papel u8)

Parâmetros:

  • ESP_NOW_ROLE_IDLE: a transmissão de dados não é permitida.
  • ESP_NOW_ROLE_CONTROLLER: a prioridade é dada à interface Sation
  • ESP_NOW_ROLE_SLAVE: a prioridade é dada à interface SoftAP
  • ESP_NOW_ROLE_COMBO: a prioridade é dada ao SoftAPinterface

Descrição

Define a função do dispositivo

int esp_now_register_send_cb (cb)

Retorna:

  • 1 = sucesso
  • 0 = falha

Parâmetros:

  • cb: nome da função de retorno de chamada após enviar dados ESPNOW com estes parâmetros:

    • void cb (const uint8_t * mac_addr, esp_now_send_status_t status)

      • mac_addr: endereço mac do receptor
      • status:

        • 1 = sucesso
        • 0 = falha

Descrição

Chame a função OnDataSent após enviar dados ESPNOW

int esp_now_add_peer (u8 * mac_addr, função u8, canal u8, chave u8 *, u8 key_len)

Retorna:

  • 1 = sucesso
  • 0 = falha

Parâmetros:

  • mac_addr

    endereço mac do par

  • Função
  • canal

    Se o valor for 0, use o canal atual em que a estação ou softap está ligado. Caso contrário, deve ser definido como o canal em que a estação ou softap está

  • *chave

    chave para criptografia

  • key_len

    comprimento da chave

Descrição:

Adicionar uma lista ponto a ponto

int esp_now_send (const uint8_t * peer_addr, const uint8_t * data, size_t len)

Retorna:

  • 1 = sucesso
  • 0 = Reprovado

Parâmetros:

  • peer_addr: endereço MAC do peer
  • dados: dados para enviar
  • len: comprimento dos dados

Descrição:

Envie dados ESPNOW. Para alguns casos, isso acontece:

  • Se peer_addr não for NULL, envia dados para o peer cujo endereço MAC corresponde a peer_addr
  • Se peer_addr for NULL, envia dados para todos os pares que são adicionados à lista de pares
  • O comprimento máximo dos dados deve ser inferior a ESP_NOW_MAX_DATA_LEN
  • O buffer apontado pelo argumento de dados não precisa ser válido após esp_now_send retornar

int esp_now_register_recv_cb (cb)

Retorna:

  • 1 = sucesso
  • 0 = Reprovado

Parâmetros:

  • cb: função de retorno de chamada para receber dados ESPNOW

    • void cb (const uint8_t * mac_addr, const uint8_t * data, int data_len)

      • mac_addr:

        endereço mac do receptor

      • *dados:

        dados recebidos

      • data_len

        comprimento do byte de dados

Descrição:

Chame a função cb após receber dados ESPNOW

Etapa 5: comunicação unilateral (ESP32 como remetente)

O ESP32 envia dados para um ESP8266. com este código. Altere o broadcastAddress para o endereço mac do seu receptor correspondente. O meu era A4: CF: 12: C7: 9C: 77

// Adicionar bibliotecas necessárias

#include // Para acessar as funções do esp agora #include // Para adicionar recursos Wifi no ESP32 // salvar o endereço MAC em uma matriz chamada broadcastAddress; uint8_t broadcastAddress = {0xA4, 0xCF, 0x12, 0xC7, 0x9C, 0x77}; // endereço MAC do meu receptor / * definir os tipos de dados de várias variáveis estruturadas e renomeadas todas como struct_message * / typedef struct struct_message {char a [32]; int b; float c; String d; bool e; } struct_message; // Cria uma struct_message chamada myData struct_message myData; // função chamada quando os dados são enviados para imprimir seu status void OnDataSent (const uint8_t * mac_addr, esp_now_send_status_t status) {Serial.print ("\ r / nLast Packet Send Status: / t"); Serial.println (status == ESP_NOW_SEND_SUCCESS? "Sucesso na entrega": "Falha na entrega"); } void setup () {// Define a taxa de transmissão para comunicação serial com ESP Serial.begin (115200); // Defina o dispositivo como uma estação Wi-Fi WiFi.mode (WIFI_STA); // Inicia o wi-fi // Init ESP-NOW e retorna seu status se (esp_now_init ()! = ESP_OK) {Serial.println ("Erro ao inicializar ESP -AGORA"); Retorna; } // chama a função OnDataSent após enviar dados ESPNOW esp_now_register_send_cb (OnDataSent); // Registrar peer esp_now_peer_info_t peerInfo; // inicializa e atribui as informações do par como um ponteiro para um endereço memcpy (peerInfo.peer_addr, broadcastAddress, 6); // copia o valor de broadcastAddress com 6 bytes para peerInfo.peer_addr peerInfo.channel = 0; // canal em que o esp fala. 0 significa indefinido e os dados serão enviados no canal atual. 1-14 são canais válidos que são iguais ao dispositivo local peerInfo.encrypt = false; // não criptografado // Adiciona o dispositivo à lista de dispositivos emparelhados if (esp_now_add_peer (& peerInfo)! = ESP_OK) {Serial.println ("Falha ao adicionar par"); Retorna; }} void loop () {// Definir valores para enviar strcpy (myData.a, "THIS IS A CHAR"); // salve "ISTO É UM CARRO" na variável a dos meus "dados" definidos anteriormente myData.b = random (1, 20); // salvar um valor aleatório myData.c = 1.2; // salvar um float myData.d = "Hello"; // salva uma string myData.e = false; // salva um bool // envia dados menores ou iguais a 250 bytes via ESP-NOW e retorna seu status esp_err_t result = esp_now_send (broadcastAddress, (uint8_t *) & myData, sizeof (myData)); if (resultado == ESP_OK) {Serial.println ("Enviado com sucesso"); } else {Serial.println ("Erro ao enviar os dados"); } atraso (2000); }

O ESP8266 recebe dados do ESP32 usando este código.

// Adicionar bibliotecas necessárias

#include // Para adicionar recursos Wifi no ESP32 #include // Para acessar as funções esp now / * definir os tipos de dados das várias variáveis estruturadas e renomear todas como struct_message * / typedef struct struct_message {char a [32]; int b; float c; String d; bool e; } struct_message; // Cria uma variável struct_message chamada myData struct_message myData; // função chamada quando os dados são recebidos e os imprime void OnDataRecv (uint8_t * mac, uint8_t * EntryData, uint8_t len) {memcpy (& myData, EntryData, sizeof (myData)); Serial.print ("Bytes recebidos:"); Serial.println (len); Serial.print ("Char:"); Serial.println (myData.a); Serial.print ("Int:"); Serial.println (myData.b); Serial.print ("Float:"); Serial.println (meusDados.c); Serial.print ("String:"); Serial.println (myData.d); Serial.print ("Bool:"); Serial.println (myData.e); Serial.println (); } void setup () {// Definir a taxa de transmissão para comunicação serial com ESP Serial.begin (115200); // Define o dispositivo como uma estação Wi-Fi WiFi.mode (WIFI_STA); // Inicia o wi-fi // Init ESP-NOW e retorna seu status if (esp_now_init ()! = 0) {Serial.println ("Erro ao inicializar ESP-NOW"); Retorna; } esp_now_set_self_role (ESP_NOW_ROLE_SLAVE); // Define a função deste esp esp_now_register_recv_cb (OnDataRecv); // chama a função OnDataRecv após receber dados ESPNOW} void loop () {}

Etapa 6: Comunicação unilateral (ESP8266 como remetente)

O ESP8266 envia dados para um ESP32. com este código. Altere o broadcastAddress para o endereço mac do seu receptor correspondente. Meu endereço esp32 é 30: AE: A4: F5: 03: A4. Para outras funções do esp8266, clique aqui

// Adicionar bibliotecas necessárias

#include // Para adicionar recursos Wifi no ESP32 #include // Para acessar as funções do esp agora // salve o endereço MAC em uma matriz chamada broadcastAddress; uint8_t broadcastAddress = {0x30, 0xAE, 0xA4, 0xF5, 0x03, 0xA4}; / * define os tipos de dados das variáveis múltiplas estruturadas e renomeia todas como struct_message * / typedef struct struct_message {char a [32]; int b; float c; String d; bool e; } struct_message; // Cria uma variável estruturada chamada myData struct_message myData; // função chamada quando os dados são enviados e imprime seu status void OnDataSent (uint8_t * mac_addr, uint8_t sendStatus) {Serial.print ("\ r / nLast Packet Send Status: / t"); Serial.println (sendStatus == 1? "Delivery Success": "Delivery Fail"); } void setup () {// Definir a taxa de transmissão para comunicação serial com ESP Serial.begin (115200); // Defina o dispositivo como uma estação Wi-Fi WiFi.mode (WIFI_STA); // Inicia o wi-fi // Init ESP-NOW e retorna seu status se (esp_now_init ()) {Serial.println ("Erro ao inicializar ESP-NOW"); Retorna; } esp_now_register_send_cb (OnDataSent); // chamar a função OnDataSent após enviar dados ESPNOW // Adicionar o dispositivo à lista de dispositivos emparelhados if (esp_now_add_peer (broadcastAddress, ESP_NOW_ROLE_CONTROLLER, 1, NULL, 0)) {Serial.println ("Falha ao adicionar par"); Retorna; }} void loop () {// Definir valores para enviar strcpy (myData.a, "THIS IS A CHAR"); // salve "ISTO É UM CARRO" na variável a dos meus "dados" definidos anteriormente myData.b = random (1, 20); // salvar um valor aleatório myData.c = 1.2; // salvar um float myData.d = "SP8266"; // salva uma string myData.e = false; // salva um bool // Envia dados menores ou iguais a 250 bytes via ESP-NOW e retorna seu status int result = esp_now_send (broadcastAddress, (uint8_t *) & myData, sizeof (myData)); if (esp_now_init ()! = 0) {Serial.println ("Enviado com sucesso"); } else {Serial.println ("Erro ao enviar os dados"); } atraso (2000); }

O ESP32 recebe dados de um ESP8266. com este código. Para outras funções, consulte aqui

// Adicionar bibliotecas necessárias

#include // Para acessar as funções do esp now #include // Para adicionar recursos Wifi no ESP32 / * definir os tipos de dados das várias variáveis estruturadas e renomear todas como struct_message * / typedef struct struct_message {char a [32]; int b; float c; String d; bool e; } struct_message; // Cria uma variável struct_message chamada myData struct_message myData; // função chamada quando os dados são recebidos e os imprime void OnDataRecv (const uint8_t * mac, const uint8_t * EntryData, int len) {memcpy (& myData, EntryData, sizeof (myData)); Serial.print ("Bytes recebidos:"); Serial.println (len); Serial.print ("Char:"); Serial.println (myData.a); Serial.print ("Int:"); Serial.println (myData.b); Serial.print ("Float:"); Serial.println (meusDados.c); Serial.print ("String:"); Serial.println (myData.d); Serial.print ("Bool:"); Serial.println (myData.e); Serial.println (); } void setup () {// Define a taxa de transmissão para comunicação serial com ESP Serial.begin (115200); // Define o dispositivo como uma estação Wi-Fi WiFi.mode (WIFI_STA); // Inicia o wi-fi // Init ESP-NOW e retorna seu status if (esp_now_init ()! = 0) {Serial.println ("Erro ao inicializar ESP-NOW"); Retorna; } esp_now_register_recv_cb (OnDataRecv); // chama a função OnDataRecv após receber dados ESPNOW} void loop () {}

Etapa 7: COMUNICAÇÃO DE DUAS VIAS

COMUNICAÇÃO DE DUAS VIAS
COMUNICAÇÃO DE DUAS VIAS
COMUNICAÇÃO DE DUAS VIAS
COMUNICAÇÃO DE DUAS VIAS

O ESP32 envia dados na inicialização para o ESP8266. O ESP8266 imprime a mensagem recebida e, em seguida, responde sobre a qual o ESP32 imprime em seu monitor serial.

CÓDIGO ESP32

// Adicionar bibliotecas necessárias

#include // Para acessar as funções do esp agora #include // Para adicionar recursos Wifi no ESP32 // salvar o endereço MAC em uma matriz chamada broadcastAddress; uint8_t broadcastAddress = {0xA4, 0xCF, 0x12, 0xC7, 0x9C, 0x77}; // endereço MAC do meu receptor / * definir os tipos de dados de várias variáveis estruturadas e renomeadas todas como struct_message * / typedef struct struct_message {char a [32]; int b; float c; String d; bool e; } struct_message; // Cria uma struct_message chamada myData struct_message myData; // função chamada quando os dados são enviados para imprimir seu status void OnDataSent (const uint8_t * mac_addr, esp_now_send_status_t status) {Serial.print ("\ r / nLast Packet Send Status: / t"); Serial.println (status == ESP_NOW_SEND_SUCCESS? "Sucesso na entrega": "Falha na entrega"); if (status! = ESP_NOW_SEND_SUCCESS) {send_data ();}} void OnDataRecv (const uint8_t * mac, const uint8_t * EntryData, int len) {memcpy (& myData, EntryData, sizeof (myData)); Serial.print ("Bytes recebidos:"); Serial.println (len); Serial.print ("Char:"); Serial.println (myData.a); Serial.print ("Int:"); Serial.println (myData.b); Serial.print ("Float:"); Serial.println (meusDados.c); Serial.print ("String:"); Serial.println (myData.d); Serial.print ("Bool:"); Serial.println (myData.e); Serial.println (); } void setup () {// Define a taxa de transmissão para comunicação serial com ESP Serial.begin (115200); // Defina o dispositivo como uma estação Wi-Fi WiFi.mode (WIFI_STA); // Inicia o wi-fi // Init ESP-NOW e retorna seu status se (esp_now_init ()! = ESP_OK) {Serial.println ("Erro ao inicializar ESP -AGORA"); Retorna; } // chamar a função OnDataSent após enviar dados ESPNOW esp_now_register_send_cb (OnDataSent); // Registrar peer esp_now_peer_info_t peerInfo; // inicializa e atribui as informações do par como um ponteiro para um endereço memcpy (peerInfo.peer_addr, broadcastAddress, 6); // copia o valor de broadcastAddress com 6 bytes para peerInfo.peer_addr peerInfo.channel = 0; // canal em que o esp fala. 0 significa indefinido e os dados serão enviados no canal atual.1-14 são canais válidos que são iguais ao dispositivo local peerInfo.encrypt = false; // não criptografado // Adiciona o dispositivo à lista de dispositivos emparelhados if (esp_now_add_peer (& peerInfo)! = ESP_OK) {Serial.println ("Falha ao adicionar par"); Retorna; } esp_now_register_recv_cb (OnDataRecv); // chama a função OnDataRecv após receber os dados ESPNOW send_data (); } void loop () {} void send_data () {Serial.println ("Enviando"); // Defina os valores para enviar strcpy (myData.a, "THIS IS A CHAR"); // salve "ISTO É UM CARRO" na variável a dos meus "dados" definidos anteriormente myData.b = random (1, 20); // salvar um valor aleatório myData.c = 1.2; // salvar um float myData.d = "ESP32"; // salva uma string myData.e = false; // salva um bool // envia dados menores ou iguais a 250 bytes via ESP-NOW e retorna seu status esp_err_t result = esp_now_send (broadcastAddress, (uint8_t *) & myData, sizeof (myData)); if (resultado == ESP_OK) {Serial.println ("Enviado com sucesso");} else {Serial.println ("Erro ao enviar os dados"); }}

CÓDIGO ESP8266

// Adicionar bibliotecas necessárias

#include // Para adicionar recursos Wifi no ESP32 #include // Para acessar as funções do esp agora // salve o endereço MAC em uma matriz chamada broadcastAddress; uint8_t broadcastAddress = {0x30, 0xAE, 0xA4, 0xF5, 0x03, 0xA4}; / * define os tipos de dados das variáveis múltiplas estruturadas e renomeia todas como struct_message * / typedef struct struct_message {char a [32]; int b; float c; String d; bool e; } struct_message; // Cria uma variável struct_message chamada myData struct_message myData; // função chamada quando os dados são recebidos e os imprime void OnDataRecv (uint8_t * mac, uint8_t * EntryData, uint8_t len) {memcpy (& myData, EntryData, sizeof (myData)); Serial.print ("Bytes recebidos:"); Serial.println (len); Serial.print ("Char:"); Serial.println (myData.a); Serial.print ("Int:"); Serial.println (myData.b); Serial.print ("Float:"); Serial.println (meusDados.c); Serial.print ("String:"); Serial.println (myData.d); Serial.print ("Bool:"); Serial.println (myData.e); Serial.println (); send_data (); } void OnDataSent (uint8_t * mac_addr, uint8_t sendStatus) {Serial.print ("\ r / nLast Packet Send Status: / t"); Serial.println (sendStatus == 1? "Delivery Success": "Delivery Fail"); if (sendStatus! = 1) {send_data (); }} void send_data () {// Definir valores para enviar strcpy (myData.a, "THIS IS A CHAR"); // salve "ISTO É UM CARRO" na variável a dos meus "dados" definidos anteriormente myData.b = random (1, 20); // salvar um valor aleatório myData.c = 1.2; // salvar um float myData.d = "ESP8266"; // salva uma string myData.e = false; // salvar um bool esp_now_send (broadcastAddress, (uint8_t *) & myData, sizeof (myData)); } void setup () {// Define a taxa de transmissão para comunicação serial com ESP Serial.begin (115200); // Define o dispositivo como uma estação Wi-Fi WiFi.mode (WIFI_STA); // Inicia o wi-fi // Init ESP-NOW e retorna seu status if (esp_now_init ()! = 0) {Serial.println ("Erro ao inicializar ESP-NOW"); Retorna; } if (esp_now_add_peer (broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0)) {Serial.println ("Falha ao adicionar par"); Retorna; } esp_now_set_self_role (ESP_NOW_ROLE_COMBO); esp_now_register_send_cb (OnDataSent); esp_now_set_self_role (ESP_NOW_ROLE_COMBO); // Define a função deste esp esp_now_register_recv_cb (OnDataRecv); // chama a função OnDataRecv após receber dados ESPNOW} void loop () {}

Etapa 8: REFERÊNCIAS

ESPNOW_32_Example

ESPNOW_8266 Exemplo

WIFI.h

ESP8266WiFi.h

esp_now.h para ESP8266

esp_now.h para ESP32

documento oficial esp_now (melhor explicação das funções)

Guia oficial ESP-NOW

Recomendado: