#include <NewPing.h>
#include <ESP32Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// pustaka yang diperlukan untuk melakukan berbagai tugas
// dalam proyek ini, seperti mengukur jarak dengan sensor ultrasonik,
// mengendalikan servo motor, dan berkomunikasi dengan layar LCD melalui I2C.
#define TRIGGER_PIN 12
#define ECHO_PIN 14
// pin yang terhubung ke sensor ultrasonik untuk sinyal trigger dan penerima echo
#define MAX_DISTANCE 400
// jarak maksimum yang akan diukur oleh sensor ultrasonik.
NewPing sonar
// objek dari kelas NewPing yang digunakan untuk mengukur jarak.
(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
Servo myservo;
// objek dari kelas Servo untuk mengendalikan servo motor.
int servoPin = 27;
// pin yang terhubung ke servo motor.
int distanceThreshold = 10; // Jarak pemberian makanan yang diberikan
bool isEating = false; // Melacak apakah hewan peliharaan sedang makan
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C untuk layar LCD spesifik Anda
void setup() {
Serial.begin(9600); // menginisialisasi komunikasi serial untuk tujuan debugging.
myservo.attach(servoPin); // menghubungkan servo motor ke pin yang telah ditentukan.
lcd.init(); // menginisialisasi layar LCD.
lcd.backlight(); // menyalakan latar belakang layar LCD.
lcd.clear(); // membersihkan tampilan LCD.
lcd.setCursor(0, 0);
lcd.print("SMART PET FEEDER");
// Pesan "SMART PET FEEDER" ditampilkan di baris pertama pada layar LCD.
}
void loop() {
delay(50);
int distance = sonar.ping_cm();
// Nilai jarak diukur dengan sensor ultrasonik
if (distance <= distanceThreshold) {
lcd.clear();
lcd.setCursor(0, 0);
if (!isEating) {
Serial.println("MENGISI WADAH MAKAN!");
lcd.print("MENGISI WADAH MAKAN!");
myservo.writeMicroseconds(0); // Pindahkan servo untuk mengeluarkan makanan
delay(5000); // Waktu tunggu makanan dikeluarkan oleh mesin.
myservo.writeMicroseconds(1500);
delay(2000);
lcd.clear();
} else {
Serial.println("SNOWY sedang makan");
lcd.print("SNOWY sedang makan");
delay(5000); // Berhenti 5 detik sebelum melanjutkan
lcd.clear();
}
isEating = true; // Tetapkan status mesin ke true (benar), misalnya mengisi wadah makan, Snowy sedang makan
} else if (distance <= 20 && distance > distanceThreshold) {
// kita dapat menambahkan penundaan selama 1 jam atau 2 jam tergantung pada kebiasaan makan hewan peliharaan kita
// hal ini dilakukan untuk menghindari mereka merusak sistem dan makan berlebihan.
Serial.println("WAKTUNYA MAKAN!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WAKTUNYA MAKAN!");
delay(2000);
lcd.setCursor(0, 1);
isEating = false; // Atur ulang status mesin misal hewan peliharaan tidak makan
} else if (distance <= 50 && distance > 20) {
Serial.println("SNOWY MENDEKAT");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SNOWY MENDEKAT");
delay(2000);
lcd.setCursor(0, 1);
isEating = false; // Atur ulang status mesin misal hewan peliharaan tidak makan
} else if (distance >50 ) {
Serial.println("WADAH KOSONG DAN SNOWY JAUH");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WADAH KOSONG! SNOWY JAUH!");
delay(2000);
lcd.setCursor(0, 1);
isEating = false; // Atur ulang status mesin untuk kasus ini juga
delay(5000);
}
}