#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// Pin definisi
#define TRIG_PIN 5
#define ECHO_PIN 4
#define TRIG_VOL_PIN 11
#define ECHO_VOL_PIN 12
#define SERVO_PIN 10
// Konstanta jarak
#define MAX_DISTANCE 30 // Maksimum jarak untuk mendeteksi orang (cm)
#define MAX_VOLUME 5 // Jarak minimal untuk mendeteksi penuh (cm)
// Objek LCD dan Servo
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo servo;
// Variabel
float distancePerson = 0;
float distanceVolume = 0;
void setup() {
// Inisialisasi LCD
lcd.init();
lcd.backlight();
// Inisialisasi Servo
servo.attach(SERVO_PIN);
servo.write(0); // Tutup awal
// Inisialisasi Pin
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(TRIG_VOL_PIN, OUTPUT);
pinMode(ECHO_VOL_PIN, INPUT);
// Tampilan awal LCD
lcd.setCursor(0, 0);
lcd.print("Smart Trash Bin");
delay(2000);
lcd.clear();
}
void loop() {
// Baca jarak orang
distancePerson = getDistance(TRIG_PIN, ECHO_PIN);
// Baca volume tempat sampah
distanceVolume = getDistance(TRIG_VOL_PIN, ECHO_VOL_PIN);
lcd.setCursor(0, 0);
// Logika buka tutup
if (distanceVolume <= MAX_VOLUME) {
lcd.print("Bin is FULL!");
servo.write(0); // Tutup
} else if (distancePerson <= MAX_DISTANCE) {
lcd.print("Opening...");
servo.write(90); // Buka
} else {
lcd.print("Closed");
servo.write(0); // Tutup
}
// Tampilkan volume
lcd.setCursor(0, 1);
lcd.print("Vol:");
lcd.print(distanceVolume);
lcd.print(" cm ");
delay(500); // Delay untuk stabilitas pembacaan
}
// Fungsi untuk membaca jarak
float getDistance(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
return duration * 0.034 / 2; // Konversi ke cm
}