Tutorial: Membuat Tong Sampah Cerdas Otomatis Anti-Sentuh dengan NodeMCU

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

KomponenNama PanggilanFungsi di Proyek Ini
NodeMCU ESP8266Otak (Mikrokontroler)Tempat menyimpan dan menjalankan program (kode). Ia yang memberi perintah kepada sensor dan motor.
Sensor Ultrasonik HC-SR04MataMengukur jarak menggunakan gelombang suara. Jika ada tangan yang mendekat, sensor ini akan “melihatnya”.
Motor ServoOtotMotor yang berputar terbatas (misalnya sampai ). Menggerakkan tutup tempat sampah.
Kabel JumperUrat SarafMenghubungkan semua komponen agar bisa “berbicara” satu sama lain.

Prinsip Kerja (Logika Program)

  1. Lihat Jarak: NodeMCU meminta Sensor Ultrasonik untuk mengukur jarak.
  2. Ambil Keputusan:
    • JIKA jarak yang terukur KURANG DARI 50 cm (artinya ada objek mendekat).
    • MAKA Motor Servo akan bergerak dari (Tutup) ke (Buka).
  3. Tunggu: Setelah tutup terbuka, sistem akan menunggu selama 3 detik.
  4. Tutup Kembali: Motor Servo akan kembali ke posisi awal (Tutup).
  5. 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)

NoNama KomponenKeterangan
1NodeMCU ESP8266Mikrokontroler utama.
2Sensor Ultrasonik HC-SR04Untuk mengukur jarak.
3Motor Servo (SG90 atau sejenisnya)Untuk menggerakkan tutup.
4Kabel Jumper (Male-Female dan Male-Male)Konektor.
5Kabel USB Micro BKabel daya dan upload program.
6Tempat Sampah KecilModel penerapan.

Langkah Kerja 1: Wiring (Pemasangan Komponen)

Lakukan pemasangan kabel sesuai tabel berikut. Kita menggunakan pin D1, D2, dan D7 pada NodeMCU.

KomponenNama PinTerhubung ke Pin NodeMCUKeterangan
HC-SR04VCCPower
HC-SR04GNDGround
HC-SR04TrigD1 (GPIO5)Pin kirim sinyal.
HC-SR04EchoD2 (GPIO4)Pin terima sinyal pantulan.
Motor ServoKabel Merah (Power)Power
Motor ServoKabel Coklat/Hitam (GND)Ground
Motor ServoKabel 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); 
}

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *