#include <LiquidCrystal_I2C.h>
#include <Wire.h>
// Pin untuk sensor ultrasonik
#define trigPin 22
#define echoPin 23
// Pin untuk LED
#define redLedPin 26
#define yellowLedPin 27
#define greenLedPin 14 // GPIO14 untuk LED Hijau
// Pin untuk buzzer
#define buzzerPin 12 // GPIO12 untuk buzzer
// Variabel untuk mengukur jarak dan tinggi air
long duration;
int distance;
int waterLevelDanger = 200; // Tinggi air dalam cm untuk level bahaya
int waterLevelMedium = 100; // Tinggi air dalam cm untuk level sedang
// Inisialisasi LCD I2C dengan 16 kolom dan 2 baris
LiquidCrystal_I2C lcd(0x27, 20, 4);
bool dangerMelodyPlayed = false;
bool warningMelodyPlayed = false;
void setup() {
Wire.begin(); // Inisialisasi I2C
lcd.init(); // Inisialisasi LCD
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Monitoring Banjir");
pinMode(trigPin, OUTPUT); // Pin trigPin sebagai output
pinMode(echoPin, INPUT); // Pin echoPin sebagai input
pinMode(redLedPin, OUTPUT); // Pin redLedPin sebagai output
pinMode(yellowLedPin, OUTPUT); // Pin yellowLedPin sebagai output
pinMode(greenLedPin, OUTPUT); // Pin greenLedPin sebagai output
pinMode(buzzerPin, OUTPUT); // Pin buzzerPin sebagai output
Serial.begin(9600); // Inisialisasi komunikasi serial
}
void loop() {
// Mengirim sinyal ultrasonik
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Menerima echo dan menghitung jarak
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
// Menampilkan jarak di LCD
lcd.setCursor(0, 2);
lcd.print("Tinggi Air: ");
lcd.print(distance);
lcd.print(" cm ");
// Memeriksa level air dan mengontrol LED serta buzzer berdasarkan tinggi air
if (distance >= waterLevelDanger) {
digitalWrite(redLedPin, HIGH);
digitalWrite(yellowLedPin, LOW);
digitalWrite(greenLedPin, LOW);
lcd.setCursor(0, 1);
lcd.print("Peringatan Banjir!");
if (!dangerMelodyPlayed) {
playDangerMelody();
dangerMelodyPlayed = true;
warningMelodyPlayed = false; // Reset warning melody flag
}
}
else if (distance >= waterLevelMedium) {
digitalWrite(redLedPin, LOW);
digitalWrite(yellowLedPin, HIGH);
digitalWrite(greenLedPin, LOW);
lcd.setCursor(0, 1);
lcd.print("Tinggi Air Sedang");
if (!warningMelodyPlayed) {
playWarningMelody();
warningMelodyPlayed = true;
dangerMelodyPlayed = false; // Reset danger melody flag
}
}
else {
digitalWrite(redLedPin, LOW);
digitalWrite(yellowLedPin, LOW);
digitalWrite(greenLedPin, HIGH);
lcd.setCursor(0, 1);
lcd.print("Tinggi Air Normal");
// Matikan buzzer jika tidak ada peringatan
noTone(buzzerPin);
dangerMelodyPlayed = false; // Reset danger melody flag
warningMelodyPlayed = false; // Reset warning melody flag
}
delay(1000); // Tunggu 1 detik sebelum membaca sensor lagi
}
// Melodi peringatan bahaya
void playDangerMelody() {
tone(buzzerPin, 2000, 300); // Nada pertama
delay(500);
tone(buzzerPin, 2000, 300); // Nada kedua
delay(500);
tone(buzzerPin, 2000, 300); // Nada ketiga
delay(500);
tone(buzzerPin, 2000, 300); // Nada keempat
delay(500);
tone(buzzerPin, 2000, 300); // Nada kelima
delay(500);
noTone(buzzerPin); // Matikan buzzer
}
// Melodi peringatan waspada
void playWarningMelody() {
tone(buzzerPin, 1100, 100); // Nada pertama
delay(500);
tone(buzzerPin, 1100, 100); // Nada kedua
delay(500);
tone(buzzerPin, 1100, 100); // Nada ketiga
delay(500);
tone(buzzerPin, 1100, 100); // Nada keempat
delay(500);
tone(buzzerPin, 1100, 100); // Nada kelima
delay(500);
noTone(buzzerPin); // Matikan buzzer
}