#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// Inisialisasi LCD (Alamat I2C umumnya 0x27, ukuran 16 kolom x 2 baris)
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo myServo;
// Pin Sensor Ultrasonik 1 (Pendeteksi Tangan / Buka Tutup)
const int trigPinTangan = 2;
const int echoPinTangan = 3;
// Pin Sensor Ultrasonik 2 (Pendeteksi Kapasitas Sampah di Dalam)
const int trigPinSampah = 4;
const int echoPinSampah = 5;
// Pin Buzzer & Servo
const int buzzerPin = 6; // Pastikan kabel MERAH buzzer di Wokwi dicolok ke PIN 6!
const int servoPin = 9;
// Batas Jarak (dalam cm)
const int batasTangan = 15; // Jarak tangan < 15cm = Tutup Terbuka
const int batasPenuh = 10; // Jarak sampah ke sensor < 10cm = Sampah Penuh
void setup() {
Serial.begin(9600);
// Mode Pin
pinMode(trigPinTangan, OUTPUT);
pinMode(echoPinTangan, INPUT);
pinMode(trigPinSampah, OUTPUT);
pinMode(echoPinSampah, INPUT);
pinMode(buzzerPin, OUTPUT);
// Setup Motor Servo
myServo.attach(servoPin);
myServo.write(0); // Posisi awal 0 derajat (Tertutup)
// Setup LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(" Tempat Sampah ");
lcd.setCursor(0, 1);
lcd.print(" Otomatis! ");
delay(2000);
lcd.clear();
}
// Fungsi untuk mengukur jarak dari sensor ultrasonik
long ukurJarak(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
long distance = duration * 0.034 / 2;
return distance;
}
void loop() {
long jarakTangan = ukurJarak(trigPinTangan, echoPinTangan);
long jarakSampah = ukurJarak(trigPinSampah, echoPinSampah);
// 1. Logika Pengecekan Kapasitas Sampah
if (jarakSampah > 0 && jarakSampah <= batasPenuh) {
lcd.setCursor(0, 0);
lcd.print("Status: PENUH! ");
lcd.setCursor(0, 1);
lcd.print("Mohon Kosongkan ");
// --- MODIFIKASI SUARA TOKEN LISTRIK BENARAN ---
tone(buzzerPin, 2500); // Bunyi dengan frekuensi tinggi 2500Hz ("Tit...")
delay(150); // Bunyi selama 150 milidetik
noTone(buzzerPin); // Mematikan suara buzzer
// ----------------------------------------------
} else {
lcd.setCursor(0, 0);
lcd.print("Status: AMAN ");
lcd.setCursor(0, 1);
lcd.print("Silakan Buang ");
noTone(buzzerPin); // Memastikan buzzer diam total saat aman
}
// 2. Logika Buka Tutup Otomatis
// Hanya terbuka jika tangan dekat DAN tempat sampah belum penuh
if (jarakTangan > 0 && jarakTangan <= batasTangan) {
if (jarakSampah > batasPenuh) {
myServo.write(90); // Servo bergerak ke 90 derajat (Tutup Terbuka)
delay(4000); // Tunggu 4 detik agar orang bisa membuang sampah
myServo.write(0); // Servo kembali ke 0 derajat (Tertutup)
}
}
delay(200); // Jeda mati sejenak (efek jeda diam dari token listrik) sekaligus stabilitas sensor
}Sensor di dalam tempat sampah
Sensor tangan