Índice:
- Suprimentos
- Etapa 1: Obtenha o endereço Mac da placa
- Etapa 2: como fazer o ESP-NOW funcionar
- Etapa 3: FUNÇÕES ESP-NOW (ESP32)
- Etapa 4: FUNÇÕES ESP-NOW (ESP8266)
- Etapa 5: comunicação unilateral (ESP32 como remetente)
- Etapa 6: Comunicação unilateral (ESP8266 como remetente)
- Etapa 7: COMUNICAÇÃO DE DUAS VIAS
- Etapa 8: REFERÊNCIAS
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:35
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
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:
- Incluir esp agora e bibliotecas wi-fi
- Salve o endereço mac do ESP destinatário
- Defina a estrutura de dados da mensagem enviada / recebida
- Na configuração, defina o wi-fi para o modo de estação
- Inicializar esp_now
- fazer e registrar a função de retorno de chamada chamada após enviar e receber dados
- Para Esp8266, defina sua função
- registrar o par ou destinatário esp
- 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
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:
DIY -- Como fazer um robô aranha que pode ser controlado usando um smartphone usando o Arduino Uno: 6 etapas
DIY || Como fazer um robô aranha que pode ser controlado com smartphone usando o Arduino Uno: Ao fazer um robô aranha, pode-se aprender muitas coisas sobre robótica. Como fazer robôs é divertido e também desafiador. Neste vídeo vamos mostrar a vocês como fazer um robô aranha, que podemos operar usando nosso smartphone (Androi
Como ler vários valores analógicos usando um pino analógico: 6 etapas (com imagens)
Como ler vários valores analógicos usando um pino analógico: neste tutorial, vou mostrar como ler vários valores analógicos usando apenas um pino de entrada analógica
MQ7-MONITORAMENTO DE POLUIÇÃO USANDO COISA FALAR E NODEMCU: 4 etapas
MQ7-MONITORAMENTO DE POLUIÇÃO USANDO COISA FALAR E NODEMCU: A poluição é o maior problema do nosso mundo de hoje. Mas como podemos monitorar nossa poluição por perto, agora é muito fácil. VAMOS COMEÇAR:
Tutorial: como o Arduino controla vários dispositivos com o mesmo endereço usando o multiplexador TCA9548A I2C: 3 etapas
Tutorial: Como o Arduino controla vários dispositivos do mesmo endereço usando o multiplexador TCA9548A I2C: Descrição: O módulo do multiplexador TCA9548A I2C permite conectar dispositivos com o mesmo endereço I2C (até 8 mesmo endereço I2C) conectados a um microcontrolador. O multiplexador atua como um porteiro, transferindo os comandos para o conjunto selecionado de
Faça seu computador falar o que você digita usando o bloco de notas: 3 etapas
Faça seu computador falar o que você digita usando o bloco de notas: Aqui está um código interessante criado por nós para fazer seu computador falar o que você digita. Usaremos o bloco de notas para criá-lo. Vamos começar