// Definición de pines para cada LED SEMAFORO CARROS
const int pinRojo = 15;
const int pinAmarillo = 13;
const int pinVerde = 12;
// Definición de pines para cada LED SEMAFORO PERSONAS
const int Rojo = 16;
const int Verde = 2;
// Definición de pines para los botones
const int pinStartButton = 4;
const int pinEmergencyStopButton = 5;
// Variables para controlar el estado del semáforo
bool semaforoActivo = false;
bool emergenciaActiva = false;
void setup() {
// Configurar pines como salidas para LEDs
pinMode(pinRojo, OUTPUT);
pinMode(pinAmarillo, OUTPUT);
pinMode(pinVerde, OUTPUT);
pinMode(Verde, OUTPUT);
pinMode(Rojo, OUTPUT);
// Configurar pines como entradas para botones con pull-up interno
pinMode(pinStartButton, INPUT_PULLUP);
pinMode(pinEmergencyStopButton, INPUT_PULLUP);
// Inicialización del puerto serial para imprimir en la consola
Serial.begin(9600);
}
void loop() {
// Leer estado del botón de inicio (Start)
bool startPressed = digitalRead(pinStartButton) == LOW;
// Leer estado del botón de paro de emergencia (Emergency Stop)
bool emergencyPressed = digitalRead(pinEmergencyStopButton) == LOW;
// Si se presiona el botón de inicio y el semáforo no está activo, iniciar
if (startPressed && !semaforoActivo) {
iniciarSemaforo();
}
// Si se presiona el botón de paro de emergencia, activar emergencia
if (emergencyPressed) {
emergenciaActiva = true;
pararSemaforo();
}
// Manejar el estado del semáforo según las condiciones
if (semaforoActivo && !emergenciaActiva) {
// Verde para carros y rojo para peatones
digitalWrite(pinRojo, LOW);
digitalWrite(pinAmarillo, LOW);
digitalWrite(pinVerde, HIGH);
digitalWrite(Rojo, HIGH);
digitalWrite(Verde, LOW);
Serial.println("Tiempo de pase de peatones"); // Imprimir mensaje en consola
delay(10000); // Mantener encendido el verde por 13 segundos
// Parpadeo antes de cambiar a amarillo
parpadear(pinVerde, 5, 200);
// Amarillo para carros y rojo para peatones
digitalWrite(pinVerde, LOW);
digitalWrite(pinAmarillo, HIGH);
Serial.println("Precaución"); // Imprimir mensaje en consola
delay(3000); // Mantener encendido el amarillo por 4 segundos
// Parpadeo antes de cambiar a rojo
parpadear(pinAmarillo, 5, 200);
// Rojo para carros y verde para peatones
digitalWrite(pinAmarillo, LOW);
digitalWrite(pinRojo, HIGH);
digitalWrite(Verde, HIGH);
digitalWrite(Rojo, LOW);
delay(10000); // Mantener encendido el rojo por 18 segundos
// Parpadeo antes de cambiar a verde
parpadear(pinRojo, 5, 200);
}
}
// Función para iniciar el semáforo
void iniciarSemaforo() {
semaforoActivo = true;
emergenciaActiva = false; // Reiniciar estado de emergencia
}
// Función para parar el semáforo
void pararSemaforo() {
semaforoActivo = false;
}
// Función para parpadear un LED
void parpadear(int pin, int veces, int intervalo) {
for (int i = 0; i < veces; i++) {
digitalWrite(pin, LOW);
delay(intervalo);
digitalWrite(pin, HIGH);
delay(intervalo);
}
digitalWrite(pin, LOW); // Apagar el LED después de parpadear
}