// data lcd
#include <LiquidCrystal_I2C.h>
// LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Identifikasi pin
#define TRIG_PIN 17
#define ECHO_PIN 16
#define LED_HIJAU 26
#define LED_KUNING 25
#define LED_MERAH 33
#define BUZZER 23
long duration;
float distance;
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_HIJAU, OUTPUT);
pinMode(LED_KUNING, OUTPUT);
pinMode(LED_MERAH, OUTPUT);
pinMode(BUZZER, OUTPUT);
// LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("DETEKSI BANJIR");
lcd.setCursor(0, 1);
lcd.print("Memulai...");
delay(2000);
lcd.clear();
}
void loop() {
// Pemicu sensor ultrasonic
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Membaca pantulan
duration = pulseIn(ECHO_PIN, HIGH, 30000);
// Menghitung jarak
if (duration == 0) {
distance = 0;
} else {
distance = duration * 0.034 / 2;
}
// Serial Monitor
Serial.print("Jarak Air: ");
Serial.print(distance);
Serial.println(" cm");
// Reset LED
digitalWrite(LED_HIJAU, LOW);
digitalWrite(LED_KUNING, LOW);
digitalWrite(LED_MERAH, LOW);
// LCD jarak
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Jarak: ");
lcd.print(distance, 1);
lcd.print(" cm");
// Logika banjir
if (distance > 151) {
// AMAN
digitalWrite(LED_HIJAU, HIGH);
noTone(BUZZER);
Serial.println("STATUS: AMAN");
lcd.setCursor(0, 1);
lcd.print("STATUS: AMAN");
}
else if (distance > 71 && distance <= 151) {
// WASPADA
digitalWrite(LED_KUNING, HIGH);
tone(BUZZER, 500);
Serial.println("STATUS: WASPADA");
lcd.setCursor(0, 1);
lcd.print("STATUS: WASPADA");
}
else {
// BAHAYA
digitalWrite(LED_MERAH, HIGH);
tone(BUZZER, 2000);
Serial.println("STATUS: BAHAYA!");
lcd.setCursor(0, 1);
lcd.print("STATUS: BANJIR!");
}
delay(1500);
}