Quiero hacer Un Alimentador de mascotas automatico con un servo un rtc y un lcd i2c todo funciona perfecto pero en la primera hora del codigo el servo gira a 90º pero no regresa a 0 despues del delay.. en cambio en las otras horas si funciona perfecto.. Quiero que funcione asi: A la Hora indicada El servo se mueve 90º espera 6 segundos y regresa a la posicion inicial 0º, asi funciona con todas las horas menos la primera. Ya nose que hacer ayudenme por favor
#include <Wire.h>
#include <RTClib.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
RTC_DS3231 rtc;
Servo miServo;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Cambia la dirección I2C según la dirección real de tu LCD
bool servoMoved = false;
bool nextServoTimeDisplayed = false;
int nextServoHour = 22;
int nextServoMinute = 30;
void setup() {
Serial.begin(9600);
miServo.attach(3);
lcd.init(); // Iniciar el LCD sin ningún argumento extra
lcd.backlight();
if (!rtc.begin()) {
Serial.println("Modulo RTC no encontrado !");
while (1);
}
lcd.setCursor(0, 0);
lcd.print("Hora:");
// Inicializa la segunda línea del LCD con la hora del próximo movimiento del servo
lcd.setCursor(0, 1);
lcd.print("Prox: ");
lcd.print(twoDigits(nextServoHour));
lcd.print(":");
lcd.print(twoDigits(nextServoMinute));
}
void loop() {
DateTime fecha = rtc.now();
if ((fecha.hour() == nextServoHour && fecha.minute() == nextServoMinute) || (fecha.hour() >= nextServoHour && servoMoved)) {
if (fecha.hour() == 22 && fecha.minute() == 30) {
moveServo(90);
delay(6000);
moveServo(0);
delay(3000);
} else {
servoMoved = false; // Establece la bandera en falso antes de mover el servo
moveServo(90);
delay(6000);
moveServo(0);
delay(3000);
}
calculateNextServoTime();
}
// Muestra la hora actual en la primera línea del LCD
printTimeOnLCD(fecha.hour(), fecha.minute(), fecha.second());
// Si el servo se ha movido y la hora del próximo movimiento del servo aún no se ha mostrado
if (servoMoved && !nextServoTimeDisplayed) {
// Muestra "Prox: Hora del próximo movimiento del servo" en la segunda línea del LCD
lcd.setCursor(0, 1);
lcd.print("Prox: ");
lcd.print(twoDigits(nextServoHour));
lcd.print(":");
lcd.print(twoDigits(nextServoMinute));
nextServoTimeDisplayed = true;
}
// El resto del código sigue siendo el mismo...
}
void moveServo(int angle) {
miServo.write(angle);
delay(500);
}
void printTimeOnLCD(int currentHour, int currentMinute, int currentSecond) {
lcd.setCursor(6, 0);
lcd.print(twoDigits(currentHour));
lcd.print(":");
lcd.print(twoDigits(currentMinute));
lcd.print(":");
lcd.print(twoDigits(currentSecond));
}
String twoDigits(int number) {
if (number < 10) {
return "0" + String(number);
} else {
return String(number);
}
}
void calculateNextServoTime() {
if (nextServoMinute == 30) {
nextServoMinute = 33;
} else if (nextServoMinute == 33) {
nextServoMinute = 35;
} else if (nextServoMinute == 35) {
nextServoMinute = 30;
nextServoHour = 22;
// Si el próximo movimiento del servo es después de la medianoche, ajusta la hora
if (nextServoHour <= rtc.now().hour()) {
nextServoHour = (nextServoHour + 24) % 24;
}
}
servoMoved = false; // Restablece la bandera
updateNextServoDisplay();
}
void updateNextServoDisplay() {
lcd.setCursor(0, 1);
lcd.print("Prox: ");
lcd.print(twoDigits(nextServoHour));
lcd.print(":");
lcd.print(twoDigits(nextServoMinute));
nextServoTimeDisplayed = false; // Restablece la bandera
}