//LEDS
#define E_PIN 5
#define A_PIN 17
#define F_PIN 16
#define W_PIN 4
//BOTONES
#define B_ARMAR_PIN 34
#define B_FUNCIONAR_PIN 35
#define B_PARAR_PIN 32
#define B_DESARMAR_PIN 33
#define B_WARNING_PIN 21
#define B_SEGURIDAD_PIN 25
#define B_RESET_PIN 26
//VARIABLES GLOBALES
//Flags
volatile bool bArmar;
volatile bool bFuncionar;
volatile bool bParar;
volatile bool bDesarmar;
volatile bool bWarning;
volatile bool bSeguridadPulsa;
volatile bool bSeguridadSuelta;
volatile bool bReset;
volatile bool parpadeo_activated = false;
//Contadores
volatile int interrupt_counter = 0;
volatile int parpadeo_counter = 0;
//Estado actual
volatile int estado;
//CONF TIMERS
hw_timer_t *timer = NULL; // Puntero al timer del hardware.
// Lo he llamado "timer" por simplificar, pero podría haberlo llamado como quisiera. P.ej.:
// hw_timer_t *temporizador_0 = NULL;
hw_timer_t *tparpadeo = NULL;
int timer_frequency = 1000000; // Frecuencia del timer en Hz (como de rápido cuenta el timer)
int timer_parpadeo = 1000000;
// Callback ISR interrupción de los botones
void IRAM_ATTR armar()
{
bArmar = true;
}
void IRAM_ATTR funcionar()
{
bFuncionar = true;
}
void IRAM_ATTR parar()
{
bParar = true;
}
void IRAM_ATTR desarmar()
{
bDesarmar = true;
}
void IRAM_ATTR warning()
{
bWarning = true;
}
void IRAM_ATTR seguridad()
{
if (estado == 3) {
if (digitalRead(B_SEGURIDAD_PIN) == LOW)
{
timerRestart(timer);
bSeguridadPulsa = true;
interrupt_counter = 0;
}
else
{
bSeguridadSuelta = true;
}
}
}
void IRAM_ATTR ISR_Reset()
{
bReset = true;
}
void actualizarFlags()
{
bArmar = false;
bFuncionar = false;
bParar = false;
bDesarmar = false;
bWarning = false;
bReset = false;
bSeguridadPulsa = false;
bSeguridadSuelta = false;
}
void reset()
{
estado = 0;
interrupt_counter = 0;
parpadeo_counter = 0;
bArmar = false;
bFuncionar = false;
bParar = false;
bDesarmar = false;
bWarning = false;
bSeguridadPulsa = false;
bSeguridadSuelta = false;
bReset = false;
digitalWrite(E_PIN, HIGH);
digitalWrite(A_PIN, LOW);
digitalWrite(F_PIN, LOW);
digitalWrite(W_PIN, LOW);
Serial.println("**DESARMADA**");
Serial.println("-->PARA ARMAR PULSA EL AZUL");
}
// Callback ISR interrupción del timer
void IRAM_ATTR timerInterrupt()
{
interrupt_counter++; // Se incrementa el contador de interrupciones del timer
}
// Callback ISR temporizador para parpadeo LED
void IRAM_ATTR parpadeo()
{
parpadeo_activated = !parpadeo_activated;
}
void setup()
{
Serial.begin(115200);
//Config. puertos
//Salidas LED
pinMode(E_PIN, OUTPUT);
pinMode(A_PIN, OUTPUT);
pinMode(F_PIN, OUTPUT);
pinMode(W_PIN, OUTPUT);
//Entradas botones
pinMode(B_ARMAR_PIN, INPUT_PULLUP);
pinMode(B_FUNCIONAR_PIN, INPUT_PULLUP);
pinMode(B_PARAR_PIN, INPUT_PULLUP);
pinMode(B_DESARMAR_PIN, INPUT_PULLUP);
pinMode(B_WARNING_PIN, INPUT_PULLUP);
pinMode(B_SEGURIDAD_PIN, INPUT_PULLUP);
pinMode(B_RESET_PIN, INPUT_PULLUP);
//Config. interrupciones
attachInterrupt(digitalPinToInterrupt(B_ARMAR_PIN), &armar, RISING);
attachInterrupt(digitalPinToInterrupt(B_FUNCIONAR_PIN), &funcionar, RISING);
attachInterrupt(digitalPinToInterrupt(B_PARAR_PIN), ¶r, RISING);
attachInterrupt(digitalPinToInterrupt(B_DESARMAR_PIN), &desarmar, RISING);
attachInterrupt(digitalPinToInterrupt(B_WARNING_PIN), &warning, RISING);
attachInterrupt(digitalPinToInterrupt(B_SEGURIDAD_PIN), &seguridad, CHANGE);
attachInterrupt(digitalPinToInterrupt(B_RESET_PIN), &ISR_Reset, RISING);
//Config. timer boton seguridad
timer = timerBegin(timer_frequency);
timerAttachInterrupt(timer, &timerInterrupt);
timerAlarm(timer, 2000000, true, 0); // LARGO MÁS DE 1 S
//Config. timer parpadeo LED
tparpadeo = timerBegin(timer_parpadeo);
timerAttachInterrupt(tparpadeo, &parpadeo);
timerAlarm(tparpadeo, 500000, true, 0); // PARPADEO CADA 0.25 S
reset();
}
void loop()
{
switch (estado)
{
case 0: // DESARMADA
if (bArmar)
{
actualizarFlags();
digitalWrite(A_PIN, HIGH);
estado = 1;
Serial.println("**ARMADA**");
Serial.println("-->PARA FUNCIONAR PULSA EL VERDE -->PARA DESARMAR PULSA EL BLANCO");
}
if (bWarning)
{
actualizarFlags();
estado = 3;
Serial.println("**HA HABIDO UNA ALERTA**");
Serial.println("**-->PULSAR BOTON AMARILLO DURANTE 1 S **");
}
break;
case 1: // ARMADA
if (bFuncionar)
{
actualizarFlags();
digitalWrite(F_PIN, HIGH);
estado = 2;
Serial.println("**FUNCIONANDO**");
Serial.println("-->PARA PARAR PULSA EL ROJO");
}
if (bDesarmar)
{
reset();
}
if (bWarning)
{
actualizarFlags();
estado = 3;
Serial.println("**HA HABIDO UNA ALERTA**");
Serial.println("**-->PULSAR BOTON AMARILLO DURANTE 1 S **");
}
if (bReset)
{
reset();
bReset = false;
}
break;
case 2: // FUNCIONAMIENTO
if (bParar)
{
actualizarFlags();
digitalWrite(F_PIN, LOW);
estado = 1;
Serial.println("**ARMADA**");
Serial.println("-->PARA FUNCIONAR PULSA EL VERDE -->PARA DESARMAR PULSA EL BLANCO");
}
if (bReset)
{
reset();
bReset = false;
}
if (bWarning)
{
actualizarFlags();
estado = 3;
Serial.println("**HA HABIDO UNA ALERTA**");
Serial.println("**-->PULSAR BOTON AMARILLO DURANTE 1 S **");
}
break;
case 3: // ALERTA
digitalWrite(W_PIN,parpadeo_activated);
if (bSeguridadSuelta and (interrupt_counter > 0))
{
Serial.println("**ALARMA SOLUCIONADA**");
reset();
estado = 0;
}
break;
}
delay(10); // this speeds up the simulation
}