// Program Tempat Sampah Otomatis (Final Optimized)
#include <Servo.h>
// --- KONFIGURASI PENGGUNA ---
// 'false' = Buzzer mati (Silent Mode) secara default
// Ubah ke 'true' jika ingin mengaktifkan suara
const bool GUNAKAN_BUZZER = false;
// --- Definisi Pin (SUDAH DITUKAR) ---
const int PIN_TRIG = A0;
const int PIN_ECHO = A1;
const int PIN_BUZZER = 8;
const int PIN_LED_MERAH = 9; // Sebelumnya 10 (Sekarang di 9)
const int PIN_LED_HIJAU = 10; // Sebelumnya 9 (Sekarang di 10)
const int PIN_SERVO = 11;
// --- Setting Lain ---
const int POS_TUTUP = 0;
const int POS_BUKA = 100;
const int JARAK_TRIGGER = 8; // Batas jarak (cm)
Servo servoTong;
void setup() {
Serial.begin(9600);
pinMode(PIN_BUZZER, OUTPUT);
pinMode(PIN_LED_HIJAU, OUTPUT);
pinMode(PIN_LED_MERAH, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(PIN_TRIG, OUTPUT);
// Pastikan buzzer mati saat awal
digitalWrite(PIN_BUZZER, LOW);
// KONDISI AWAL (Standby): Hijau Nyala, Merah Mati
digitalWrite(PIN_LED_HIJAU, HIGH);
digitalWrite(PIN_LED_MERAH, LOW);
servoTong.attach(PIN_SERVO);
servoTong.write(POS_TUTUP);
}
void loop() {
int jarak = bacaJarak();
// DEBUG SERIAL: Selalu tampil setiap saat (bahkan jika 0)
Serial.print("Jarak: ");
Serial.print(jarak);
Serial.println(" cm");
// Logika Aksi
// Kita cek jarak > 0 untuk menghindari error pembacaan (0 biasanya error/out of range)
if (jarak > 0 && jarak < JARAK_TRIGGER) {
aksiBukaTong();
} else {
aksiTutupTong();
}
delay(50); // Delay kecil untuk stabilitas
}
// --- Fungsi Logika ---
int bacaJarak() {
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
// Timeout 30ms (sekitar 5 meter)
unsigned long duration = pulseIn(PIN_ECHO, HIGH, 30000);
if (duration == 0) return 0; // Jika timeout, kembalikan 0
return (int)(duration / 58);
}
void aksiBukaTong() {
servoTong.write(POS_BUKA);
// Sequence 1: Peringatan Awal
setIndikator(HIGH, HIGH, HIGH);
delay(300);
// Sequence 2: Jeda Kedip
setIndikator(LOW, LOW, LOW);
delay(100);
// Sequence 3: Peringatan Kedua
setIndikator(HIGH, HIGH, HIGH);
delay(500);
// Sequence 4: Waktu Buang Sampah (5 detik)
// Merah Nyala (Sibuk), Hijau Mati
digitalWrite(PIN_LED_HIJAU, LOW);
digitalWrite(PIN_LED_MERAH, HIGH);
digitalWrite(PIN_BUZZER, LOW);
delay(5000);
// Selesai
servoTong.write(POS_TUTUP);
setIndikator(LOW, LOW, LOW);
}
void aksiTutupTong() {
servoTong.write(POS_TUTUP);
// Standby: Hijau Nyala (Ready), Merah Mati
digitalWrite(PIN_LED_HIJAU, HIGH);
digitalWrite(PIN_LED_MERAH, LOW);
digitalWrite(PIN_BUZZER, LOW);
}
// Fungsi Kontrol Indikator dengan pengecekan Config Buzzer
void setIndikator(bool hijau, bool merah, bool buzzerState) {
digitalWrite(PIN_LED_HIJAU, hijau);
digitalWrite(PIN_LED_MERAH, merah);
if (GUNAKAN_BUZZER == true) {
digitalWrite(PIN_BUZZER, buzzerState);
} else {
digitalWrite(PIN_BUZZER, LOW); // Paksa mati jika config false
}
}