#include <Servo.h>
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
// Configuración del LCD I2C (0x27 es la dirección común del LCD, pero puede variar)
LiquidCrystal_I2C lcd(0x27, 16, 2); // Pantalla LCD de 16x2
Servo myservo; // Crea un objeto Servo
RTC_DS1307 rtc; // Crea un objeto RTC para el DS1307
unsigned long previousMillis = 0; // Variable para almacenar el tiempo anterior
const long interval = 5000; // Intervalo de 5 segundos
bool isAtZero = true; // Variable para controlar la posición del servo
void setup() {
// Inicia la comunicación con el serial
Serial.begin(9600);
// Inicia la pantalla LCD con 16 columnas y 2 filas
lcd.begin(16, 2);
lcd.backlight(); // Enciende la luz de fondo del LCD
// Verifica que el RTC esté conectado
if (!rtc.begin()) {
Serial.println("No se pudo encontrar el RTC");
while (1);
}
// Verifica si el reloj está funcionando
if (!rtc.isrunning()) {
Serial.println("RTC no está corriendo, ajustando la hora...");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Ajusta a la fecha y hora de compilación
}
myservo.attach(9); // Asigna el pin 9 al servomotor
myservo.write(0); // Inicia el servo en 0 grados
}
void loop() {
DateTime now = rtc.now(); // Obtén la hora actual del RTC
// Mostrar hora en el LCD
lcd.setCursor(0, 0); // Coloca el cursor en la primera línea
lcd.print("Hora: ");
// Añadir ceros a la izquierda cuando es necesario
if (now.hour() < 10) lcd.print('0');
lcd.print(now.hour());
lcd.print(":");
if (now.minute() < 10) lcd.print('0');
lcd.print(now.minute());
lcd.print(":");
if (now.second() < 10) lcd.print('0');
lcd.print(now.second());
// Mostrar fecha en el LCD
lcd.setCursor(0, 1); // Coloca el cursor en la segunda línea
lcd.print("Fecha: ");
lcd.print(now.day());
lcd.print("/");
lcd.print(now.month());
lcd.print("/");
lcd.print(now.year());
// Control del servo cada 5 segundos
unsigned long currentMillis = millis(); // Obtén el tiempo actual en milisegundos
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // Actualiza el tiempo previo
if (isAtZero) {
myservo.write(180); // Mueve el servo a 180 grados
isAtZero = false; // Cambia el estado
} else {
myservo.write(0); // Mueve el servo a 0 grados
isAtZero = true; // Cambia el estado
}
}
}