/**
* @file main.cpp
* @brief Monitor de eventos para testes de hardware (ESP32).
* * Este código mapeia botões para saídas (LEDs/Relés) e reporta
* cada transição de estado via Serial, garantindo uma saída de
* log limpa, alinhada e fácil de depurar.
*/
#include <Arduino.h>
#include <vector>
#include <memory>
/**
* @brief Estrutura que define a associação entre botão e saída.
*/
struct EventBinding
{
uint8_t buttonPin;
uint8_t outputPin;
bool lastState;
};
/**
* @brief Classe responsável pelo monitoramento e log dos eventos.
*/
class EventMonitor
{
public:
EventMonitor()
{
// Mapeamento definido para o seu projeto no Wokwi
bindings = {
{13, 4, HIGH},
{14, 16, HIGH},
{25, 17, HIGH},
{26, 5, HIGH},
{27, 22, HIGH},
{33, 23, HIGH}
};
for (auto& b : bindings)
{
pinMode(b.buttonPin, INPUT_PULLUP);
pinMode(b.outputPin, OUTPUT);
digitalWrite(b.outputPin, LOW);
}
Serial.println("[SYSTEM] Monitor de eventos iniciado.");
}
/**
* @brief Loop de verificação dos estados dos botões.
*/
void poll()
{
for (auto& b : bindings)
{
processEvent(b);
}
}
private:
std::vector<EventBinding> bindings;
/**
* @brief Processa a detecção de borda e log do evento.
* * @param b Referência ao objeto de associação entre botão e saída.
*/
void processEvent(EventBinding& b)
{
bool currentState = digitalRead(b.buttonPin);
if (currentState == b.lastState)
{
return;
}
// Debounce simples para estabilidade
delay(20);
if (digitalRead(b.buttonPin) != currentState)
{
return;
}
b.lastState = currentState;
// Log sequencial forçado em linhas separadas para alinhamento
Serial.print("[EVENT] BTN:");
Serial.print(b.buttonPin);
Serial.print(" -> OUT:");
Serial.print(b.outputPin);
if (currentState == LOW)
{
Serial.println(" ATIVADO");
digitalWrite(b.outputPin, HIGH);
}
else
{
Serial.println(" DESATIVADO");
digitalWrite(b.outputPin, LOW);
}
}
};
// Gerenciador global instanciado via smart pointer
std::unique_ptr<EventMonitor> monitor;
void setup()
{
Serial.begin(115200);
monitor = std::make_unique<EventMonitor>();
}
void loop()
{
if (monitor)
{
monitor->poll();
}
}