#define BotonA 34
#define BotonF 35
#define BotonP 32
#define BotonD 33
#define BotonO 26
#define BotonR 2
#define BotonW 4
#define LEDE 16
#define LEDA 5
#define LEDF 17
#define LEDW 0
// Punteros a los timers del hardware
hw_timer_t *timer1 = NULL;
volatile bool buttonA_released = false; // Variable para guardar el estado del botón A
volatile bool buttonF_released = false; // Variable para guardar el estado del botón F
volatile bool buttonP_released = false; // Variable para guardar el estado del botón P
volatile bool buttonD_released = false; // Variable para guardar el estado del botón D
volatile bool buttonO_released = false; // Variable para guardar el estado del botón O
volatile bool known_warning = false; // Variable para guardar el estado del botón R
volatile bool warning = false; // Variable para guardar el estado del botón W
volatile bool timer1_activated = false; // Variable volátil para indicar cuando se ha producido la interrupción 1
volatile int state = 0;
void IRAM_ATTR timer1Interrupt()
{
digitalWrite(LEDW,!digitalRead(LEDW));
}
void IRAM_ATTR BAReleased()
{
Serial.println("Boton Armar pulsado");
buttonA_released = true;
}
void IRAM_ATTR BFReleased()
{
Serial.println("Boton Funcionamiento pulsado");
buttonF_released = true;
}
void IRAM_ATTR BPReleased()
{
Serial.println("Boton Parada pulsado");
buttonP_released = true;
}
void IRAM_ATTR BDReleased()
{
Serial.println("Boton Desarmar pulsado");
buttonD_released = true;
}
void IRAM_ATTR BWReleased()
{
Serial.println("Boton WARNING");
warning = true;
}
void IRAM_ATTR BRReleased()
{
Serial.println("Alerta Conocida");
known_warning = true;
}
void IRAM_ATTR BOReleased()
{
Serial.println("Se Desactiva Alerta ");
buttonO_released = true;
}
void setup() {
Serial.begin(115200);
pinMode(BotonA, INPUT_PULLUP);
pinMode(BotonF, INPUT_PULLUP);
pinMode(BotonP, INPUT_PULLUP);
pinMode(BotonD, INPUT_PULLUP);
pinMode(BotonW, INPUT_PULLUP);
pinMode(BotonR, INPUT_PULLUP);
pinMode(BotonO, INPUT_PULLUP);
pinMode(LEDE, OUTPUT);
pinMode(LEDA, OUTPUT);
pinMode(LEDF, OUTPUT);
pinMode(LEDW, OUTPUT);
attachInterrupt(digitalPinToInterrupt(BotonA), BAReleased, FALLING);
attachInterrupt(digitalPinToInterrupt(BotonF), BFReleased, FALLING);
attachInterrupt(digitalPinToInterrupt(BotonP), BPReleased, FALLING);
attachInterrupt(digitalPinToInterrupt(BotonD), BDReleased, FALLING);
attachInterrupt(digitalPinToInterrupt(BotonW), BWReleased, FALLING);
attachInterrupt(digitalPinToInterrupt(BotonR), BRReleased, FALLING);
attachInterrupt(digitalPinToInterrupt(BotonO), BOReleased, FALLING);
timer1 = timerBegin(0, 80, true); // Timer 0, divisor de reloj 80
timerAttachInterrupt(timer1, &timer1Interrupt, true); // Adjuntar la función de manejo de interrupción
timerAlarmWrite(timer1, 5e5, true);
}
void loop() {
if(warning){
digitalWrite(LEDE,LOW);
digitalWrite(LEDA,LOW);
digitalWrite(LEDF,LOW);
warning = false; // Variable para guardar el estado del botón W
state=3;
}
//
switch(state){
case 0:
digitalWrite(LEDE,HIGH);
Serial.println("Desarmada");
if(buttonA_released && !buttonF_released && !buttonP_released && !buttonD_released){
state = 1;
buttonA_released= false;
digitalWrite(LEDE,LOW);
}
break;
case 1:
digitalWrite(LEDA,HIGH);
Serial.println("Armada");
if(!buttonA_released && buttonF_released && !buttonP_released && !buttonD_released){
state = 2;
buttonF_released= false;
digitalWrite(LEDA,LOW);
}
else if(!buttonA_released && !buttonF_released && !buttonP_released && buttonD_released){
state = 0;
buttonD_released= false;
digitalWrite(LEDA,LOW);
}
break;
case 2:
digitalWrite(LEDF,HIGH);
Serial.println("Funcionamiento");
if(buttonP_released){
state = 1;
buttonP_released= false;
digitalWrite(LEDF,LOW);
}
break;
case 3:
Serial.println("WARNING!!");
timerAlarmEnable(timer1);
if(known_warning){
timerAlarmDisable(timer1);
state = 0;
known_warning= false;
digitalWrite(LEDW,LOW);
}
else if(buttonO_released){
timerAlarmDisable(timer1);
state = 0;
buttonO_released= false;
digitalWrite(LEDW,LOW);
}
timer1_activated = false;
break;
}
Serial.println(state);
delay(10); // this speeds up the simulation
}