#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Configuración de la pantalla LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Definición de pines para los LEDs
const int LED_VERDE = 8;
const int LED_AMARILLO = 9;
const int LED_ROJO = 10;
// Tiempos de cada luz en segundos (puedes cambiarlos aquí)
const int TIEMPO_VERDE = 5;
const int TIEMPO_AMARILLO = 2;
const int TIEMPO_ROJO = 5;
void setup() {
// Configuración de pines de salida
pinMode(LED_VERDE, OUTPUT);
pinMode(LED_AMARILLO, OUTPUT);
pinMode(LED_ROJO, OUTPUT);
// Inicialización de la pantalla LCD
lcd.init();
lcd.backlight();
// Mensaje de inicio
lcd.setCursor(0, 0);
lcd.print(" SEMAFORO ");
lcd.setCursor(0, 1);
lcd.print(" INICIANDO... ");
delay(2000);
lcd.clear();
}
void loop() {
// 1. LUZ VERDE
cambiarSemaforo(HIGH, LOW, LOW, "VERDE (Dura:" + String(TIEMPO_VERDE) + "s)", "PASA", TIEMPO_VERDE);
// 2. LUZ AMARILLA
cambiarSemaforo(LOW, HIGH, LOW, "AMAR. (Dura:" + String(TIEMPO_AMARILLO) + "s)", "PRECAUCION", TIEMPO_AMARILLO);
// 3. LUZ ROJA
cambiarSemaforo(LOW, LOW, HIGH, "ROJO (Dura:" + String(TIEMPO_ROJO) + "s)", "ALTO", TIEMPO_ROJO);
}
// Función para actualizar LEDs y LCD
void cambiarSemaforo(int verde, int amarillo, int rojo, String encabezado, String accion, int duracionTotal) {
digitalWrite(LED_VERDE, verde);
digitalWrite(LED_AMARILLO, amarillo);
digitalWrite(LED_ROJO, rojo);
// Limpiar y mostrar la duración fija de la luz actual
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(encabezado);
// Cuenta regresiva segundo a segundo
for (int tiempoRestante = duracionTotal; tiempoRestante > 0; tiempoRestante--) {
lcd.setCursor(0, 1);
// Muestra la acción y el tiempo restante limpiando caracteres extra
lcd.print(accion + ": " + String(tiempoRestante) + "s ");
delay(1000);
}
}