Introdução
Neste artigo, mostraremos como utilizar a placa de desenvolvimento ESP32-C6 DevKitC-1 em conjunto com a Franzininho WiFi Lab01, implementando uma comunicação bidirecional via ESP-NOW, onde botões pressionados em uma placa controlam LEDs na outra. Essa solução é ideal para aplicações de casa inteligente, controle remoto e sensores, especialmente onde não há conexão com internet disponível.
O ESP-NOW é um protocolo proprietário da Espressif, projetado para comunicação de baixa latência, baixo consumo de energia e de alta compatibilidade entre os dispositivos ESP32. No site oficial da espressif temos diversos exemplos de aplicações para o ESP-NOW. Consulte mais informações em ESP-NOW Wireless Communication Protocol | Espressif Systems
Para conhecer mais a placa de desenvolvimento consulte nosso artigo Introdução à Placa ESP32-C6-DevKitC-1: Ideal para IoT
Características do ESP-NOW
- Baixa latência
- Baixo consumo de energia
- Sem necessidade de Wi-Fi
- Comunicação de longa distância de até 200 metros
- Coexiste com Wi-Fi e Bluetooth
- Método de emparelhamento “um para muitos” e “muitos para muitos”
- Máximo de 250 bytes por mensagem
Materiais Necessários
Para desenvolver nossa aplicação os materiais utilizados foram:
- Placa ESP23-C6 DevKitC-1
- Franzininho WiFi Lab01
- Cabo USB-C
- Cabo Micro USB
- Arduino IDE
- 1x Resistor 330 ohm
- 1x Led
- 1x Botão
- Jumpers
Para configurar o ambiente e instalar o suporte a ESP32-C6 veja o artigo ESP32-C6 na Prática: Seu Primeiro “Hello World”
Circuito
O circuito utilizado para este artigo será a placa ESP32-C6 DevKitC-1 para mostrar as informações entre as placas no monitor serial.
Código
Para enviar mensagens entre cada placa, primeiro precisamos saber o endereço único MAC de cada uma. Abaixo temos o código utilizado para ler o endereço MAC no monitor serial.
#include <WiFi.h>
void setup(){
Serial.begin(115200);
WiFi.mode(WIFI_STA);
delay(1000);
Serial.println(WiFi.macAddress());
}
void loop(){
delay(100)
}
Para as placas utilizadas obtive os seguintes endereços MAC.
ESP32-C6 DevKitC-1 -> 40:4C:CA:56:B6:74
Franzininho WiFi Lab01 -> 68:67:25:2D:C6:5C
Com o endereço MAC em mãos, vamos para o código da placa ESP32-C6 responsável por interpretar o pressionamento do botão e enviar a mensagem por ESP-NOW para a Franzininho WiFi acender o Led verde.
O código completo encontra-se em https://github.com/guilhermefernandesk/ESP32-C6/tree/main/espNow
/*
Placa ESP32-C6 DevKitC-1
*/
// Bibliotecas necessárias
#include <WiFi.h>
#include <esp_now.h>
#include "button.h"
#define LED_VERMELHO 18 // pino LED Vermelho
#define BOTAO 19 // Pino Botão
#define ID 0 // Identificador unico
Button button(BOTAO); // Cria classe para manipular botão
// mac address da placa receptora (troque para o mac da sua placa)
uint8_t macAddress[] = { 0x68, 0x67, 0x25, 0x2D, 0xC6, 0x5C };
// Estrutura para enviar dados e receber
typedef struct struct_message {
uint8_t botaoId;
uint8_t origem;
} struct_message;
struct_message dadosEnviar;
struct_message dadosReceber;
void setup() {
esp_now_register_send_cb(esp_now_send_callback); // Registra a função de callback de transmissao
//Registra o receptor
memcpy(peerInfo.peer_addr, macAddress, 6); // Copia o endereço MAC do receptor
peerInfo.channel = 0; // Configura o canal do ESP-NOW
peerInfo.encrypt = false; // Configura a criptografia
// Adiciona o receptor
if (esp_now_add_peer(&peerInfo) != ESP_OK) { // Verifica se o receptor foi adicionado
Serial.println("Falha ao adicionar o Receptor"); // Exibe uma mensagem de erro
return; // Retorna
}
esp_now_register_recv_cb(esp_now_recv_cb_t(OnDataRecv));
// Funcao callback de recepcao
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
//imprime mensagem recebida
Serial.print("Mensagem recebida de: ");
for (int i = 0; i < 6; i++) {
Serial.print(mac[i], HEX);
if (i < 5) Serial.print(":");
}
memcpy(&dadosReceber, incomingData, sizeof(dadosReceber));
if (dadosReceber.origem == ID) return;
Serial.println();
Serial.print("Bytes received: ");
Serial.println(len);
Serial.print("Origem do ID: ");
Serial.println(dadosReceber.origem);
if (dadosReceber.botaoId == 1) {
estadoLED = !estadoLED;
digitalWrite(LED_VERMELHO, estadoLED);
}
}
void loop() {
button.update(); // Funcao para leitura do estado botao
if(button.wasPressed()){ // Verifica o estado do botao
Serial.println("BOTAO PRESSIONADO");
dadosEnviar.botaoId = 2; // Envia o id do botao apertado
dadosEnviar.origem = ID; // Envia o id da placa origem
// Funcao de envio de mensagem via espnow
esp_now_send(macAddress, (uint8_t *) &dadosEnviar, sizeof(dadosEnviar));
}
delay(200);
}
Também fizemos o uso de uma biblioteca button para manipular o botão e tratar debounce. Para isso adicione os arquivos button.cpp e button.h ao seu sketch.
Abaixo o código para a Franzininho WiFi, com diferença na pinagem, id, endereço MAC e mensagem do id do botão.
/*
Placa Franzininho WiFi Lab01
*/
#define LED_VERDE 13 // Pino do LED Verde
#define BOTAO_1 7 // Pino do Botão 1
#define ID 1 // Identificador unico
Button button(BOTAO_1); // Cria classe button
//mac address da placa (troque para o mac da sua placa)
uint8_t macAddress[] = { 0x40, 0x4C, 0xCA, 0x56, 0xB6, 0x74 };
if (dadosReceber.botaoId == 2) { // alteracao da funcao OnDataRecv
estadoLED = !estadoLED;
digitalWrite(LED_VERDE, estadoLED);
}
// Alteração no loop para a outra placa
dadosEnviar.botaoId = 1;
dadosEnviar.origem = ID;
esp_now_send(macAddress, (uint8_t *)&dadosEnviar, sizeof(dadosEnviar));
Resultados

À esquerda, temos o monitor serial do ESP32-C6, e à direita, o da Franzininho WiFi Lab01. Podemos observar que, ao pressionar um botão no ESP32-C6, a Franzininho recebe a mensagem via ESP-NOW e executa a ação correspondente, por exemplo, acendendo um LED.
Ao pressionar novamente, a mesma mensagem é enviada, e o LED é desligado.
O mesmo comportamento ocorre no sentido inverso: ao pressionar um botão na Franzininho, o ESP32-C6 recebe os dados e altera o estado do LED local. Isso confirma que a comunicação bidirecional entre as duas placas está ocorrendo com sucesso, de forma estável e sem necessidade de conexão Wi-Fi.
Quer aprender a desenvolver projetos profissionais para ESP32 usando o Arduino? Confira o curso: Domine o ESP32 com Arduino: Da Base aos Projetos Avançados, Um Curso completo de ESP32 com Arduino: programação, conectividade e projetos.
Conclusão
Neste artigo, mostramos como utilizar o protocolo ESP-NOW para realizar a comunicação direta entre duas placas ESP32, sem a necessidade de internet ou roteadores. O projeto demonstrou como botões em uma placa podem controlar LEDs em outra, de forma rápida, confiável e com baixo consumo de energia.
O ESP-NOW se apresenta como uma alternativa poderosa e prática para comunicação entre dispositivos ESP, abrindo portas para aplicações robustas em campo, automação residencial e projetos de baixo custo.
Convidamos você a explorar o potencial do ESP-NOW em seus próprios projetos e a compartilhar seus resultados com a comunidade, seja por meio de artigos, vídeos ou tutoriais.




