#define GPIO_BOTAO 5 // Pino do botão
#define GPIO_LED 2 // Pino do LED
#define TEMPO_DEBOUNCE 10 // ms para debounce
volatile int contador_acionamentos = 0;
volatile unsigned long timestamp_ultimo_acionamento = 0;
hw_timer_t *timer = NULL; // Ponteiro para o temporizador
volatile bool ledState = false; // Estado do LED
/* Função ISR para o botão */
void IRAM_ATTR funcao_ISR() {
// Conta acionamentos do botão considerando debounce
if ((millis() - timestamp_ultimo_acionamento) >= TEMPO_DEBOUNCE) {
contador_acionamentos++;
timestamp_ultimo_acionamento = millis();
}
}
/* Função ISR do temporizador */
void IRAM_ATTR onTimer() {
ledState = !ledState; // Alterna o estado do LED
digitalWrite(GPIO_LED, ledState); // Atualiza o LED
}
void setup() {
Serial.begin(115200);
// Configura GPIOs
pinMode(GPIO_BOTAO, INPUT_PULLUP); // Botão com pull-up interno
pinMode(GPIO_LED, OUTPUT); // LED como saída
digitalWrite(GPIO_LED, LOW); // LED começa desligado
// Configura interrupção externa para o botão
attachInterrupt(digitalPinToInterrupt(GPIO_BOTAO), funcao_ISR, FALLING);
// Configura o temporizador
timer = timerBegin(0, 80, true); // Temporizador 0, prescaler 80 (1 µs por tick)
timerAttachInterrupt(timer, &onTimer, true); // Associa a função ao temporizador
timerAlarmWrite(timer, 1000000, true); // Configura o alarme para 1 segundo (1.000.000 µs)
timerAlarmEnable(timer); // Ativa o alarme do temporizador
Serial.println("Sistema iniciado. LED alternará a cada 1 segundo.");
}
void loop() {
// Exibe a contagem de acionamentos do botão
Serial.print("Acionamentos do botão: ");
Serial.println(contador_acionamentos);
delay(1000); // Atualização a cada 1 segundo
}