๐พ [Jurnal Hari 2] Merakit Otak Dispenser: Arduino, RTC, Servo, dan Tombol
https://chatgpt.com/share/687c732b-38b8-800b-ab2c-8631a24b3949
Hari ini Tia dan saya memulai langkah pertama membuat dispenser makanan kucing otomatis, langsung dari nol, hanya berbekal:
- Arduino Uno
- Servo motor
- RTC DS3231
- Sensor ultrasonik HC-SR04
- Breadboard dan kabel jumper
- Push button (tombol manual)
๐ฏ Tujuan Hari Ini:
- Membuat sistem yang bisa:
- Memberi makan otomatis saat jam tertentu
- Deteksi apakah mangkuk sudah kosong atau belum
- Bisa diberi makan manual lewat tombol
๐ง Proses Langkah demi Langkah
1. Menghubungkan RTC DS3231 dan Servo
RTC ini akan memberi waktu yang akurat untuk menentukan jam makan. Kami menggunakan jam 07:00 dan 17:00 sebagai waktu makan default. Ketika waktu itu tiba dan mangkuk kosong, maka servo akan bergerak membuka katup makanan.
2. Menambahkan Sensor Jarak HC-SR04
Sensor ini digunakan untuk mendeteksi apakah mangkuk kucing sedang kosong. Jika jaraknya terlalu pendek, berarti mangkuk masih penuh dan sistem tidak akan memberi makan agar tidak mubazir.
3. Menambahkan Tombol Manual
Kami menambahkan tombol dengan 4 kaki (push button standar). Setelah dites, sistem dapat mendeteksi saat tombol ditekan, dan memberi makan kapan pun pemilik menekan tombol itu โ sangat berguna kalau ingin memberi makan lebih awal dari jadwal.
๐ง Logika Program
Program Arduino ditulis agar:
- Servo hanya bergerak jika jam tepat dan mangkuk kosong
- Tombol bisa ditekan kapan pun untuk memberi makan manual
- Setiap fitur tetap aktif tanpa saling mengganggu
๐งช Hasil Hari Ini
โ Sistem berhasil bekerja:
- Waktu dikenali dengan tepat oleh RTC
- Sensor jarak bisa membedakan mangkuk penuh/kosong
- Tombol berfungsi baik dan responsif
๐ง Catatan & Rencana Lanjut
- Tombol awalnya kurang responsif (butuh ditekan lama), jadi kode ditulis ulang agar mendeteksi tekan cepat dengan logika state change.
- Rencana berikutnya: menambahkan LCD untuk menampilkan jam, status mangkuk, dan info aksi terakhir.
- Setelah sistem kontrol beres, kami akan mulai mendesain mekanik katup makanan dan wadah untuk dicetak 3D.
๐ธ Dokumentasi Gambar/Video



โ๏ธ Penutup
Hari pertama ini jadi pondasi utama sistem. Dengan sensor dan logika waktu yang sudah berfungsi, sistem ini siap dikembangkan jadi alat nyata yang bisa membantu pemilik kucing sibuk seperti saya.
Dispenser ini bukan hanya soal teknologi, tapi juga kenyamanan dan perhatian untuk teman berbulu kita. ๐บ
#include <Wire.h>
#include <RTClib.h>
#include <Servo.h>
RTC_DS3231 rtc;
Servo myservo;
// Waktu makan
const int jamMakan1 = 7;
const int jamMakan2 = 17;
bool sudahKasihMakan = false;
// HC-SR04
const int trigPin = 7;
const int echoPin = 6;
// Tombol manual
const int tombolPin = 3;
bool tombolSudahDitekan = false;
void setup() {
Serial.begin(9600);
myservo.attach(9);
rtc.begin();
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(tombolPin, INPUT_PULLUP); // tombol aktif LOW
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...");
myservo.write(90); // Buka
delay(1000); // Tunggu 1 detik
myservo.write(0); // Tutup
}
void loop() {
DateTime now = rtc.now();
float jarak = bacaJarak();
bool mangkukKosong = jarak > 10.0; // sesuaikan sesuai mangkukmu
bool tombolSekarang = digitalRead(tombolPin) == LOW;
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");
// Otomatis kasih makan saat waktu tiba & mangkuk kosong
if ((now.hour() == jamMakan1 || now.hour() == jamMakan2) &&
!sudahKasihMakan && mangkukKosong) {
kasihMakan();
sudahKasihMakan = true;
}
// Reset status makan saat jam sudah berganti menit
if (now.minute() != 0) {
sudahKasihMakan = false;
}
// Manual via tombol - hanya sekali per tekan
if (tombolSekarang && !tombolSudahDitekan) {
kasihMakan();
tombolSudahDitekan = true;
}
// Reset deteksi tombol setelah dilepas
if (!tombolSekarang) {
tombolSudahDitekan = false;
}
delay(100); // Cek tombol dan sensor tiap 0.1 detik
}