ESP32-C6 na Prática: Comunicação Bidirecional sem Wi-Fi usando ESP-NOW

Este post faz parte da série ESP32-C6 na Prática

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.

Figura 1: Circuito desenvolvido

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

Figura 2: Aplicação do ESP-NOW
Figura 3: Monitor serial com 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.

Referências

ESP32-C6 na Prática

ESP32-C6 na Prática: Sincronizando a Hora com NTP Server ESP32-C6 na Prática: Comunicação MQTT
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
0 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Home » Internet Das Coisas » ESP32-C6 na Prática: Comunicação Bidirecional sem Wi-Fi usando ESP-NOW

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: