Halo sobat elektronika! Pernahkah kamu membayangkan memiliki tempat sampah yang tutupnya bisa membuka sendiri tanpa harus disentuh? Selain keren, ini juga jauh lebih higienis, lho.
Dalam tutorial kali ini, kita akan menggunakan NodeMCU ESP8266, Sensor Ultrasonik, dan Motor Servo untuk membuat proyek otomasi sederhana yang sangat berguna ini. Proyek ini cocok untuk kamu yang baru belajar mikrokontroler!
1. Modul Praktikum: Konsep Dasar
Proyek Tong Sampah Cerdas ini bekerja berdasarkan logika sederhana, yaitu: Mata melihat, Otak memerintah, Otot bergerak.
Komponen Utama
| Komponen | Nama Panggilan | Fungsi di Proyek Ini |
|---|---|---|
| NodeMCU ESP8266 | Otak (Mikrokontroler) | Tempat menyimpan dan menjalankan program (kode). Ia yang memberi perintah kepada sensor dan motor. |
| Sensor Ultrasonik HC-SR04 | Mata | Mengukur jarak menggunakan gelombang suara. Jika ada tangan yang mendekat, sensor ini akan “melihatnya”. |
| Motor Servo | Otot | Motor yang berputar terbatas (misalnya sampai ). Menggerakkan tutup tempat sampah. |
| Kabel Jumper | Urat Saraf | Menghubungkan semua komponen agar bisa “berbicara” satu sama lain. |
Prinsip Kerja (Logika Program)
- Lihat Jarak: NodeMCU meminta Sensor Ultrasonik untuk mengukur jarak.
- Ambil Keputusan:
- JIKA jarak yang terukur KURANG DARI 50 cm (artinya ada objek mendekat).
- MAKA Motor Servo akan bergerak dari (Tutup) ke (Buka).
- Tunggu: Setelah tutup terbuka, sistem akan menunggu selama 3 detik.
- Tutup Kembali: Motor Servo akan kembali ke posisi awal (Tutup).
- Ulangi: Proses ini akan terus berjalan (Loop) selama alat ini menyala.
Tips: Sensor Ultrasonik bekerja dengan mengukur waktu pantulan suara. Cepatnya pantulan menunjukkan jarak yang dekat!
2. Jobsheet: Langkah Praktis
Alat dan Bahan (Checklist)
| No | Nama Komponen | Keterangan |
|---|---|---|
| 1 | NodeMCU ESP8266 | Mikrokontroler utama. |
| 2 | Sensor Ultrasonik HC-SR04 | Untuk mengukur jarak. |
| 3 | Motor Servo (SG90 atau sejenisnya) | Untuk menggerakkan tutup. |
| 4 | Kabel Jumper (Male-Female dan Male-Male) | Konektor. |
| 5 | Kabel USB Micro B | Kabel daya dan upload program. |
| 6 | Tempat Sampah Kecil | Model penerapan. |
Langkah Kerja 1: Wiring (Pemasangan Komponen)
Lakukan pemasangan kabel sesuai tabel berikut. Kita menggunakan pin D1, D2, dan D7 pada NodeMCU.
| Komponen | Nama Pin | Terhubung ke Pin NodeMCU | Keterangan |
|---|---|---|---|
| HC-SR04 | VCC | Power | |
| HC-SR04 | GND | Ground | |
| HC-SR04 | Trig | D1 (GPIO5) | Pin kirim sinyal. |
| HC-SR04 | Echo | D2 (GPIO4) | Pin terima sinyal pantulan. |
| Motor Servo | Kabel Merah (Power) | Power | |
| Motor Servo | Kabel Coklat/Hitam (GND) | Ground | |
| Motor Servo | Kabel Kuning/Oranye (Signal) | D7 (GPIO13) | Pin kontrol sudut. |
Langkah Kerja 2: Pemrograman (Kode Arduino)
Buka Arduino IDE, pastikan NodeMCU ESP8266 sudah terinstal, lalu salin dan unggah (upload) kode berikut:
#include <Arduino.h>
// Gunakan library Servo standar Arduino
#include <Servo.h>
// Pin-pin pada NodeMCU (ESP8266)
#define D1 5
#define D2 4
#define D7 13
// ===================================================================
// 1. PIN DEFINITIONS (Sesuai dengan GPIO pada NodeMCU)
// ===================================================================
// HC-SR04 Ultrasonic Sensor Pins
const int TRIG_PIN = D1; // D1 adalah GPIO5
const int ECHO_PIN = D2; // D2 adalah GPIO4
// Servo Motor Pin
const int SERVO_PIN = D7; // D7 adalah GPIO13
// ===================================================================
// 2. MOTOR AND CONTROL CONSTANTS
// ===================================================================
// Sudut Awal Servo (Posisi 'Home' atau default)
const int HOME_ANGLE = 0;
// Sudut Target Servo (Posisi aktif/buka)
const int ACTIVE_ANGLE = 150;
// Jarak ambang batas dalam centimeter.
// Servo akan berputar jika objek lebih dekat dari jarak ini.
const int PROXIMITY_THRESHOLD_CM = 50;
// Waktu tunda (delay) setelah servo berputar ke posisi ACTIVE_ANGLE
const unsigned long ACTION_DELAY_MS = 3000; // 3 detik
// ===================================================================
// 3. SERVO SETUP
// ===================================================================
// Inisialisasi objek Servo
Servo servoMotor;
// Variabel untuk melacak posisi saat ini
int currentAngle = HOME_ANGLE;
// ===================================================================
// 4. DISTANCE MEASUREMENT FUNCTION
// ===================================================================
/**
* Measures the distance to the nearest object using the HC-SR04 sensor.
* @return The distance in centimeters (cm).
*/
long measureDistanceCm() {
// Clear the trigger pin by setting it LOW for a moment.
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
// Send a 10 microsecond pulse to the trigger pin.
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Read the echo pin, returns the sound wave travel time in microseconds.
long duration = pulseIn(ECHO_PIN, HIGH);
// Calculate the distance in cm. Distance (cm) = Duration / 58.
return duration / 58;
}
// ===================================================================
// 5. SETUP
// ===================================================================
void setup() {
Serial.begin(115200);
Serial.println("\n--- ESP8266 Servo Control Initialized ---");
Serial.print("Batas Jarak: ");
Serial.print(PROXIMITY_THRESHOLD_CM);
Serial.println(" cm");
// Configure HC-SR04 pins
pinMode(TRIG_PIN, OUTPUT);
pinMode(D4, OUTPUT); // D4 (GPIO2) untuk LED onboard/indikator
pinMode(ECHO_PIN, INPUT);
// Hubungkan Servo ke pin kontrol D7
servoMotor.attach(SERVO_PIN);
// Atur posisi awal servo ke HOME_ANGLE
servoMotor.write(HOME_ANGLE);
currentAngle = HOME_ANGLE;
// Beri waktu servo untuk mencapai posisi awal
delay(1000);
}
// ===================================================================
// 6. MAIN LOOP (LOGIKA UTAMA)
// ===================================================================
void loop() {
// 1. Baca Jarak saat ini
long distanceCm = measureDistanceCm();
Serial.print("Jarak Terbaca: ");
Serial.print(distanceCm);
Serial.println(" cm");
digitalWrite(D4, LOW);
// 2. Cek Kondisi
if (distanceCm < PROXIMITY_THRESHOLD_CM) {
// KONDISI 1: Objek Ditemukan (DEKAT DARI 50 CM)
if (currentAngle != ACTIVE_ANGLE) {
Serial.println(">>> OBJEK DEKAT! Membuka tutup...");
// Pindah ke sudut aktif (Buka)
servoMotor.write(ACTIVE_ANGLE);
currentAngle = ACTIVE_ANGLE;
// TAMBAHAN: Tahan posisi selama 3 detik
Serial.println("!!! Tutup terbuka. Menunggu 3 detik...");
delay(ACTION_DELAY_MS);
Serial.println("!!! Selesai menunggu. Tutup siap ditutup jika objek sudah menjauh.");
}
} else {
// KONDISI 2: Objek Jauh
if (currentAngle != HOME_ANGLE) {
Serial.println("<<< Objek menjauh. Menutup tutup...");
// Pindah kembali ke sudut HOME_ANGLE (Tutup)
servoMotor.write(HOME_ANGLE);
currentAngle = HOME_ANGLE;
}
}
// Waktu jeda agar sensor stabil
delay(200);
}