Início Atividade 7
7
AVANÇADO 🏆 PROJETO FINAL

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:

descobrir_mac.ino
#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_espnow.ino
/*
 * 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_espnow.ino
/*
 * 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. 1
    Descubra o MAC de cada placa usando o código auxiliar
  2. 2
    Atualize o MAC no código do transmissor (linha macDestino[])
  3. 3
    Faça upload do código RECEPTOR em uma placa
  4. 4
    Faça upload do código TRANSMISSOR na outra placa
  5. 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
← Voltar ao Início

📝 Quiz Final - Teste seus Conhecimentos

🏆

Quiz Final da Primeira Etapa!

Complete este quiz para receber o certificado de conclusão!

Carregando quiz...