#include <Wire.h>
#include <RTClib.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
// Initialize RTC, Servo, and LCD
RTC_DS1307 rtc;
Servo servoMotor;
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Define pins
const int buzzerPin = 12;
const int ledPin = 9;
const int servoPin = 13;
// Feeding times
const int feedHour1 = 8; // 8:00 AM
const int feedHour2 = 16; // 4:00 PM
void setup() {
// Start Serial Monitor
Serial.begin(9600);
// Initialize RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC is NOT running!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Initialize LCD
lcd.begin(16,2);
lcd.backlight();
// Initialize servo motor, buzzer, and LED
servoMotor.attach(servoPin);
pinMode(buzzerPin, OUTPUT);
pinMode(ledPin, OUTPUT);
lcd.setCursor(0, 0);
}
void loop() {
DateTime now = rtc.now();
// Display current time on LCD
lcd.setCursor(0, 0);
lcd.print("Waktu:");
lcd.print(now.hour(), DEC);
lcd.print(":");
lcd.print(now.minute(), DEC);
lcd.print(":");
lcd.print(now.second(), DEC);
// Feeding schedule
if (now.hour() == feedHour1 && now.minute() == 0 && now.second() == 0 ||
now.hour() == feedHour2 && now.minute() == 0 && now.second() == 0) {
// Show feeding status on LCD
lcd.setCursor(0, 1);
lcd.print("Memberi Makan... ");
// Turn on LED and buzzer
digitalWrite(ledPin, HIGH);
digitalWrite(buzzerPin, HIGH);
// Move servo to feed position
servoMotor.write(90); // Move to feeding position
delay(5000); // Wait for 5 seconds
// Reset servo position
servoMotor.write(0);
// Turn off LED and buzzer
digitalWrite(ledPin, LOW);
digitalWrite(buzzerPin, LOW);
// Reset LCD status
lcd.setCursor(0, 1);
lcd.print("Menunggu Makan ");
}
delay(1000); // Update every second
}