🐾 [Jurnal Hari ke-2] Menambahkan LCD I2C: Membuat Dispenser Lebih Informatif
Pada hari kedua ini, kami menambahkan fitur penting ke sistem dispenser makanan kucing otomatis, yaitu LCD 16×2 dengan modul I2C. Tujuannya agar sistem bisa menampilkan informasi real-time secara visual, memudahkan pemilik melihat kondisi dispenser secara langsung.
🎯 Tujuan Penambahan LCD:
- Menampilkan jam saat ini dari RTC DS3231 secara langsung
- Menampilkan status mangkuk: penuh atau kosong berdasarkan sensor ultrasonik HC-SR04
- Menampilkan notifikasi singkat saat dispenser sedang memberi makan
- Menambah nilai fungsional dan estetika perangkat
🔧 Proses Pemasangan:
- Menghubungkan LCD I2C ke pin SDA (A4) dan SCL (A5) Arduino
- Memastikan pin 5V dan GND terhubung paralel dengan RTC dan komponen lain
- Menggunakan library LiquidCrystal_I2C untuk kemudahan pemrograman
🧠 Perubahan Kode Program:
- Menambahkan inisialisasi dan setup LCD
- Membuat fungsi untuk menampilkan jam dan status mangkuk di layar
- Memperbarui fungsi utama loop agar LCD selalu menampilkan kondisi terbaru
- Menambahkan notifikasi “Memberi Makan…” saat servo bekerja
🧪 Hasil Uji Coba:
- LCD berhasil menampilkan waktu dengan format HH:MM yang akurat berkat RTC
- Status mangkuk diperbarui secara dinamis sesuai jarak yang terdeteksi sensor
- Notifikasi saat memberi makan muncul dengan jelas dan hilang setelah servo selesai
- Sistem tetap merespon tombol manual dan jam makan otomatis seperti sebelumnya
🚀 Rencana Berikutnya:
- Membuat desain mekanik penutup makanan menggunakan servo untuk 3D printing
- Menambahkan indikator LED dan/atau buzzer untuk sinyal tambahan
- Membuat dokumentasi video atau tutorial lengkap untuk komunitas Ayo3D
✍️ Penutup
Penambahan LCD I2C ini membuat dispenser makanan kucing otomatis menjadi lebih interaktif dan mudah dipantau. Kami optimis dengan perkembangan ini, proyek akan semakin matang dan siap dipakai sehari-hari.


#include <Wire.h>
#include <RTClib.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
RTC_DS3231 rtc;
Servo myservo;
// LCD I2C dengan alamat 0x27, ukuran 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int jamMakan1 = 7;
const int jamMakan2 = 17;
bool sudahKasihMakan = false;
const int trigPin = 7;
const int echoPin = 6;
const int tombolPin = 3;
bool tombolSudahDitekan = false;
void setup() {
Serial.begin(9600);
rtc.begin();
myservo.attach(9);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(tombolPin, INPUT_PULLUP);
lcd.init();
lcd.backlight();
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
float bacaJarak() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distance = duration * 0.034 / 2;
return distance;
}
void kasihMakan() {
Serial.println("Memberi makan...");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Memberi Makan...");
myservo.write(90);
delay(1000);
myservo.write(0);
delay(500);
}
void tampilkanStatus(DateTime now, float jarak, bool mangkukKosong) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Jam:");
if (now.hour() < 10) lcd.print('0');
lcd.print(now.hour());
lcd.print(':');
if (now.minute() < 10) lcd.print('0');
lcd.print(now.minute());
lcd.setCursor(0, 1);
if (mangkukKosong) {
lcd.print("Mangkuk: Kosong");
} else {
lcd.print("Mangkuk: Penuh ");
}
}
void loop() {
DateTime now = rtc.now();
float jarak = bacaJarak();
bool mangkukKosong = jarak > 10.0;
bool tombolSekarang = digitalRead(tombolPin) == LOW;
tampilkanStatus(now, jarak, mangkukKosong);
Serial.print("Waktu: ");
Serial.print(now.hour());
Serial.print(":");
Serial.print(now.minute());
Serial.print(" | Jarak: ");
Serial.print(jarak);
Serial.print(" cm | Mangkuk kosong: ");
Serial.print(mangkukKosong ? "Ya" : "Tidak");
Serial.print(" | Tombol: ");
Serial.println(tombolSekarang ? "DITEKAN" : "Lepas");
if ((now.hour() == jamMakan1 || now.hour() == jamMakan2) &&
!sudahKasihMakan &&
mangkukKosong) {
kasihMakan();
sudahKasihMakan = true;
}
if (now.minute() != 0) {
sudahKasihMakan = false;
}
if (tombolSekarang && !tombolSudahDitekan) {
kasihMakan();
tombolSudahDitekan = true;
}
if (!tombolSekarang) {
tombolSudahDitekan = false;
}
delay(100);
}