//mmggjj17
#include <Ticker.h>
#define ledPin 13
#define button 33
#define ESTADO_0 0 // LED apagado
#define ESTADO_1 1 // LED parpadeo lento (1s)
#define ESTADO_2 2 // LED parpadeo rápido (0.5s)
volatile bool pulsarButton = false;
volatile bool soltarButton = false;
volatile bool timer1ms = false;
volatile int state = ESTADO_0;
volatile int counter = 0; // Contador para el tiempo de pulsación del botón
Ticker miTicker;
void IRAM_ATTR cambiarEstadoLED() {
digitalWrite(ledPin, !digitalRead(ledPin));
}
void IRAM_ATTR buttonISR() {
if (!digitalRead(button)) { // Flanco de bajada (botón presionado)
pulsarButton = true;
counter = 0; // Iniciar contador al presionar el botón
miTicker.attach_ms(1, timerON); // Contar en milisegundos
} else { // Flanco de subida (botón soltado)
soltarButton = true;
miTicker.detach(); // Detener el contador
}
}
void timerON() {
counter++;
}
void FineStateMachine() {
switch (state) {
case ESTADO_0: // Estado 0: LED apagado
digitalWrite(ledPin, LOW);
if (pulsarButton && soltarButton) {
// Cambio al estado 1 si el botón se presionó menos de 1 segundo
if (counter < 1000) {
state = ESTADO_1;
miTicker.attach(1, cambiarEstadoLED); // Parpadeo cada 1 segundo
}
// Cambio al estado 2 si el botón se presionó más de 1 segundo
else {
state = ESTADO_2;
miTicker.attach(0.5, cambiarEstadoLED); // Parpadeo cada 0.5 segundos
}
pulsarButton = false;
soltarButton = false;
}
break;
case ESTADO_1: // Estado 1: Parpadeo lento (1 segundo)
if (pulsarButton && soltarButton) {
state = ESTADO_0; // Volver al estado 0 al soltar el botón
pulsarButton = false;
soltarButton = false;
miTicker.detach(); // Detener parpadeo
}
break;
case ESTADO_2: // Estado 2: Parpadeo rápido (0.5 segundos)
if (pulsarButton && soltarButton) {
state = ESTADO_0; // Volver al estado 0 al soltar el botón
pulsarButton = false;
soltarButton = false;
miTicker.detach(); // Detener parpadeo
}
break;
}
}
void setup() {
Serial.begin(9600);
pinMode(button, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
attachInterrupt(button, buttonISR, CHANGE); // Interrupción en ambos flancos
}
void loop() {
FineStateMachine();
// Serial.println(state);
delay(10);
}