Tempat sampah yang tutupnya terbuka sendiri saat tangan Anda mendekat adalah salah satu proyek pameran sains dan tugas akhir SMK yang paling populer — terlihat mengesankan, tapi sebenarnya hanya menggabungkan dua komponen yang sudah pernah dibahas terpisah di blog ini: sensor ultrasonik dan motor servo.
Cara Kerja
Sensor ultrasonik dipasang menghadap ke atas atau ke depan tutup tempat sampah, mengukur jarak secara terus-menerus. Begitu ada tangan yang mendekat dalam jarak tertentu (misalnya 15 cm), Arduino memerintahkan servo memutar tutup ke posisi terbuka. Setelah beberapa detik tanpa ada objek terdeteksi, tutup menutup kembali secara otomatis.
Alat dan Bahan
| Komponen | Jumlah | Catatan |
|---|---|---|
| Arduino Uno / Nano | 1 | |
| Sensor ultrasonik HC-SR04 | 1 | |
| Motor servo (SG90 atau MG90S) | 1 | SG90 cukup untuk tutup dari bahan ringan |
| Tempat sampah dengan tutup engsel | 1 | Bisa dari plastik atau kardus untuk prototipe |
| Baterai 4x AA atau power bank | 1 | Supaya alat portabel, tidak perlu kabel ke stopkontak |
Skema Penyambungan
Kode Lengkap
#include <Servo.h>
const int pinTrig = 9;
const int pinEcho = 10;
const int pinServo = 11;
const int jarakBuka = 15; // cm, jarak deteksi tangan
const unsigned long waktuTunggu = 3000; // 3 detik sebelum tutup lagi
Servo servoTutup;
unsigned long waktuTerakhirDeteksi = 0;
bool tutupTerbuka = false;
long bacaJarakCm() {
digitalWrite(pinTrig, LOW);
delayMicroseconds(2);
digitalWrite(pinTrig, HIGH);
delayMicroseconds(10);
digitalWrite(pinTrig, LOW);
long durasi = pulseIn(pinEcho, HIGH, 30000); // timeout 30ms
if (durasi == 0) return 999; // tidak ada pantulan terdeteksi
return durasi * 0.034 / 2; // konversi ke cm
}
void setup() {
pinMode(pinTrig, OUTPUT);
pinMode(pinEcho, INPUT);
servoTutup.attach(pinServo);
servoTutup.write(0); // posisi tertutup
Serial.begin(9600);
}
void loop() {
long jarak = bacaJarakCm();
Serial.print("Jarak: ");
Serial.print(jarak);
Serial.println(" cm");
if (jarak < jarakBuka) {
waktuTerakhirDeteksi = millis();
if (!tutupTerbuka) {
servoTutup.write(90); // buka
tutupTerbuka = true;
}
}
if (tutupTerbuka && millis() - waktuTerakhirDeteksi > waktuTunggu) {
servoTutup.write(0); // tutup lagi
tutupTerbuka = false;
}
delay(100);
}
Perhatikan fungsi bacaJarakCm(). Fungsi pulseIn diberi parameter timeout 30000 mikrodetik — tanpa ini, program akan membeku sepenuhnya jika sensor tidak menerima pantulan sama sekali (misalnya saat tidak ada objek di depan sensor melebihi jangkauannya). Ini bug yang sangat umum pada proyek berbasis HC-SR04 dan sering membuat pemula bingung kenapa Arduino-nya "hang".
Kenapa Tutup Tidak Langsung Menutup Begitu Tangan Ditarik
Variabel waktuTerakhirDeteksi dan pengecekan millis() - waktuTerakhirDeteksi > waktuTunggu sengaja dibuat supaya tutup memberi jeda 3 detik sebelum menutup lagi. Tanpa jeda ini, tutup akan langsung menutup detik itu juga saat tangan Anda menarik sampah masuk ke lubang — berisiko menutup tepat saat tangan masih di sana. Pola jeda seperti ini identik dengan penanda sudahKirimPeringatan pada artikel relay dan Telegram sebelumnya: mencegah aksi berulang terlalu cepat.
Masalah yang Sering Muncul
| Gejala | Penyebab dan Solusi |
|---|---|
| Program seperti membeku (hang) sesekali | Parameter timeout pada pulseIn tidak diisi. Selalu sertakan nilai timeout seperti pada kode di atas. |
| Tutup terbuka-tutup terus-menerus (flickering) | Jarak deteksi terlalu sensitif terhadap pantulan dari dinding tempat sampah itu sendiri. Perbesar sedikit jarakBuka atau reposisi sensor. |
| Pembacaan jarak tidak stabil, angka meloncat-loncat | Permukaan objek yang menyerap suara (kain, busa) memantulkan sinyal lemah. Ini keterbatasan wajar sensor ultrasonik, bukan kerusakan. |
| Servo bergetar saat baterai dipakai | Baterai hampir habis tidak sanggup memberi arus lonjakan servo. Ganti baterai atau tambahkan kapasitor seperti dijelaskan di artikel motor servo. |
Pengembangan Lanjutan
Setelah versi dasar bekerja, Anda bisa menambahkan indikator LED yang menyala saat tempat sampah hampir penuh (dengan logika jarak terbalik: makin dekat pantulan dari dasar, makin penuh), atau memakai LCD I2C untuk menampilkan status "Kosong / Penuh" secara langsung di badan tempat sampah.
0 Komentar
Berkomentarlah dengan sopan dan menggunakan bahasa yang semestinya.