#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <HX711.h>
const int trigPin1 = 9; // Ultrasonic sensor 1 (untuk mendeteksi orang mendekat)
const int echoPin1 = 10;
const int trigPin2 = 11; // Ultrasonic sensor 2 (untuk mengukur level isi tempat sampah)
const int echoPin2 = 12;
const int pirPin = 2;
const int ledMerah = 3, ledKuning = 4, ledHijau = 5;
const int buzzerPin = 6;
Servo servoMotor;
LiquidCrystal_I2C lcd(0x27, 16, 2);
HX711 scale;
void setup() {
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
pinMode(pirPin, INPUT);
pinMode(ledMerah, OUTPUT);
pinMode(ledKuning, OUTPUT);
pinMode(ledHijau, OUTPUT);
pinMode(buzzerPin, OUTPUT);
servoMotor.attach(7);
// Inisialisasi LCD
lcd.init(); // Ganti lcd.begin(16, 2) dengan lcd.init()
lcd.backlight(); // Menyalakan backlight LCD
lcd.print("Tempat Sampah");
delay(2000);
lcd.clear();
// Inisialisasi load cell
scale.begin(A1, A0);
scale.set_scale(2280.f); // Kalibrasi sesuai dengan load cell Anda
scale.tare();
}
void loop() {
if (digitalRead(pirPin) == HIGH) {
servoMotor.write(90); // Buka tutup tempat sampah
delay(2000);
servoMotor.write(0); // Tutup kembali
}
long distanceTrashLevel = getUltrasonicDistance(trigPin2, echoPin2);
float weight = scale.get_units(10); // Dapatkan berat dalam gram atau kilogram tergantung kalibrasi
// Logika level isi dan indikasi LED serta Buzzer
if (distanceTrashLevel < 25 || weight > 1000) { // Threshold untuk penuh, 1000 gram sebagai contoh
tampilkanStatus("Tempat Sampah Penuh", ledMerah, buzzerPin);
lcd.clear();
lcd.print("Tempat Penuh");
lcd.setCursor(0, 1);
lcd.print("Berat: ");
lcd.print(weight, 1);
lcd.print(" kg");
}
else if (distanceTrashLevel < 50) {
tampilkanStatus("Tempat Sampah Terisi", ledKuning, -1);
lcd.clear();
lcd.print("Tempat Terisi");
lcd.setCursor(0, 1);
lcd.print("Setengah Penuh");
}
else {
tampilkanStatus("Tempat Sampah Kosong", ledHijau, -1);
lcd.clear();
lcd.print("Tempat Kosong");
}
delay(500);
}
long getUltrasonicDistance(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; // Menghitung jarak dalam cm
}
void tampilkanStatus(String status, int ledPin, int buzzerPin) {
digitalWrite(ledMerah, LOW);
digitalWrite(ledKuning, LOW);
digitalWrite(ledHijau, LOW);
digitalWrite(ledPin, HIGH);
if (buzzerPin != -1) {
digitalWrite(buzzerPin, HIGH);
delay(1000);
digitalWrite(buzzerPin, LOW);
}
}