#include <esp_now.h> // Biblioteca do protocolo ESPNOW, que permite a comunicação sem fio entre dispositivos sem usar WiFi
#include <WiFi.h> // Biblioteca para configurar o WiFi, necessário para inicializar o ESPNOW
// Endereço MAC do ESP8266 receptor (substitua pelos valores reais do dispositivo ESP8266)
uint8_t MACAddressReceptor[] = {0x48, 0x3F, 0xDA, 0x7E, 0x1E, 0x7B};
// Estrutura de dados para enviar o estado do botão
typedef struct struct_message
{
bool buttonState; // Esta variável armazena o estado do botão (true = pressionado, false = não pressionado)
} struct_message;
struct_message DadoParaEnviar; // Instância da estrutura que será enviada
// Função de callback chamada automaticamente quando os dados são enviados
void EnviarDados(const uint8_t *mac_addr, esp_now_send_status_t status)
{
if (status == ESP_NOW_SEND_SUCCESS)
{ // Verifica se o envio foi bem-sucedido
Serial.println("Envio bem-sucedido"); // Exibe no monitor serial se os dados foram enviados com sucesso
}
else
{
Serial.println("Falha no envio"); // Exibe uma mensagem de falha no envio
}
}
void setup()
{
// Inicializa a comunicação serial para fins de debug, permitindo ver informações no computador
Serial.begin(115200);
// Configura o pino do botão (GPIO27 no ESP32) como entrada com resistência pull-up interna
pinMode(27, INPUT_PULLUP);
// Configura o WiFi no modo "Station" (somente necessário para o ESPNOW)
WiFi.mode(WIFI_STA);
// Inicializa o protocolo ESPNOW
if (esp_now_init() != ESP_OK)
{ // Verifica se a inicialização foi bem-sucedida
Serial.println("Erro ao inicializar ESP-NOW"); // Exibe uma mensagem de erro se não conseguiu inicializar
return; // Sai da função se houve erro
}
// Exibe uma mensagem no monitor serial confirmando a inicialização bem-sucedida
Serial.println("ESP-NOW inicializado com sucesso!");
// Registra a função de callback para ser chamada sempre que um envio de dados for feito
esp_now_register_send_cb(EnviarDados); //Oh ESP32, toda vez que você for enviar dados, você deve chamar
//essa função que eu estou registrando para ser chamada.
// Configura o peer (dispositivo receptor, neste caso, o ESP8266)
esp_now_peer_info_t peerInfo;
memcpy(peerInfo.peer_addr, MACAddressReceptor, 6); // Copia o endereço MAC do ESP8266 para o peerInfo
peerInfo.channel = 0; // Define o canal de comunicação (0 para qualquer canal)
peerInfo.encrypt = false; // Desativa a criptografia, deixando a comunicação aberta
// Adiciona o receptor à lista de peers (dispositivos para enviar os dados)
if (esp_now_add_peer(&peerInfo) != ESP_OK)
{ // Verifica se o peer foi adicionado com sucesso
Serial.println("Erro ao adicionar peer"); // Exibe uma mensagem de erro se não conseguiu adicionar
return;
}
}
void loop()
{
// Lê o estado do botão (GPIO27), LOW indica que o botão está pressionado
bool EstadoBotao = digitalRead(27);
// Exibe o estado do botão no monitor serial para debug
Serial.print("Estado do botao: ");
Serial.println(EstadoBotao);
// Prepara os dados para envio, atribuindo o estado do botão à estrutura
DadoParaEnviar.buttonState = EstadoBotao;
//A variável buttonState está associada à variável DadoParaEnviar e receberá o valor da variável
//EstadodoBotao.
//Desse modo, eu conseguirei guardar dentro da estrutura para enviar através do protocolo ESPNOW.
// Envia os dados (estado do botão) para o endereço MAC do ESP8266 receptor
esp_now_send(MACAddressReceptor, (uint8_t *) &DadoParaEnviar, sizeof(DadoParaEnviar));
// Aguarda meio segundo antes de verificar o botão novamente
delay(500);
}