#define btnA 35 //boton de armada
#define btnF 32 //boton de funcionamiento
#define btnP 33 //boton de parada
#define btnD 25 //boton de desarmada
#define btnAT 21 //boton de atasco
#define btnSeg 12 //boton de seguridad
#define ledE 16 //led de desarmada
#define ledA 22 //led de maquina armada
#define ledF 23 //led de funcionamiento
#define ledAlm 2 //led de alarma
#define BUZZ 15 //pin del buzzer
volatile bool btnA_pressed = false;
volatile bool btnF_pressed = false;
volatile bool btnP_pressed = false;
volatile bool btnD_pressed = false;
volatile bool btnAT_pressed = false;
volatile bool btnSeg_pressed = false;
volatile bool t1 = false; // variable que dice si ha pasado o no 1s
int state = 0; //estado en el que se empieza
TaskHandle_t HandleTask1; //handle de la tarea
//callbacks de los botones
void IRAM_ATTR btnA_pulsado(){
btnA_pressed = true;
}
void IRAM_ATTR btnF_pulsado(){
btnF_pressed = true;
}
void IRAM_ATTR btnP_pulsado(){
btnP_pressed = true;
}
void IRAM_ATTR btnD_pulsado(){
btnD_pressed = true;
}
void IRAM_ATTR btnAT_pulsado(){
btnAT_pressed = true;
}
void IRAM_ATTR btnSeg_pulsado(){
btnSeg_pressed = true;
}
//Timer1 que sirve para la pulsacion larga
hw_timer_t * timer1 = NULL;
//ISR_pulsacion = interrupcion que pone a true t1, que hace que se active el timer 1
void IRAM_ATTR ISR_pulsacion() {
t1 = true;
}
void setup() {
Serial.begin(115200);
pinMode(btnA, INPUT_PULLUP);
pinMode(btnF, INPUT_PULLUP);
pinMode(btnP, INPUT_PULLUP);
pinMode(btnD, INPUT_PULLUP);
pinMode(btnAT, INPUT_PULLUP);
pinMode(btnSeg, INPUT_PULLUP);
pinMode(ledE, OUTPUT);
pinMode(ledA, OUTPUT);
pinMode(ledF, OUTPUT);
pinMode(ledAlm, OUTPUT);
pinMode(BUZZ, OUTPUT);
//INTERRUPCIONES DE LOS BOTONES
attachInterrupt(digitalPinToInterrupt(btnA),btnA_pulsado, RISING);
attachInterrupt(digitalPinToInterrupt(btnF),btnF_pulsado, RISING);
attachInterrupt(digitalPinToInterrupt(btnP),btnP_pulsado, RISING);
attachInterrupt(digitalPinToInterrupt(btnD),btnD_pulsado, RISING);
attachInterrupt(digitalPinToInterrupt(btnAT),btnAT_pulsado, RISING);
attachInterrupt(digitalPinToInterrupt(btnSeg),btnSeg_pulsado, RISING);
// Configuración inicial para estado 0 (DESARMADA)
digitalWrite(ledE, HIGH);
digitalWrite(ledA, LOW);
digitalWrite(ledF, LOW);
digitalWrite(ledAlm, LOW);
xTaskCreatePinnedToCore(
estados, // Function en la que se implementa la tarea
"Tarea que controla los estados", // Nombre de la tarea
100000, // Memoria (en Bytes) asignados a esta tarea
NULL, // Parámetro de entrada de la tarea (no hay ningún parámetro)
5, // Prioridad de la tarea (cuanto más alto, más prioridad)
&HandleTask1, // Handle de la tarea 1
0); // Core donde va a correr la tarea 1
timer1 = timerBegin(0, 80, true);
timerAttachInterrupt(timer1, &ISR_pulsacion, true);
timerAlarmWrite(timer1, 1000000, false); // 'false' para no repetir automáticamente
}
void loop() {
Serial.println(state);
if (btnA_pressed) btnA_pressed = false;
if (btnF_pressed) btnF_pressed = false;
if (btnP_pressed) btnP_pressed = false;
if (btnD_pressed) btnD_pressed = false;
if (btnAT_pressed) btnAT_pressed = false;
if (btnSeg_pressed) btnSeg_pressed = false;
delay(10); // this speeds up the simulation
}
void estados(void *parameter){
while(1){
switch(state){
case 0: //DESARMADA
if(btnA_pressed == true && btnAT_pressed == false){
state = 1; //pasa a armada
digitalWrite(ledE, LOW);
digitalWrite(ledA, HIGH);
btnA_pressed = false;
}
else if(btnAT_pressed == true){
state = 3; //pasa a alerta
digitalWrite(ledE, LOW);
digitalWrite(ledA, LOW);
digitalWrite(ledF, LOW);
digitalWrite(ledAlm, HIGH);
}
break;
case 1: //ARMADA
if(btnF_pressed == true && btnAT_pressed == false){
state = 2; //pasa a funcionamiento
digitalWrite(ledA, LOW);
digitalWrite(ledF, HIGH);
}
else if(btnAT_pressed == true){
state = 3; //pasa a alerta
digitalWrite(ledE, LOW);
digitalWrite(ledA, LOW);
digitalWrite(ledF, LOW);
digitalWrite(ledAlm, HIGH);
}
else if(btnD_pressed == true || btnA_pressed == true || btnP_pressed == true){
state = 0; // Pasa a desarmada
digitalWrite(ledE, HIGH);
digitalWrite(ledA, LOW); // Apaga ledA
btnA_pressed = false;
btnD_pressed = false;
btnP_pressed = false;
}
break;
case 2: //FUNCIONAMIENTO
if(btnP_pressed == true && btnAT_pressed == false){
state = 1; //pasa a armada
btnP_pressed = false;
digitalWrite(ledA, HIGH);
digitalWrite(ledF, LOW);
}
else if(btnAT_pressed == true){
state = 3; //pasa a alerta
digitalWrite(ledE, LOW);
digitalWrite(ledA, LOW);
digitalWrite(ledF, LOW);
digitalWrite(ledAlm, HIGH);
}
break;
case 3: //ALERTA
tone(BUZZ, 262, 250); // Alarma sonora
if (digitalRead(btnSeg) == LOW) { // Verifica si sigue presionado
timerAlarmEnable(timer1);
while (!t1 && digitalRead(btnSeg) == LOW) { // Espera 1 segundo
delay(10); // Evita bloqueos
}
if (t1 && digitalRead(btnSeg) == LOW) { // Confirmación final
state = 0; // Desarmada
t1 = false;
digitalWrite(ledE, HIGH);
digitalWrite(ledAlm, LOW);
noTone(BUZZ);
}
timerAlarmDisable(timer1); // Desactiva el temporizador
}
break;
}
}
}