#include <Wire.h> // Library untuk I2C
#include <LiquidCrystal_I2C.h> // Library untuk LCD I2C
#include <Servo.h> // Library untuk Servo Motor
// Inisialisasi LCD 16x2 dengan alamat I2C 0x27
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pin sensor ultrasonik 1 (deteksi sampah)
const int trigPin1 = 7;
const int echoPin1 = 6;
// Pin sensor ultrasonik 2 (deteksi tangan)
const int trigPin2 = 9;
const int echoPin2 = 8;
// Servo motor
Servo servo;
const int servoPin = 3;
// Variabel untuk menyimpan jarak
long duration1, duration2;
int distance1, distance2;
void setup() {
// Inisialisasi Serial Monitor
Serial.begin(9600);
// Konfigurasi pin
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
// Inisialisasi servo motor
servo.attach(servoPin);
servo.write(0); // Tutup awalnya
// Inisialisasi LCD
lcd.init();
lcd.backlight();
// Pesan awal di LCD
lcd.setCursor(0, 0);
lcd.print("Tempat Sampah");
delay(2000);
lcd.clear();
}
void loop() {
// Baca jarak dari Ultrasonik 1 (deteksi sampah)
digitalWrite(trigPin1, LOW);
delayMicroseconds(2);
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
duration1 = pulseIn(echoPin1, HIGH);
distance1 = duration1 * 0.034 / 2;
// Baca jarak dari Ultrasonik 2 (deteksi tangan)
digitalWrite(trigPin2, LOW);
delayMicroseconds(2);
digitalWrite(trigPin2, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin2, LOW);
duration2 = pulseIn(echoPin2, HIGH);
distance2 = duration2 * 0.034 / 2;
// Logika untuk menampilkan status sampah
if (distance1 <= 5) { // Jika jarak <= 5 cm, sampah penuh
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Status: PENUH");
servo.write(0); // Pastikan tutup tetap tertutup
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Status: TERSEDIA");
}
// Logika untuk membuka tutup saat tangan terdeteksi
if (distance2 <= 10) { // Jika jarak <= 10 cm, buka tutup
servo.write(90); // Buka tutup
delay(2000); // Tunggu 2 detik
servo.write(0); // Tutup kembali
}
delay(500); // Tunggu 0,5 detik sebelum membaca ulang
}