Skip to content

Membuat Dispenser Makanan Kucing dari 0 Hanya Berbekal ChatGPT – Hari 2 – part 2


🐾 [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);
}
Tags: