#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

int trigPin = 5;
int echoPin = 6;
float duration, cm;
int trigPins = 7;
int echoPins = 8;
float durations, cms;

Servo servoOpen;

const int buzzerPin = 10;

int previousStatus = 0; // Variabel untuk menyimpan status level sampah sebelumnya

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(trigPins, OUTPUT);
  pinMode(echoPins, INPUT);
  servoOpen.attach(9);
  servoOpen.write(0);
  pinMode(buzzerPin, OUTPUT);
  updateLCD();
}

void loop() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);

  digitalWrite(trigPins, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPins, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPins, LOW);
  durations = pulseIn(echoPins, HIGH);

  cm = (duration / 2) / 29.1;
  cms = (durations / 2) / 29.1;

  if (cm <= 250) {
    servoOpen.write(90);
    digitalWrite(buzzerPin, LOW); // Matikan buzzer saat tempat sampah terbuka
    delay(500);
  } else {
    servoOpen.write(0);

    // Cek apakah status level sampah berubah dari "Penuh" ke status lainnya
    if (previousStatus == 1) {
      digitalWrite(buzzerPin, HIGH); // Nyalakan buzzer saat status "Penuh"
      delay(1000); // Waktu buzzer menyala (dapat disesuaikan)
    } else {
      digitalWrite(buzzerPin, LOW); // Matikan buzzer saat tempat sampah tertutup dan tidak penuh
    }

    // Simpan status level sampah sekarang sebagai status sebelumnya
    previousStatus = 0;
  }

  updateLCD();
}

void updateLCD() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Level Sampah :");
  lcd.setCursor(0, 1);
  if (cms >= 210 && cms <= 300) {
    lcd.print("Sedikit");
    previousStatus = 0; // Set status sebelumnya menjadi 0 ("Sedikit")
  } else if (cms <= 209 && cms >= 70) {
    lcd.print("Setengah");
    previousStatus = 0; // Set status sebelumnya menjadi 0 ("Setengah")
  } else if (cms >= 0 && cms <= 69) {
    lcd.print("Penuh");
    previousStatus = 1; // Set status sebelumnya menjadi 1 ("Penuh")
  } else {
    lcd.print("Kosong");
    previousStatus = 0; // Set status sebelumnya menjadi 0 ("Kosong")
  }
}