Comunicação ESP-NOW 📻
Faça duas placas ESP32 conversarem sem Wi-Fi usando comunicação P2P
🎯 Projeto Final da Primeira Etapa
Você vai criar um controle remoto! Uma placa será o transmissor (com botão) e outra será o receptor (com LED). Quando apertar o botão no transmissor, o LED do receptor vai piscar - sem precisar de roteador Wi-Fi!
📚 O que é ESP-NOW?
ESP-NOW é um protocolo de comunicação criado pela Espressif (fabricante do ESP32) que permite comunicação direta entre placas, sem precisar de roteador ou internet!
✅ Vantagens
- • Comunicação instantânea (~4ms)
- • Não precisa de roteador Wi-Fi
- • Baixo consumo de energia
- • Alcance de ~200 metros
⚠️ Limitações
- • Máximo 250 bytes por mensagem
- • Até 20 pares conectados
- • Sem criptografia forte
💡 Analogia: É como um walkie-talkie! Duas pessoas se comunicam diretamente pelo rádio, sem precisar de torre de celular.
🏗️ Arquitetura do Projeto
TRANSMISSOR
Placa com botão
Envia comandos
RECEPTOR
Placa com LED
Recebe e executa
🔑 Passo 1: Descobrir o MAC Address
Antes de tudo, precisamos saber o MAC Address de cada placa. É como saber o número de telefone para poder ligar!
Execute este código em cada uma das placas e anote os MACs:
#include
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
Serial.print("MAC Address: ");
Serial.println(WiFi.macAddress());
}
void loop() { }
📝 Anote os MACs!
Placa 1 (Receptor): __:__:__:__:__:__
Placa 2 (Transmissor): __:__:__:__:__:__
📥 Código do RECEPTOR (Placa com LED)
/*
* RECEPTOR ESP-NOW (LÂMPADA)
* Hardware: RoboCore IoT DevKit
*/
#include
#include
const int PINO_LED = 13; // LED nativo da RoboCore
// Estrutura da mensagem (IGUAL ao transmissor!)
typedef struct mensagem_t {
char comando[32];
int valor;
} mensagem_t;
mensagem_t mensagemRecebida;
// Função que roda quando chega mensagem
void aoReceber(const uint8_t * mac, const uint8_t *incomingData, int len) {
memcpy(&mensagemRecebida, incomingData, sizeof(mensagemRecebida));
Serial.print("Mensagem recebida: ");
Serial.println(mensagemRecebida.comando);
// Se o comando for LIGAR_LED, pisca 3 vezes
if (strcmp(mensagemRecebida.comando, "LIGAR_LED") == 0) {
Serial.println("---> COMANDO ACEITO: PISCANDO LED! 💡");
for(int i=0; i<3; i++){
digitalWrite(PINO_LED, HIGH);
delay(200);
digitalWrite(PINO_LED, LOW);
delay(200);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(PINO_LED, OUTPUT);
WiFi.mode(WIFI_STA);
if (esp_now_init() != ESP_OK) {
Serial.println("Erro ESP-NOW");
return;
}
// Registra a função que fica "ouvindo"
esp_now_register_recv_cb(esp_now_recv_cb_t(aoReceber));
Serial.println("📻 Esperando comandos via Rádio (ESP-NOW)...");
}
void loop() {
// O loop fica livre! ESP-NOW funciona por interrupção.
}
📤 Código do TRANSMISSOR (Placa com Botão)
⚠️ IMPORTANTE: Você precisa substituir o MAC Address na linha 8 pelo MAC da placa RECEPTORA que você anotou!
/*
* TRANSMISSOR ESP-NOW (CONTROLE REMOTO)
* Hardware: RoboCore IoT DevKit
*/
#include
#include
// ⚠️ COLOQUE AQUI O MAC DA PLACA RECEPTORA!
uint8_t macDestino[] = {0xF8, 0xB3, 0xB7, 0x33, 0xBA, 0x80};
const int PINO_BOTAO = 4;
// Estrutura da mensagem
typedef struct mensagem_t {
char comando[32];
int valor;
} mensagem_t;
mensagem_t minhaMensagem;
// Callback: confirma se o pacote foi entregue
void aoEnviar(const uint8_t *mac_addr, esp_now_send_status_t status) {
Serial.print("Status: ");
if (status == ESP_NOW_SEND_SUCCESS) {
Serial.println("Entregue! ✅");
} else {
Serial.println("Falha! ❌ (A outra placa está ligada?)");
}
}
void setup() {
Serial.begin(115200);
pinMode(PINO_BOTAO, INPUT);
WiFi.mode(WIFI_STA);
if (esp_now_init() != ESP_OK) {
Serial.println("Erro ao iniciar ESP-NOW");
return;
}
esp_now_register_send_cb(aoEnviar);
// Cadastra o "Amigo" (Peer)
esp_now_peer_info_t peerInfo;
memset(&peerInfo, 0, sizeof(peerInfo));
memcpy(peerInfo.peer_addr, macDestino, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
peerInfo.ifidx = WIFI_IF_STA;
if (esp_now_add_peer(&peerInfo) != ESP_OK){
Serial.println("Falha ao adicionar o par ❌");
return;
} else {
Serial.println("Par adicionado! ✅ Aperte o botão para enviar.");
}
}
void loop() {
if (digitalRead(PINO_BOTAO) == LOW) {
strcpy(minhaMensagem.comando, "LIGAR_LED");
minhaMensagem.valor = 1;
Serial.println("Enviando comando...");
esp_now_send(macDestino, (uint8_t *) &minhaMensagem, sizeof(minhaMensagem));
delay(500); // Debounce
}
}
▶️ Como Testar
-
1
Descubra o MAC de cada placa usando o código auxiliar
-
2
Atualize o MAC no código do transmissor (linha
macDestino[]) -
3
Faça upload do código RECEPTOR em uma placa
-
4
Faça upload do código TRANSMISSOR na outra placa
-
5
Aperte o botão no transmissor e veja o LED piscar no receptor! 🎉
Parabéns!
Você completou a Primeira Etapa do curso de IoT com ESP32!
✅ O que você aprendeu:
- • Digital I/O (LED e Botão)
- • Leitura Analógica (LDR)
- • Bibliotecas (DHT11)
- • Sensores I2C (Acelerômetro)
- • Comunicação Serial (LoRa)
- • Comunicação P2P (ESP-NOW)
📚 Conceitos dominados:
- • setup() e loop()
- • pinMode, digitalWrite
- • digitalRead, analogRead
- • map() e constrain()
- • Debounce
- • Callbacks e structs
🚀 Próximos passos:
- • Conectar à Internet (Wi-Fi)
- • Enviar dados para nuvem
- • Criar um servidor web
- • Controlar via app mobile
- • Integrar com MQTT
📝 Quiz Final - Teste seus Conhecimentos
Quiz Final da Primeira Etapa!
Complete este quiz para receber o certificado de conclusão!
Carregando quiz...