//EJERCICIO TEMA 6 PAGINA 26
#define led1 26
#define boton 27
volatile bool btn1 = false; //estado del boton
volatile bool t1 = false; // variable que dice si ha pasado o no 1s
int state = 0; // estado en el que me encuentro
//timer1 = 500ms
hw_timer_t * timer1 = NULL;
//timer2 = 1s
hw_timer_t * timer2 = NULL;
//ISR_boton = interrupcion del boton
void IRAM_ATTR ISR_boton() {
btn1 = true;
}
//ISR_parpaedo =
void IRAM_ATTR ISR_parpadeo() {
digitalWrite(led1, !(digitalRead(led1))); //cambia el estado del led
}
//ISR_pulsacion = interrupcion que pone a true t1, que hace que se active el timer 2
void IRAM_ATTR ISR_pulsacion() {
t1 = true;
}
void setup() {
Serial.begin(115200);
pinMode(led1, OUTPUT);
pinMode(boton, INPUT_PULLUP);
digitalWrite(led1, LOW); //empieza con el led apagado
attachInterrupt(digitalPinToInterrupt(boton), ISR_boton, RISING);
timer1 = timerBegin(0, 80, true);
timerAttachInterrupt(timer1, &ISR_parpadeo, true);
timerAlarmWrite(timer1, 500000, true); //500 000 para 500ms
timer2 = timerBegin(0, 80, true);
timerAttachInterrupt(timer2, &ISR_pulsacion, true);
timerAlarmWrite(timer2, 1000000, true); //1 000 000 para 1s
}
void loop() {
switch (state) {
case 0: //CASO 0
if (btn1 == true) { //si se ha pulsado el boton
timerAlarmEnable(timer2); //activa el timer de 1s para ver si se ha pulsado mas de 1s
if (t1 == true) { //si se ha pulsado mas de 1s
timerAlarmEnable(timer1); //habilita el timer 1 y parpadea
state = 1; //cambia al estado 1
}
else { //si es menos de 1s
digitalWrite(led1, !(digitalRead(led1))); //cambia el estado del led
btn1 = false; //vuelve a poner a falso el boton
}
}
break;
case 1: //CASO 1
if (btn1 == true) { //si se ha pulsado el boton
timerAlarmEnable(timer2); //activa el timer de 1s para ver si se ha pulsado mas de 1s
if (t1 == true) { //si se ha pulsado mas de 1s
ISR_parpadeo(); //activa el parpadeo
state = 1; //cambia al estado 1
}
else { //si es menos de 1s
digitalWrite(led1, !(digitalRead(led1))); //cambia el estado del led
btn1 = false; //vuelve a poner a falso el boton
state = 0; //cambia al estado 0
}
}
break;
}
}