#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[10000];
int i=0;
int NOcumple=0;
//Condiciones para salir del estado de emergencia
int condicion1=0; //Que la seta esté pulsada 3 segundos seguidos
int condicion2=0;//Cuando condicion2 vale 1, significa que se cumplen los requisitos para volver al modo normal
int x=0; //Para ver cuando hace la condicion de salir del estado de emergencia
int salir=0; //Me indica que estoy intentando salir del modo de emergencia
hw_timer_t *timer4 = NULL;
void modo_emergencia()
{
salir=1;
i=0; //Se inicializa al pasar 3 segundos
if(condicion1==1)
condicion2=1;
for(int e=0; e<i; e++)
{
if(seta_pulsada[e]==0)
NOcumple=1;
// seta_pulsada[e]=1; //Para que la siguiente vez que se haga no tenga en cuenta estas posiciones
// "i" se sigue incrementando (no se inicializa)
}
if(NOcumple==0) //Han pasado 3 segundos y el pulsador ha estado todo el rato pulsado
condicion1=1;
if(condicion1==1 && condicion2==1) //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
{
x=1;
condicion1=0;
condicion2=0;
emergencia=0;
digitalWrite(LED2,LOW);
i=0;
}
}
void entrada_emergencia()
{
detachInterrupt(digitalPinToInterrupt(seta_emergencia));
if(emergencia==1)
{
timerAlarm(timer4,3e6, false, 0); //Alarma cada 3 s (solo se ejecuta 1 vez cuando presiono el pulsador "false")
seta_pulsada[i]=1;
i++;
NOcumple=0;
}
emergencia=1; //Entro en el modo emergencia
digitalWrite(LED2,HIGH);
//digitalWrite(LED1,LOW);
//condicion2=0;
}
void salida_emergencia()
{
detachInterrupt(digitalPinToInterrupt(seta_emergencia));
if(condicion1==0 && salir==1) //Si estamos saliendo de emergencia y suelto pulsador antes de que hayan pasado 3 segundos
{
seta_pulsada[i]=0;
i++;
}
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);
if(x==1)
Serial.println("x");
delay(10);
}