#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Direccion de la pantalla (I2C): 0x27 o 0x3F, 16 columnas, 2 filas
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pines del hardware de control
const int pinPot = A0;
const int pinBoton = 2; // Boton habilitado en D2
const int pinLedVerde = 3; // LED Verde en D3
const int pinLedRojo = 4; // LED Rojo en D4
const int pinBuzzer = 5; // Buzzer en D5
// Variables de tiempo (Simulacion)
unsigned long tiempoAnteriorReal = 0;
float factorVelocidad = 360.0; // Para que 2 meses ocurran en 4 horas (360x)
// Reloj simulado inicializado en CERO
int segundoSim = 0;
int minutoSim = 0;
int horaSim = 0;
int diaSim = 0;
int mesSim = 0;
// Variables de control del boton
bool enMarcha = true;
int estadoBotonAnterior = LOW;
void setup() {
// Configuracion de pines (Entradas y Salidas)
pinMode(pinBoton, INPUT);
pinMode(pinLedVerde, OUTPUT);
pinMode(pinLedRojo, OUTPUT);
pinMode(pinBuzzer, OUTPUT);
// Inicializacion de la pantalla I2C
lcd.init();
lcd.backlight();
// Mensaje de bienvenida
lcd.setCursor(0, 0);
lcd.print("Simulador Tiempo");
lcd.setCursor(0, 1);
lcd.print("Iniciando...");
delay(2000);
lcd.clear();
tiempoAnteriorReal = millis();
}
void loop() {
unsigned long tiempoActualReal = millis();
// 1. Control del Boton Físico (Pausa / Play)
int estadoBoton = digitalRead(pinBoton);
if (estadoBoton == HIGH && estadoBotonAnterior == LOW) {
enMarcha = !enMarcha; // Cambia entre pausa y marcha
delay(200); // Antirebote para evitar lecturas dobles
}
estadoBotonAnterior = estadoBoton;
// 2. Lectura del Potenciometro (Ajuste de velocidad)
int valorPot = analogRead(pinPot);
factorVelocidad = map(valorPot, 0, 1023, 1, 360);
// 3. Logica del Reloj de Simulacion
if (enMarcha) {
digitalWrite(pinLedVerde, HIGH); // Enciende el LED Verde si esta corriendo
unsigned long deltaTiempoReal = tiempoActualReal - tiempoAnteriorReal;
if (deltaTiempoReal >= 1000) {
tiempoAnteriorReal = tiempoActualReal;
segundoSim += (1 * factorVelocidad);
while (segundoSim >= 60) { segundoSim -= 60; minutoSim++; }
while (minutoSim >= 60) { minutoSim -= 60; horaSim++; }
while (horaSim >= 24) { horaSim -= 24; diaSim++; }
while (diaSim >= 30) { diaSim = 0; mesSim++; }
}
} else {
digitalWrite(pinLedVerde, LOW); // Apaga el LED Verde en pausa
tiempoAnteriorReal = tiempoActualReal;
}
// 4. DISPARADOR DE EVENTOS (Al llegar al Mes 2)
if (mesSim >= 2) {
digitalWrite(pinLedRojo, HIGH); // Enciende luz roja de alerta
tone(pinBuzzer, 1000, 100); // Activa sonido intermitente
} else {
digitalWrite(pinLedRojo, LOW);
}
// 5. Visualizacion de datos en la pantalla LCD
lcd.setCursor(0, 0);
lcd.print("M:"); lcd.print(mesSim);
lcd.print(" D:"); lcd.print(diaSim);
lcd.print(" "); lcd.print(horaSim);
lcd.print(":"); lcd.print(minutoSim);
lcd.print(" ");
lcd.setCursor(0, 1);
if (enMarcha) {
lcd.print("Velocidad: x"); lcd.print((int)factorVelocidad);
lcd.print(" ");
} else {
lcd.print("== PAUSADO == ");
}
delay(100);
}