#define seta_emergencia 19 //?¿?¿¿??¿Se pueden usar estos pines???¿?¿?¿¿
#define LED2 18 // !!!! Se apaga por la cara ¡¡¡¡ --> Solo se puede apagar en la línea 26
//La condicion2 no se cumple nunca y aún así se apaga
int emergencia=0;
int seta_pulsada=0;
//Condiciones para salir del estado de emergencia
int condicion1=0; //Que la seta esté pulsada 3 segundos seguidos
int condicion2=0;//Cuando condicion 2 vale 2, significa que se cumplen los requisitos para volver al modo normal
hw_timer_t *timer4 = NULL;
void modo_emergencia()
{
condicion2++;
if(seta_pulsada==1) //Han pasado 3 segundos y el pulsador ha estado todo el rato pulsado
condicion1=1;
if(condicion1==1 && condicion2==2) //Entra por la cara a esta condición aunque NO se cumpla
//condicion2 NO es igual a 2 en NINGÚN momento y aún así entra
{
condicion1=0;
condicion2=0;
emergencia=0;
digitalWrite(LED2,LOW);
}
}
void entrada_emergencia()
{
detachInterrupt(digitalPinToInterrupt(seta_emergencia));
emergencia=1;
condicion2=0;
digitalWrite(LED2,HIGH);
//digitalWrite(LED1,LOW);
seta_pulsada=1;
timerAlarm(timer4,3e6, false, 0); //Alarma cada 3 s (solo se ejecuta 1 vez cuando presiono el pulsador "false")
}
void salida_emergencia()
{
detachInterrupt(digitalPinToInterrupt(seta_emergencia));
if(condicion1==0 && emergencia==1) //Si estamos en emergencia y suelto pulsador antes de que hayan pasado 3 segundos
seta_pulsada=0;
if(condicion1==1)
timerAlarm(timer4,3e6, false, 0);
}
void setup()
{
Serial.begin(115200);
pinMode(seta_emergencia, INPUT);
pinMode(LED2, OUTPUT);
//TIMER
timer4 = timerBegin(10e5); //Configuramos la frecuencia a 1 millón
timerAttachInterrupt(timer4, &modo_emergencia);
}
void loop()
{
//No se pueden poner dos interrupciones en un mismo pulsador a la vez, no funciona bien --> Pongo condiciones para que solo haya una única interrupción al mismo tiempo
if(digitalRead(seta_emergencia)==0)
attachInterrupt(digitalPinToInterrupt(seta_emergencia),entrada_emergencia,RISING); //Lo pongo en loop ya que elimino los rebotes (desactivo la interrupción en la propia ISR --> tengo que volver a activarla)
if(digitalRead(seta_emergencia)==1)
attachInterrupt(digitalPinToInterrupt(seta_emergencia),salida_emergencia,FALLING);
Serial.printf("emergencia %d \n", emergencia);
//Serial.printf("condicion1 %d \n", condicion1);
Serial.printf("condicion2 %d \n", condicion2);
//Serial.printf("setapulsada %d \n", seta_pulsada);
}