Pada tutorial ini, kita akan membuat tempat sampah pintar yang bisa membuka tutupnya secara otomatis tanpa perlu disentuh tangan — cukup dekatkan tangan ke sensor, tutupnya akan terbuka sendiri. Proyek ini memakai Arduino UNO, sensor jarak HC-SR04, dan motor servo sebagai penggerak tutup, semua disimulasikan di Wokwi.
| Bagian | Komponen | Fungsi |
|---|---|---|
| Board | Arduino UNO | Membaca sensor dan menggerakkan servo |
| Sensor | HC-SR04 Ultrasonik | Mendeteksi jarak tangan (TRIG di pin 3, ECHO di pin 2) |
| Output | Micro Servo | Membuka/menutup tutup tempat sampah (PWM di pin 10) |
| Ambang Jarak | 15 cm | Batas jarak tangan supaya tutup terbuka |
| Posisi Servo | 0° / 90° | 0° = tertutup, 90° = terbuka |
| Library | Servo | Memudahkan pengontrolan sudut motor servo |
Proyek ini mensimulasikan tempat sampah otomatis yang dapat membuka tutupnya tanpa disentuh. Sensor ultrasonik membaca jarak tangan. Ketika tangan berada dekat dengan sensor, Arduino memberi perintah kepada servo untuk membuka tutup. Setelah beberapa detik, servo kembali ke posisi awal sehingga tutup menutup lagi.
Setelah menyelesaikan tutorial ini, kamu diharapkan bisa:
| Komponen | Fungsi |
|---|---|
| Arduino UNO | Mikrokontroler utama yang membaca sensor dan mengontrol servo. |
| HC-SR04 | Sensor ultrasonik untuk mendeteksi jarak tangan dari tempat sampah. |
| Micro Servo | Motor kecil untuk membuka dan menutup tutup tempat sampah. |
| Breadboard | Membagi jalur 5V dan GND untuk sensor dan servo. |
| Kabel jumper | Menghubungkan semua komponen di area simulasi Wokwi. |
Library yang perlu dipasang di Wokwi untuk proyek ini adalah Servo. Buka tab Library Manager di Wokwi, lalu pastikan library ini sudah muncul di daftar Installed Libraries.
Pastikan servo menggunakan jalur daya 5V dan GND yang sama dengan Arduino (lewat breadboard). Jalur ground (GND) yang tidak tersambung dengan benar adalah penyebab paling umum servo terlihat “diam saja” meskipun kabel PWM-nya sudah benar — karena servo butuh referensi ground yang sama dengan Arduino supaya sinyal kontrolnya bisa “dibaca” dengan tepat.
| Jalur / Pin | Sambungan |
|---|---|
| 5V Arduino | Ke jalur (+) breadboard. |
| GND Arduino | Ke jalur (−) breadboard. |
| HC-SR04 VCC | Ke jalur (+) breadboard. |
| HC-SR04 GND | Ke jalur (−) breadboard. |
| HC-SR04 TRIG | Ke pin digital 3 Arduino. |
| HC-SR04 ECHO | Ke pin digital 2 Arduino. |
| Servo V+ | Ke jalur (+) breadboard. |
| Servo GND | Ke jalur (−) breadboard. |
| Servo PWM | Ke pin digital 10 Arduino. |
Sensor HC-SR04 bekerja dengan mengirim gelombang ultrasonik (gelombang suara berfrekuensi sangat tinggi, tidak terdengar telinga manusia) dari pin TRIG, lalu menunggu pantulan gelombang tersebut kembali diterima di pin ECHO. Arduino kemudian menghitung berapa lama waktu dari gelombang dipancarkan sampai pantulannya diterima kembali, dan mengubah waktu tersebut menjadi jarak dalam satuan sentimeter. Prinsip ini sama seperti cara kelelawar “melihat” dalam gelap menggunakan gema suara (ekolokasi).
| Jarak | Status Tutup |
|---|---|
| 1–15 cm | Terbuka (servo 90 derajat) |
| Lebih dari 15 cm | Tetap tertutup (servo 0 derajat) |
Saat sensor membaca jarak tangan 15 cm atau kurang, servo membuka selama 3 detik, lalu kembali menutup secara otomatis.
Buka file sketch.ino di Wokwi, lalu salin kode berikut:
#include <Servo.h>
// Menyiapkan colokan komponen
int trigPin = 3;
int echoPin = 2;
Servo tutupSampah; // Memberi nama servonya "tutupSampah"
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
tutupSampah.attach(10); // Servo dicolok ke angka 10
tutupSampah.write(0); // Posisi Awal: Tutup tempat sampah TERTUTUP (0 derajat)
Serial.println("Tempat Sampah Pintar SIAP DIGUNAKAN.");
Serial.println("Dekatkan tangan Anda (di bawah 15 cm) untuk membuka.");
}
void loop() {
// 1. Membaca Jarak (Mendeteksi Tangan)
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
int jarak = duration * 0.034 / 2;
// 2. Logika Buka/Tutup Tempat Sampah
if (jarak > 0 && jarak <= 15) {
// JIKA ADA TANGAN MENDEKAT (Jarak 15 cm atau kurang)
Serial.println("Tangan terdeteksi! Membuka tutup sampah...");
// Motor bergerak 90 derajat untuk membuka tutup sampah
tutupSampah.write(90);
// Tahan posisi terbuka selama 3 detik agar orang bisa buang sampah
delay(3000);
// Setelah 3 detik, tutup kembali
Serial.println("Menutup kembali tempat sampah.");
tutupSampah.write(0);
// Beri jeda 1 detik agar tutup benar-benar rapat sebelum membaca sensor lagi
delay(1000);
} else {
// JIKA TIDAK ADA ORANG (Jarak lebih dari 15 cm)
// Pastikan tutup tetap tertutup rapat
tutupSampah.write(0);
}
delay(100); // Jeda sangat singkat untuk pembacaan sensor
}
Klik masing-masing bagian di bawah ini untuk memahami fungsinya satu per satu:
#include <Servo.h> — memanggil library untuk mengontrol motor servo.int trigPin = 3; — variabel yang menyimpan nomor pin TRIG sensor, yaitu pin digital 3.int echoPin = 2; — variabel yang menyimpan nomor pin ECHO sensor, yaitu pin digital 2.Servo tutupSampah; — membuat objek (perwakilan) servo di dalam program, diberi nama tutupSampah supaya mudah dipahami fungsinya saat membaca kode.Serial.begin(9600); — mengaktifkan komunikasi Serial Monitor.pinMode(trigPin, OUTPUT); — mengatur pin TRIG sebagai output, karena pin ini yang mengirim sinyal ultrasonik keluar.pinMode(echoPin, INPUT); — mengatur pin ECHO sebagai input, karena pin ini yang menerima sinyal pantulan.tutupSampah.attach(10); — menghubungkan objek servo ke pin fisik 10 Arduino.tutupSampah.write(0); — memutar servo ke posisi 0 derajat (tertutup) sebagai posisi awal saat program baru dinyalakan.Serial.println(...) dua baris — menampilkan pesan pembuka ke Serial Monitor, memberi tahu bahwa sistem sudah siap dipakai.digitalWrite(trigPin, LOW); delayMicroseconds(2); — memastikan pin TRIG dalam kondisi mati sesaat, sebagai "ancang-ancang" sebelum mengirim sinyal.digitalWrite(trigPin, HIGH); delayMicroseconds(10); — menyalakan TRIG selama 10 mikrodetik untuk memancarkan gelombang ultrasonik.digitalWrite(trigPin, LOW); — mematikan TRIG lagi setelah gelombang dipancarkan.long duration = pulseIn(echoPin, HIGH); — pulseIn() mengukur berapa lama (dalam mikrodetik) pin ECHO menerima sinyal HIGH, yaitu waktu tempuh gelombang pergi dan kembali.int jarak = duration * 0.034 / 2; — mengubah waktu tempuh gelombang menjadi jarak dalam sentimeter. Angka 0.034 adalah kecepatan suara di udara (dalam cm per mikrodetik), dibagi 2 karena gelombang menempuh jarak dua kali (pergi dan pantul kembali).if (jarak > 0 && jarak <= 15) { ... } — tanda && berarti "dan". Kondisi ini bernilai benar hanya jika jarak lebih dari 0 DAN 15 atau kurang. Syarat "lebih dari 0" penting untuk menyaring hasil pembacaan yang tidak valid/error dari sensor (kadang sensor bisa membaca 0 jika tidak ada pantulan terdeteksi sama sekali).if ini: pesan "Tangan terdeteksi!" ditampilkan, servo diputar ke 90 derajat (membuka), lalu delay(3000) menahan posisi terbuka selama 3 detik supaya pengguna sempat membuang sampah.0 derajat (menutup), lalu ada jeda tambahan delay(1000) selama 1 detik supaya tutup benar-benar rapat sebelum sensor membaca jarak lagi.else { ... } — kalau kondisi di atas tidak terpenuhi (tidak ada tangan yang cukup dekat), servo dipastikan tetap di posisi 0 derajat (tertutup).delay(100); — jeda sangat singkat (0,1 detik) sebelum loop() mengulang dan membaca jarak lagi, supaya sensor bisa merespons dengan cepat saat ada tangan mendekat.Pada kondisi awal, servo berada di posisi 0 derajat. Ketika tangan didekatkan ke sensor, Serial Monitor menampilkan pesan bahwa tangan terdeteksi, lalu servo bergerak membuka. Setelah durasi tunggu selesai, servo kembali menutup.
| Kondisi | Aksi Arduino | Hasil |
|---|---|---|
| Jarak lebih dari 15 cm | Servo dijaga pada 0 derajat | Tutup tertutup |
| Jarak 1–15 cm | Servo diarahkan ke 90 derajat | Tutup terbuka |
| Setelah 3 detik | Servo kembali ke 0 derajat | Tutup menutup otomatis |
| Masalah | Solusi |
|---|---|
| Servo tidak bergerak | Cek kabel PWM servo sudah masuk ke pin 10, V+ ke jalur 5V, dan GND ke jalur ground. |
| Sensor tidak membaca jarak | Pastikan TRIG masuk ke pin 3 dan ECHO masuk ke pin 2, jangan tertukar. |
| Nilai jarak terlihat aneh/tidak wajar | Cek jalur VCC dan GND sensor, lalu pastikan simulasi memang sudah dijalankan (tombol Play aktif). |
| Tutup terbuka terus-menerus | Pastikan objek simulasi tidak terus berada dalam jarak di bawah 15 cm dari sensor. |
| Program error saat compile | Pastikan library Servo sudah tersedia di Library Manager, dan tanda kurung kurawal { } pada kode tidak ada yang hilang/berubah. |
Gunakan mekanik yang ringan pada tutup tempat sampah, supaya motor servo tidak dipaksa bekerja mengangkat beban yang terlalu berat — servo mikro seperti yang dipakai di simulasi ini didesain untuk beban ringan, dan bisa cepat rusak atau terbakar kalau dipaksakan mengangkat tutup yang berat.
if...else beserta operator && ("dan") dipakai untuk memastikan aksi (membuka tutup) hanya terjadi saat jarak berada dalam rentang yang valid dan masuk akal.delay() dipakai di beberapa tempat untuk mengatur waktu tunggu, seperti menahan tutup tetap terbuka sejenak, atau memberi jeda supaya tutup benar-benar rapat sebelum sensor membaca lagi.🔒 Simulasi ini dikunci. Minta passcode ke gurumu untuk membuka.