#include <esp_now.h>
#include <WiFi.h>
// Definição dos pinos dos LEDs (baseado no seu diagrama)
const int LED_PINS[] = {23, 21, 5, 2}; // GPIO 23, 21, 18, 4
const int NUM_LEDS = 4;
// Estrutura para receber dados.
// Certifique-se de que a estrutura é a mesma usada pelo transmissor.
typedef struct struct_message {
int ledStates[NUM_LEDS]; // Array para os estados (HIGH/LOW) dos 4 LEDs
} struct_message;
struct_message incomingData;
// =================================================================
// FUNÇÃO DE CALLBACK PARA RECEBIMENTO DE DADOS (CORRIGIDA)
// =================================================================
// A assinatura correta agora inclui 'const esp_now_recv_info * info'
void OnDataRecv(const esp_now_recv_info * info, const uint8_t * incomingDataBuffer, int len) {
// O endereço MAC do remetente está agora em info->src_addr
const uint8_t * mac_addr = info->src_addr;
// Verifica se o tamanho do dado recebido é o esperado
if (len == sizeof(incomingData)) {
// Copia o buffer de bytes recebido para a sua estrutura local
memcpy(&incomingData, incomingDataBuffer, sizeof(incomingData));
Serial.print("Dados recebidos de: ");
for (int i = 0; i < 6; i++) {
Serial.printf("%02X", mac_addr[i]);
if (i < 5) Serial.print(":");
}
Serial.println();
// Atualiza o estado dos LEDs
for (int i = 0; i < NUM_LEDS; i++) {
digitalWrite(LED_PINS[i], incomingData.ledStates[i]);
Serial.printf("LED %d (GPIO%d): %s\n", i + 1, LED_PINS[i], incomingData.ledStates[i] == HIGH ? "LIGADO" : "DESLIGADO");
}
Serial.println("---");
} else {
Serial.printf("Erro: Tamanho de dados inesperado (%d bytes recebidos).\n", len);
}
}
// =================================================================
void setup() {
Serial.begin(115200);
// Configura os pinos dos LEDs como OUTPUT
for (int i = 0; i < NUM_LEDS; i++) {
pinMode(LED_PINS[i], OUTPUT);
digitalWrite(LED_PINS[i], LOW); // Inicia todos desligados
}
// Define o dispositivo como uma Station Wi-Fi
WiFi.mode(WIFI_STA);
// Inicializa o ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Erro ao inicializar ESP-NOW");
return;
}
Serial.println("ESP-NOW inicializado com sucesso!");
// Registra a função de callback para recepção de dados
// *** ESTA É A LINHA QUE AGORA ACEITA A NOVA ASSINATURA ***
esp_now_register_recv_cb(OnDataRecv);
}
void loop() {
// A maior parte do trabalho é feita dentro da função de callback OnDataRecv
// quando os dados chegam. O loop pode estar vazio ou ter alguma outra lógica.
}