// Definimos los ESTADOS
#define ESTADO_A 0 //Todo apagado
#define ESTADO_B 1 //El LED cambia de estado(encendido/apagado)
#define ESTADO_C 2 //El LED parpadea(500ms ON/500ms OFF)
volatile int estado = ESTADO_A; //Inicializamos la variable estado al primer estado
#define pulsador 32
#define led 14
volatile bool pulsado = false;
volatile bool timer_activado = false;
volatile int counter = 0;
hw_timer_t *timer = NULL;
void IRAM_ATTR ISR_pulsador() {
if (digitalRead(pulsador) == LOW) { //Si se pulsa el botón
counter = 0;
timerStart(timer);
pulsado = true;
}
else { //Si se suelta el botón
timerStop(timer);
if (counter < 2) {
if (estado == ESTADO_A) {
estado = ESTADO_B;
}
else {
estado = ESTADO_A;
}
}
else {
if (estado == ESTADO_A) {
estado = ESTADO_C;
timerStart(timer);
}
}
pulsado = false;
counter = 0;
}
}
void IRAM_ATTR TimerOn() {
counter++;
timer_activado = true;
}
void setup() {
Serial.begin(115200);
pinMode(pulsador, INPUT_PULLUP);
pinMode(led, OUTPUT);
attachInterrupt(digitalPinToInterrupt(pulsador), ISR_pulsador, CHANGE);
//Configuración del timer
timer = timerBegin(1000000);
timerAttachInterrupt(timer, &TimerOn);
timerAlarm(timer, 500000, true, 0);
timerStop(timer);
}
void loop() {
switch (estado) {
case ESTADO_A:
digitalWrite(led, LOW);
Serial.println("ESTADO_A");
break;
case ESTADO_B:
digitalWrite(led, HIGH);
Serial.println("ESTADO_B");
break;
case ESTADO_C:
//Parpadeo del LED 500ms ON 500ms OFF usando el counter
if (counter %2 == 0) {
digitalWrite(led, HIGH);
}
else {
digitalWrite(led, LOW);
}
Serial.println("ESTADO_C");
break;
}
delay(20);
}