#include <TimerOne.h>
// Definición de pines
#define MOVIMIENTO 4 // Se encenderá un Led si el colectivo puede acelerar
#define SIRENA 5
#define LED_ROJO 6
#define LED_VERDE 7
#define ALERTA 8 // Pulsador que será el que accione el caso de que no haya llegado a la presión mínima
#define RESET 9 // Pulsador de reset
int t = 0; // Contador de tiempo en segundos
int t_led = 3000; // Arrancará a contar desde los 3000 ms
int PRESION = 0;
int PRESION_COMPLETA = 1;
int A = 1; // Variable para la interrupción y loop
bool resetActivo = 0; // Variable para indicar si el reset ha sido activado
void setup() {
Timer1.initialize(1000); // Inicializa el timer 1 con una cuenta de 1000 microsegundos.
Timer1.attachInterrupt(ISR_Blink); // Activa la interrupción y la asocia a ISR_Blink
pinMode(MOVIMIENTO, OUTPUT); // Configura el movimiento del colectivo como LED
pinMode(SIRENA, OUTPUT); // Configura la sirena como un LED
pinMode(LED_ROJO, OUTPUT); // Configura el LED rojo como salida
pinMode(LED_VERDE, OUTPUT); // Configura el LED verde como salida
pinMode(ALERTA, INPUT_PULLUP); // Configura ALERTA como entrada con pull-up interno
pinMode(RESET, INPUT_PULLUP); // Configura RESET como entrada con pull-up interno
digitalWrite(LED_ROJO, LOW); // Apagar el LED rojo inicialmente
digitalWrite(LED_VERDE, LOW); // Apagar el LED verde inicialmente
digitalWrite(SIRENA, LOW); // Apagar la sirena inicialmente
}
void ISR_Blink() {
noInterrupts(); // Suspende las interrupciones
A = 1; // Coloca la variable A en 1, que luego permitirá desbloquear el loop.
interrupts(); // Reanuda las interrupciones
}
void loop() {
// Leer el estado del pulsador ALERTA
int estadoAlerta = digitalRead(ALERTA);
// Leer el estado del pulsador de reset
int estadoReset = digitalRead(RESET);
// Si se presiona el pulsador de reset y aún no ha sido activado
if (estadoReset == LOW && !resetActivo) {
t = 0;
PRESION = 0;
PRESION_COMPLETA = 1;
digitalWrite(LED_ROJO, LOW);
digitalWrite(LED_VERDE, LOW);
digitalWrite(SIRENA, LOW);
digitalWrite(MOVIMIENTO, LOW);
resetActivo = 1; // Marcar que el reset ha sido activado
}
// Si se suelta el pulsador de reset, marcar como no activado
if (estadoReset == HIGH && resetActivo) {
resetActivo = 0;
}
if (A == 1) {
A = 0;
t++; // Incrementa el contador de tiempo
t_led++; // Nueva variable para encender y apagar el LED
if ((t >= 12000) && (PRESION == 0) && (estadoAlerta == LOW)) {
// Si ha pasado el tiempo y la presión no es suficiente y ALERTA está presionado
digitalWrite(SIRENA, HIGH);
digitalWrite(LED_ROJO, HIGH);
digitalWrite(LED_VERDE, LOW);
digitalWrite(MOVIMIENTO, LOW);
}
if ((t >= 12000) && (PRESION_COMPLETA == 1) && (estadoAlerta == HIGH)) {
// Si ha pasado el tiempo, la presión completa es suficiente y ALERTA no está presionado
digitalWrite(SIRENA, LOW);
digitalWrite(LED_ROJO, LOW);
digitalWrite(LED_VERDE, HIGH);
digitalWrite(MOVIMIENTO, HIGH);
}
if ((t < 12000) && (PRESION == 0) && (estadoAlerta == HIGH)) {
// Si la presión no es suficiente y no ha pasado el tiempo
digitalWrite(LED_VERDE, LOW); // Apagar el LED verde
digitalWrite(LED_ROJO, HIGH); // Encender el LED rojo
digitalWrite(MOVIMIENTO, LOW); // Desactivar el movimiento del colectivo
digitalWrite(SIRENA, LOW); // Apagar la sirena
}
if ((t > 12000) && (PRESION_COMPLETA == 0) && (estadoAlerta == HIGH)) {
// Si ha pasado el tiempo, la presión completa no es suficiente y ALERTA está presionado
digitalWrite(LED_VERDE, LOW);
digitalWrite(SIRENA, HIGH);
digitalWrite(LED_ROJO, HIGH);
digitalWrite(MOVIMIENTO, LOW);
}
}
if ((estadoAlerta == HIGH) && (t_led >= 3000)) {
digitalWrite(SIRENA, LOW);
digitalWrite(LED_ROJO, LOW);
}
else if ((estadoAlerta == LOW) && (t_led < 2000)) {
digitalWrite(SIRENA, HIGH);
digitalWrite(LED_ROJO, HIGH);
}
}