// Definición de pines
const int ledRojo = 16;
const int ledAmarillo = 17;
const int ledVerde = 18;
const int pinInterrupcion = 4; // Slide Switch
const int pinPausa = 5; // Push Button
// Variables de temporización
unsigned long tiempoCambio = 0;
unsigned long intervalo = 1000; // Tiempo inicial para LED rojo
int estado = 0; // 0: Rojo, 1: Amarillo, 2: Verde
int pausaSecuencia = 0; // 0: false, 1: true
int pausaPermitida = 0; // 0: false, 1: true
//Esta función se activa cuando hay un cambio en el estado del slide switch
void ARDUINO_ISR_ATTR manejarInterrupcion() {
if (digitalRead(pinInterrupcion) == LOW) {
pausaPermitida = 1;
} else {
pausaPermitida = 0;
}
}
//Esta función se activa cuando el pulsador se presiona
void ARDUINO_ISR_ATTR manejarPausa() {
if (pausaPermitida == 1) {
pausaSecuencia = !pausaSecuencia;
digitalWrite(ledRojo, LOW);
digitalWrite(ledAmarillo, LOW);
digitalWrite(ledVerde, HIGH);
}
}
void setup() {
// Configuración de pines
pinMode(ledRojo, OUTPUT);
pinMode(ledAmarillo, OUTPUT);
pinMode(ledVerde, OUTPUT);
pinMode(pinInterrupcion, INPUT_PULLUP);
pinMode(pinPausa, INPUT_PULLUP);
// Configuración de interrupciones
attachInterrupt(pinInterrupcion, manejarInterrupcion, CHANGE);
attachInterrupt(pinPausa, manejarPausa, FALLING);
}
void loop() {
if (pausaSecuencia == 0) { // Revisa si pausaSecuencia es 0
// Cambiar el estado del semáforo
if (millis() - tiempoCambio >= intervalo) {
tiempoCambio = millis();
// Apagar todos los LEDs antes de cambiar de estado
digitalWrite(ledRojo, LOW);
digitalWrite(ledAmarillo, LOW);
digitalWrite(ledVerde, LOW);
// Secuencia de cambio de luces
if (estado == 0) { // LED Rojo
digitalWrite(ledRojo, HIGH);
intervalo = 8000;
estado = 1;
} else if (estado == 1) { // LED Amarillo
digitalWrite(ledAmarillo, HIGH);
intervalo = 2000;
estado = 2;
} else if (estado == 2) { // LED Verde
digitalWrite(ledVerde, HIGH);
intervalo = 8000;
estado = 0;
}
}
} else {
// Interrupción de la secuencia: encender solo el LED verde durante 5 segundos
delay(5000); // Mantiene encendido el LED verde 5 segundos
pausaSecuencia = 0; // Retoma la secuencia al establecer pausaSecuencia en 0
}
}