#include <Servo.h>
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
Servo motor;
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Dirección I2C del LCD y tamaño (16x2)
const int buttonPin1 = 3; // Botón para abrir el servo
const int buttonPin2 = 4; // Botón para cerrar el servo
const int servoPin = 9;
DateTime dispenseTime; // Hora programada para dispensar comida
bool servoActive = false;
bool servoOpening = false;
bool servoClosing = false;
void setup() {
Serial.begin(9600);
lcd.init(); // Inicializar la LCD
lcd.backlight();
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
motor.attach(servoPin);
Wire.begin(); // Iniciar comunicación I2C
rtc.begin(); // Iniciar RTC DS3231
// Verificar si el RTC DS3231 está disponible
if (!rtc.begin()) {
Serial.println("No se pudo encontrar el RTC DS3231");
while (1);
}
// Si el RTC no tiene una hora establecida, ajustar con la hora actual
if (!rtc.isrunning()) {
Serial.println("RTC no está funcionando, ajustando hora...");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Ajustar con la hora actual
}
// Obtener la hora programada del RTC
dispenseTime = rtc.now();
dispenseTime = DateTime(dispenseTime.year(), dispenseTime.month(), dispenseTime.day(), 7, 0, 0); // Programar a las 7:00 AM
}
void loop() {
// Control manual del servo con los botones
if (digitalRead(buttonPin1) == HIGH && !servoActive) {
servoOpening = true;
servoActive = true;
motor.write(180);
}
if (digitalRead(buttonPin2) == HIGH && !servoActive) {
servoClosing = true;
servoActive = true;
motor.write(0);
}
// Si el servo termina de abrir o cerrar, restablecer los estados
if (servoOpening && !digitalRead(buttonPin1)) {
servoOpening = false;
servoActive = false;
}
if (servoClosing && !digitalRead(buttonPin2)) {
servoClosing = false;
servoActive = false;
}
// Mostrar estado del servo y hora programada en el LCD
lcd.setCursor(0, 0);
if (servoOpening) {
lcd.print("Abriendo ");
} else if (servoClosing) {
lcd.print("Cerrando ");
} else {
lcd.print("Listo ");
}
lcd.setCursor(0, 1);
lcd.print("Dispensar a las:");
lcd.setCursor(14, 1);
lcd.print(dispenseTime.hour());
lcd.print(":");
if (dispenseTime.minute() < 10) {
lcd.print("0");
}
lcd.print(dispenseTime.minute());
// Esperar un breve momento antes de la siguiente iteración
delay(100);
}