#define seta_emergencia 23
int emergencia=0;
int seta_pulsada=0;
int l=0;
//Condiciones para salir del estado de emergencia
int condicion1=0; //Que la seta esté pulsada 3 segundos seguidos
int condicion2=0; //Suelto la seta cuando ya se ha cumplido la condicion1
hw_timer_t *timer4 = NULL;
//Con otro de los Timers que tengo, configuro la lectura del pulsador para ver si está 3 segundos seguidos pulsado
void modo_emergencia()
{
l++; //Para llegar a 3 segundos "l" tiene que valer 3000
if(digitalRead(seta_emergencia)==0)
seta_pulsada=0;
if(l==3000 && seta_pulsada==1) //Han pasado 3 segundos
{
l=0;
condicion1=1;
}
if(l==3000)
l=0;
if(condicion1==1 && digitalRead(seta_emergencia)==0)
condicion2==1;
if(condicion2==1 && l==3000)
{
condicion1=0;
l=0;
condicion2=0;
emergencia=0;
}
}
void entrada_emergencia()
{
//detachInterrupt(digitalPinToInterrupt(seta_emergencia));
emergencia=1;
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()
{
if(condicion1==1)
timerAlarm(timer4,3e6, false, 0);
}
void setup()
{
Serial.begin(115200);
//TIMER
timer4 = timerBegin(10e5); //Configuramos la frecuencia a 1 millón
timerAttachInterrupt(timer4, &modo_emergencia);
}
void loop()
{
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)
attachInterrupt(digitalPinToInterrupt(seta_emergencia),salida_emergencia,FALLING);
Serial.printf("emergencia %d \n", emergencia);
Serial.printf("cuenta %d \n", l);
}