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

// Alamat I2C LCD, sesuaikan dengan alamat yang sesuai dengan modul LCD Anda
int lcdAddress = 0x27;

// Jumlah kolom dan baris pada LCD
int lcdColumns = 16;
int lcdRows = 2;

// Inisialisasi objek LCD
LiquidCrystal_I2C lcd(lcdAddress, lcdColumns, lcdRows);

const int trigPin = 13;   // Pin Trig
const int echoPin = 12;   // Pin Echo
const int redLedPin = 27;   // LED merah terhubung ke GPIO 27
const int yellowLedPin = 26;  // LED kuning terhubung ke GPIO 26
const int greenLedPin = 25;   // LED hijau terhubung ke GPIO 25
const int buzzerPin = 14;  // Buzzer dua kabel terhubung ke GPIO 14

void setup() {
  Serial.begin(9600);

  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  pinMode(redLedPin, OUTPUT);
  pinMode(yellowLedPin, OUTPUT);
  pinMode(greenLedPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);

  // Inisialisasi komunikasi I2C
  Wire.begin();

  // Inisialisasi LCD
  lcd.begin(lcdColumns, lcdRows);
  lcd.backlight();  // Aktifkan backlight (jika modul mendukung)

  lcd.print("Flood Monitoring:");

  delay(2000);
  lcd.clear();
  lcd.print("Measuring...");
}

void loop() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  long duration = pulseIn(echoPin, HIGH);
  float distance_cm = duration * 0.034 / 2;

  lcd.clear();
  lcd.print("Distance: ");
  lcd.print(distance_cm);
  lcd.print(" cm");

  // Menyalakan LED dan buzzer berdasarkan tinggi air
  if (distance_cm >= 1 && distance_cm <= 7) {
    digitalWrite(redLedPin, HIGH);
    digitalWrite(yellowLedPin, LOW);
    digitalWrite(greenLedPin, LOW);
    tone(buzzerPin, 1500); // Nyalakan buzzer
    lcd.setCursor(0, 1);
    lcd.print("Level: BAHAYA");
    delay(2000); // Buzzer menyala selama 2 detik
    noTone(buzzerPin); // Matikan buzzer
    delay(1000);  // Tunggu sejenak sebelum mengulang
  } else if (distance_cm > 7 && distance_cm <= 11) {
    digitalWrite(redLedPin, LOW);
    digitalWrite(yellowLedPin, HIGH);
    digitalWrite(greenLedPin, LOW);
    noTone(buzzerPin); // Matikan buzzer
    lcd.setCursor(0, 1);
    lcd.print("Level: WASPADA");
  } else if (distance_cm > 11 && distance_cm <= 19) {
    digitalWrite(redLedPin, LOW);
    digitalWrite(yellowLedPin, LOW);
    digitalWrite(greenLedPin, HIGH);
    noTone(buzzerPin); // Matikan buzzer
    lcd.setCursor(0, 1);
    lcd.print("Level: AMAN");
  } else {
    // Jika ketinggian air di luar rentang yang ditentukan
    digitalWrite(redLedPin, LOW);
    digitalWrite(yellowLedPin, LOW);
    digitalWrite(greenLedPin, LOW);
    noTone(buzzerPin); // Matikan buzzer
    lcd.setCursor(0, 1);
    lcd.print("level: AMAN");
  }

  delay(1000);
}