//Amaliah Ramadanti
// 213510320

#include <LiquidCrystal_I2C.h> // memasukkan library LiquidCrystal_I2C (Library LCD)
#define ECHO_PIN 6 // pin sensor ultrasonik untuk membaca echo
#define TRIG_PIN 7 // pin sensor ultrasonik untuk mengirimkan sinyal
#define buzzer 4 // pin buzzer untuk menghasilkan suara
#define ledmerah 13 // pin LED merah untuk kondisi bahaya
#define ledkuning 12 // pin LED kuning untuk kondisi siaga
#define ledhijau 11 // pin LED hijau untuk kondisi aman

LiquidCrystal_I2C lcd(0x27,20,4); // mengatur LCD I2C dengan alamat 0x27, dengan ukuran 20 kolom dan 4 baris

void setup() { //digunakan untuk melakukan konfigurasi pin, menginisialisasi library, 
              //dan melakukan pengaturan awal untuk memastikan bahwa board Arduino siap menjalankan program yang ditulis
  pinMode(ledmerah, OUTPUT); // mengatur pin LED merah sebagai output
  pinMode(ledkuning, OUTPUT); // mengatur pin LED kuning sebagai output
  pinMode(ledhijau, OUTPUT); // mengatur pin LED hijau sebagai output
  pinMode(TRIG_PIN, OUTPUT); // mengatur pin TRIG_PIN sebagai output
  pinMode(ECHO_PIN, INPUT); // mengatur pin ECHO_PIN sebagai input
  pinMode(buzzer, OUTPUT); // mengatur pin buzzer sebagai output
  Serial.begin(9600); // memulai komunikasi serial dengan baudrate 9600 antara pc dengan arduino 
                      //yang nantinya serial ini kita gunakan untuk membaca hasil pengukuran sensor ultrasonik
  lcd.init(); // menginisialisasi LCD
  lcd.backlight(); // menghidupkan backlight LCD
  digitalWrite(ledmerah, HIGH); // menghidupkan LED merah
  digitalWrite(ledkuning, HIGH); // menghidupkan LED kuning
  digitalWrite(ledhijau, HIGH); // menghidupkan LED hijau
  tone(4,300,500); // menghasilkan suara pada buzzer dengan frekuensi 300Hz dan durasi 500ms 0,5 detik
  lcd.setCursor(0,0); // mengatur posisi kursor di LCD di kolom 0 dan baris 0
  lcd.print("Detektor  Banjir"); // menampilkan teks "Detektor Banjir" di LCD
  lcd.setCursor(5,1); // mengatur posisi kursor di LCD di kolom 5 dan baris 1
  
  delay(3000); // delay selama 3 detik
  digitalWrite(ledmerah, LOW); // mematikan LED merah
  digitalWrite(ledkuning, LOW); // mematikan LED kuning
  digitalWrite(ledhijau, LOW); // mematikan LED hijau
  digitalWrite(buzzer, LOW); // mematikan Buzzer
  lcd.clear(); // membersihkan tampilan LCD
 }

 // Fungsi untuk mengukur kedalaman menggunakan sensor ultrasonik
float kedalaman(){
  digitalWrite(TRIG_PIN, LOW); // Mengirim sinyal LOW ke pin TRIG untuk memulai pengukuran
  delayMicroseconds(2); // Memberi jeda selama 2 mikrodetik
  digitalWrite(TRIG_PIN, HIGH); // Mengirim sinyal HIGH ke pin TRIG selama 10 mikrodetik
  delayMicroseconds(10); // Memberi jeda selama 10 mikrodetik
  digitalWrite(TRIG_PIN, LOW); // Mengirim sinyal LOW ke pin TRIG untuk menghentikan pengukuran
  int durasi = pulseIn(ECHO_PIN, HIGH); // Membaca durasi sinyal ultrasonik yang dipantulkan kembali
  return 400-durasi*0.034/2; // Menghitung kedalaman dan mengembalikan nilai dalam satuan cm
}
//faro
// Program akan terus berjalan dalam loop
void loop() { // bagian dari program Arduino yang dieksekusi secara terus-menerus setelah program dijalankan 
//pada fungsi void setup(). Setelah selesai dieksekusi, program akan kembali ke awal dan kembali mengeksekusi fungsi void loop() secara terus-menerus.
  // Status bahaya jika kedalaman melebihi 350 cm
  float kdlm = kedalaman(); // memanggil fungsi
  if(kdlm > 350) // Jika kondisi benar, maka lampu merah akan menyala
  {
    digitalWrite(ledmerah, HIGH); // Nyalakan lampu merah
    digitalWrite(ledkuning, LOW); // matikan lampu kuning 
    digitalWrite(ledhijau, LOW);  // matikan lampu hujau
    lcd.clear(); // Membersihkan layar LCD
    lcd.setCursor(0,0); // Menetapkan posisi kursor pada baris 0 kolom 0
    lcd.print("Kdlmn :"); // Menampilkan pesan "Kdlmn :"
    lcd.setCursor(7,0); // Menetapkan posisi kursor pada baris 0 kolom 7
    lcd.print(kdlm); // Menampilkan nilai kedalaman
    lcd.setCursor(14,0); // Menetapkan posisi kursor pada baris 0 kolom 14
    lcd.print("cm"); // Menampilkan satuan cm
    lcd.setCursor(0,1); // Menetapkan posisi kursor pada baris 1 kolom 0
    lcd.print("Satus :"); // Menampilkan pesan "Satus :"
    lcd.setCursor(9,1); // Menetapkan posisi kursor pada baris 1 kolom 9
    lcd.print("Bahaya"); // Menampilkan pesan "Bahaya"
    tone(4,1000,1000); // Memutar suara pada pin 4 dengan frekuensi 1000 Hz selama 1000 ms
    delay(1000); // Memberi jeda selama 1000ms atau 1 detik
    lcd.clear(); // Membersihkan layar LCD
    delay(100); // tunggu selama 100 ms
  }
 else{
   // Lampu Kuning (Siaga)
   if(kdlm >= 300 && kdlm < 350) // Jika jarak lebih dari sama dengan 250 cm dan kurang dari 350 cm
 {
    digitalWrite(ledmerah, LOW); // Matikan lampu merah
    digitalWrite(ledkuning, HIGH); // Nyalakan lampu kuning
    digitalWrite(ledhijau, LOW); // Matikan lampu hijau
    lcd.clear(); // Bersihkan tampilan LCD
    lcd.setCursor(0,0); // Set kursor LCD pada baris 0 kolom 0
    lcd.print("Kdlmn :"); // Tampilkan teks "Kdlmn :" pada LCD
    lcd.setCursor(7,0); // Set kursor pada kolom 7 baris 0
    lcd.print(kdlm); // Tampilkan nilai variabel kdlm pada LCD
    lcd.setCursor(14,0); // Set kursor pada kolom 14 baris 0
    lcd.print("cm"); // Tampilkan teks "cm" pada LCD
    lcd.setCursor(0,1); // Set kursor pada baris 1 kolom 0
    lcd.print("Satus :"); // Tampilkan teks "Satus :" pada LCD
    lcd.setCursor(9,1); // Set kursor pada kolom 9 baris 1
    lcd.print("Siaga"); // Tampilkan teks "Siaga" pada LCD
    tone(4,100,100); // Memutar suara pada pin 4 dengan frekuensi 100 Hz selama 100 ms
    delay(1000); // Memberi jeda selama 1000ms atau 1 detik
    lcd.clear(); // Bersihkan tampilan LCD
    delay(100); // Tunggu selama 100ms
 }
  else{
    // Lampu Hijau (Aman)
    digitalWrite(ledmerah, LOW); // Matikan lampu merah
    digitalWrite(ledkuning, LOW); // Matikan lampu kuning
    digitalWrite(ledhijau, HIGH); // Nyalakan lampu hijau
    lcd.clear(); // Bersihkan tampilan LCD
    lcd.setCursor(0,0); // Set kursor LCD pada baris 0 kolom 0
    lcd.print("Kdlmn :"); // Tampilkan teks "Kdlmn :" pada LCD
    lcd.setCursor(7,0); // Set kursor pada kolom 7 baris 0
    lcd.print(kdlm); // Tampilkan nilai variabel kdlm pada LCD
    lcd.setCursor(14,0); // Set kursor pada kolom 14 baris 0
    lcd.print("cm"); // Tampilkan teks "cm" pada LCD
    lcd.setCursor(0,1); // Set kursor pada baris 1 kolom 0
    lcd.print("Satus :"); // Tampilkan teks "Satus :" pada LCD
    lcd.setCursor(9,1); // Set kursor pada kolom 9 baris 1
    lcd.print("Aman"); // Tampilkan teks "Aman" pada LCD
    digitalWrite(buzzer, LOW); // Matikan buzzer
    delay(1000); // Tunggu selama 1000ms
    lcd.clear(); // Bersihkan tampilan LCD
    delay(100); // Tunggu selama 100ms
  }
   }
}