#define BOTAO_A 5
#define BOTAO_B 18
#define LED 13
hw_timer_t *timer = NULL;
volatile bool piscar = false;
int contagem = 0;
bool estadoAnteriorA = HIGH;
bool estadoAnteriorB = HIGH;
unsigned long ultimoCliqueA = 0;
unsigned long ultimoCliqueB = 0;
int intervalo = 100000; // 10 Hz padrão
void IRAM_ATTR onTimer() {
piscar = true;
}
void configurarTimer(int novoIntervalo) {
timerAlarm(timer, novoIntervalo, true, 0);
}
void setup() {
pinMode(BOTAO_A, INPUT_PULLUP);
pinMode(BOTAO_B, INPUT_PULLUP);
pinMode(LED, OUTPUT);
timer = timerBegin(1000000);
timerAttachInterrupt(timer, &onTimer);
configurarTimer(intervalo);
}
void loop() {
bool estadoA = digitalRead(BOTAO_A);
bool estadoB = digitalRead(BOTAO_B);
// BOTÃO A (contagem)
if (estadoAnteriorA == HIGH && estadoA == LOW) {
if (millis() - ultimoCliqueA > 300) {
contagem++;
ultimoCliqueA = millis();
}
}
estadoAnteriorA = estadoA;
// BOTÃO B (muda frequência)
if (estadoAnteriorB == HIGH && estadoB == LOW) {
if (millis() - ultimoCliqueB > 300) {
intervalo = 1000000; // 1 Hz
configurarTimer(intervalo);
ultimoCliqueB = millis();
}
}
estadoAnteriorB = estadoB;
// ativa após 5 cliques
if (contagem >= 5) {
contagem = 0;
unsigned long inicio = millis();
while (millis() - inicio < 10000) {
if (piscar) {
piscar = false;
digitalWrite(LED, !digitalRead(LED));
}
}
digitalWrite(LED, LOW);
// volta para 10 Hz depois
intervalo = 100000;
configurarTimer(intervalo);
}
}