#include <RTClib.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
RTC_DS3231 rtc;
Servo servo1;
Servo servo2;
LiquidCrystal_I2C lcd(0x27, 20, 4); // Dirección I2C y tamaño del LCD (20 columnas x 4 filas)
const int buttonPin1 = 2;
const int buttonPin2 = 3;
const int buttonPin3 = 4;
const int buzzerPin = 10;
const int proximitySensorPin = A0;
int breakfastHour = 8;
int breakfastMinute = 46;
int lunchHour = 12;
int lunchMinute = 0;
int dinnerHour = 15;
int dinnerMinute = 2;
bool breakfastDispensed = false;
bool lunchDispensed = false;
bool dinnerDispensed = false;
bool isProximityDetected = false;
unsigned long dispensingStartTime = 0;
const unsigned long dispensingDuration = 4000; // 4 segundos
void setup() {
Serial.begin(9600);
rtc.begin();
servo1.attach(9);
servo2.attach(10);
lcd.begin(20, 4); // Inicializar el LCD con 20 columnas y 4 filas
lcd.backlight();
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(buttonPin3, INPUT_PULLUP);
pinMode(buzzerPin, OUTPUT);
pinMode(proximitySensorPin, INPUT);
}
void loop() {
DateTime now = rtc.now();
int currentHour = now.hour();
int currentMinute = now.minute();
int buttonState1 = digitalRead(buttonPin1);
int buttonState2 = digitalRead(buttonPin2);
int buttonState3 = digitalRead(buttonPin3);
if (buttonState1 == LOW) {
breakfastMinute++;
if (breakfastMinute >= 60) {
breakfastMinute = 0;
}
delay(300);
}
if (buttonState2 == LOW) {
lunchMinute++;
if (lunchMinute >= 60) {
lunchMinute = 0;
}
delay(300);
}
if (buttonState3 == LOW) {
dinnerMinute++;
if (dinnerMinute >= 60) {
dinnerMinute = 0;
}
delay(300);
}
// Ajustar los minutos para que no excedan 60
breakfastMinute = breakfastMinute % 60;
lunchMinute = lunchMinute % 60;
dinnerMinute = dinnerMinute % 60;
if (currentHour == breakfastHour && currentMinute == breakfastMinute && !breakfastDispensed) {
if (millis() - dispensingStartTime >= dispensingDuration) {
if (!isProximityDetected && !isPetDetected()) {
dispenseFood(servo1);
playSound();
breakfastDispensed = true;
dispensingStartTime = millis();
}
}
} else if (currentHour != breakfastHour) {
breakfastDispensed = false;
}
if (currentHour == lunchHour && currentMinute == lunchMinute && !lunchDispensed) {
if (millis() - dispensingStartTime >= dispensingDuration) {
if (!isProximityDetected && !isPetDetected()) {
dispenseFood(servo1);
playSound();
lunchDispensed = true;
dispensingStartTime = millis();
}
}
} else if (currentHour != lunchHour) {
lunchDispensed = false;
}
if (currentHour == dinnerHour && currentMinute == dinnerMinute && !dinnerDispensed) {
if (millis() - dispensingStartTime >= dispensingDuration) {
if (!isProximityDetected && !isPetDetected()) {
dispenseFood(servo1);
playSound();
dinnerDispensed = true;
dispensingStartTime = millis();
}
}
} else if (currentHour != dinnerHour) {
dinnerDispensed = false;
}
isProximityDetected = digitalRead(proximitySensorPin);
if (isProximityDetected) {
// Activar el segundo servomotor cuando se detecte la proximidad
servo2.write(0);
} else {
// Desactivar el segundo servomotor cuando no se detecte la proximidad
servo2.write(90);
}
updateLCD();
}
void dispenseFood(Servo servo) {
int openPosition = 0;
int closePosition = 90;
servo.write(openPosition);
delay(2000);
servo.write(closePosition);
delay(2000);
}
void playSound() {
tone(buzzerPin, 1000, 200); // Cambia la frecuencia y la duración del sonido según tus necesidades
delay(200);
noTone(buzzerPin);
}
bool isPetDetected() {
int sensorValue = analogRead(proximitySensorPin);
return (sensorValue < 100); // Ajusta este valor según la sensibilidad del sensor y la distancia a la que deseas detectar la presencia de una mascota
}
void updateLCD() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Comidas:");
lcd.setCursor(0, 1);
lcd.print("Desayuno: " + String(breakfastHour) + ":" + String(breakfastMinute));
lcd.setCursor(0, 2);
lcd.print("Almuerzo: " + String(lunchHour) + ":" + String(lunchMinute));
lcd.setCursor(0, 3);
lcd.print("Cena: " + String(dinnerHour) + ":" + String(dinnerMinute));
}