#include <Wire.h> // Library untuk komunikasi I2C
#include <LiquidCrystal_I2C.h> // Library untuk LCD I2C
#include <ESP32Servo.h> // Library untuk servo motor (ESP32)
#include <TimeLib.h> // Library untuk mengatur waktu (alternatif untuk RTC DS1307)
LiquidCrystal_I2C lcd(0x27, 16, 2); // Inisialisasi LCD I2C dengan alamat 0x27 dan ukuran 16x2
Servo servo; // Inisialisasi Servo
#define TRIGGER_PIN 4
#define ECHO_PIN 15
#define LED_PIN 27
#define BUZZER_PIN 18
#define SERVO_PIN 2
long duration;
int distance;
int makanJam = 7; // Waktu makan ayam (pukul 08:00)
int makanMenit = 30; // Waktu makan ayam (pukul 08:30)
unsigned long lastFeedTime = 0; // Variabel untuk menyimpan waktu terakhir servo terbuka
void setup() {
Serial.begin(96000); // Inisialisasi Serial Monitor untuk menampilkan pesan debug
delay(1000); // Tunggu 1 detik untuk memastikan serial terhubung dengan baik
// Inisialisasi pin
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Inisialisasi Servo
servo.attach(SERVO_PIN);
servo.write(0); // Posisi awal servo (terkunci)
// Set waktu awal (misalnya 07:29:30)
setTime(7, 29, 53, 12, 12, 2024); // Format: setTime(hour, minute, second, day, month, year)
// Inisialisasi LCD
Wire.begin();
lcd.begin(16, 2); // Menginisialisasi LCD dengan ukuran 16x2
lcd.setBacklight(true); // Pastikan backlight LCD menyala
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Initializing...");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Alat Siap!");
Serial.println("Sistem dimulai...");
}
void loop() {
// Membaca waktu saat ini
int currentHour = hour();
int currentMinute = minute();
int currentSecond = second();
// Tampilkan waktu saat ini di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Waktu: ");
lcd.print(currentHour);
lcd.print(":");
if (currentMinute < 10) {
lcd.print("0"); // Menambahkan angka 0 di depan jika menit kurang dari 10
}
lcd.print(currentMinute);
// Jika ada waktu terakhir pemberian makan, tampilkan di LCD
if (lastFeedTime > 0) {
lcd.setCursor(0, 1);
lcd.print("Last: ");
lcd.print(hour(lastFeedTime));
lcd.print(":");
lcd.print(minute(lastFeedTime));
}
// Cek jika sudah waktunya makan (pukul 08:30)
if (currentHour == makanJam && currentMinute == makanMenit) {
Serial.println("Waktu makan tiba, cek sensor HC-SR04...");
// Cek jarak menggunakan sensor HC-SR04
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.034 / 2;
Serial.print("Jarak objek: ");
Serial.print(distance);
Serial.println(" cm");
// Jika objek terdeteksi dalam jarak <= 10 cm
if (distance <= 10) {
Serial.println("Objek terdeteksi, menjalankan servo, LED, dan buzzer...");
// Simpan waktu terakhir pemberian makan
lastFeedTime = now();
// Gerakkan servo membuka tempat makan secara bertahap
for (int pos = 0; pos <= 90; pos++) { // Dari 0 ke 90 derajat
servo.write(pos); // Set posisi servo
delay(15); // Memberikan delay agar servo bergerak mulus
}
// Nyalakan LED dan buzzer
digitalWrite(LED_PIN, HIGH);
tone(BUZZER_PIN, 1000); // Mainkan suara buzzer pada frekuensi 1000 Hz
// Tampilkan status di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Makan Dibuka!");
lcd.setCursor(0, 1);
lcd.print("Waktu: ");
lcd.print(currentHour);
lcd.print(":");
lcd.print(currentMinute);
delay(5000); // Tunggu 5 detik
// Kembalikan servo ke posisi awal secara bertahap
for (int pos = 90; pos >= 0; pos--) { // Dari 90 ke 0 derajat
servo.write(pos); // Set posisi servo
delay(15); // Memberikan delay agar servo bergerak mulus
}
// Matikan LED dan buzzer
digitalWrite(LED_PIN, LOW);
noTone(BUZZER_PIN); // Matikan suara buzzer
Serial.println("Proses selesai, servo ditutup.");
} else {
Serial.println("Tidak ada objek terdeteksi dalam jarak <= 10 cm.");
}
}
// Pastikan setelah waktu makan (pukul 08:30), servo kembali ke posisi awal (0 derajat)
if (currentHour == makanJam && currentMinute > makanMenit) {
if (servo.read() != 0) {
Serial.println("Waktu makan sudah lewat, menutup servo...");
// Kembalikan servo ke posisi awal (0 derajat)
servo.write(0); // Gerakkan servo langsung ke 0 derajat
delay(500); // Tunggu sebentar agar servo bergerak dengan mulus
}
}
delay(1000); // Delay 1 detik untuk menghindari pembacaan berulang terlalu cepat
}