#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definisi pin
#define TRIGGER_PIN 2 // Pin trigger sensor ultrasonik
#define ECHO_PIN 3 // Pin echo sensor ultrasonik
#define GREEN_LED 4 // LED hijau
#define YELLOW_LED 5 // LED kuning
#define RED_LED 6 // LED merah
#define BUZZER 7 // Buzzer
#define START_BUTTON 8 // Tombol start
// Inisialisasi LCD (sesuaikan alamat I2C jika berbeda)
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Variabel global
float waterLevel = 0.0;
bool isRunning = false;
unsigned long previousMillis = 0; // Untuk mengatur interval buzzer
bool buzzerState = false; // Status buzzer
void setup() {
// Inisialisasi pin
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(START_BUTTON, INPUT_PULLUP);
// Inisialisasi I2C dengan pin spesifik
Wire.setSDA(16); // SDA di GPIO 16
Wire.setSCL(17); // SCL di GPIO 17
// Inisialisasi LCD
lcd.init();
lcd.backlight();
// Inisialisasi Serial untuk debug
Serial.begin(9600);
// Tampilan awal
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Detektor Banjir");
lcd.setCursor(0, 1);
lcd.print("Tekan Tombol Mulai");
// Matikan semua LED dan buzzer
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, LOW);
digitalWrite(BUZZER, LOW);
}
void loop() {
// Cek tombol start
if (digitalRead(START_BUTTON) == LOW) {
delay(50); // Debounce
isRunning = !isRunning;
// Reset semua indikator
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, LOW);
digitalWrite(BUZZER, LOW);
noTone(BUZZER);
// Tampilan saat dimulai
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sistem Aktif");
lcd.setCursor(0, 1);
lcd.print("Mengukur Banjir...");
delay(1000);
}
if (isRunning) {
// Ukur ketinggian air
waterLevel = measureWaterLevel();
// Debugging: tampilkan nilai waterLevel
Serial.print("Water Level: ");
Serial.println(waterLevel);
// Update LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Level Air: ");
lcd.print(waterLevel);
lcd.print(" m");
// Logika indikator banjir
if (waterLevel >= 0 && waterLevel < 1) {
digitalWrite(GREEN_LED, HIGH);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, LOW);
digitalWrite(BUZZER, LOW);
noTone(BUZZER);
lcd.setCursor(0, 1);
lcd.print("Status: Aman");
}
else if (waterLevel >= 1 && waterLevel < 2) {
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, HIGH);
digitalWrite(RED_LED, LOW);
digitalWrite(BUZZER, LOW);
noTone(BUZZER);
lcd.setCursor(0, 1);
lcd.print("Status: Waspada");
}
else { // Jika waterLevel >= 2 (Bahaya)
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, HIGH);
lcd.setCursor(0, 1);
lcd.print("Status: Bahaya");
// Aktifkan buzzer dengan pola tut-tut
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= 500) { // Interval 500 ms
previousMillis = currentMillis;
buzzerState = !buzzerState;
if (buzzerState) {
tone(BUZZER, 1000); // Frekuensi 1000 Hz
} else {
noTone(BUZZER);
}
}
Serial.println("BAHAYA - Buzzer ON");
}
delay(1000); // Tunda 1 detik antara pembacaan
}
}
float measureWaterLevel() {
// Fungsi untuk mengukur ketinggian air menggunakan sensor ultrasonik
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
// Baca durasi pantulan
long duration = pulseIn(ECHO_PIN, HIGH);
// Debugging: tampilkan durasi
Serial.print("Duration: ");
Serial.println(duration);
// Hitung jarak (dalam meter)
float distance = (duration * 0.034 / 2) / 100; // Konversi ke meter
// Jika durasi terlalu besar atau kecil, anggap level 0 (menangani error)
if (duration <= 0 || duration > 30000) {
distance = 0;
}
// Pastikan hasil dalam rentang 0 hingga 3.7 meter
if (distance < 0) {
distance = 0;
} else if (distance > 3.7) {
distance = 3.7;
}
return distance;
}