#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Define pins for Ultrasonic Sensor
#define TRIG_PIN 9
#define ECHO_PIN 10
// Define water level thresholds
#define SHALLOW_LEVEL 100 // 1 meter in centimeters
#define ADEQUATE_LEVEL 200 // 2 meters in centimeters
#define CAUTION_LEVEL 300 // 3 meters in centimeters
// LED pin
#define LED_SHALLOW 2
#define LED_ADEQUATE 3
#define LED_CAUTION 4
#define LED_DANGER 5
// Buzzer pin
#define BUZZER_PIN 6
// Initialize LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Change the address (0x27) based on your LCD address
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.clear();
pinMode(LED_SHALLOW, OUTPUT);
pinMode(LED_ADEQUATE, OUTPUT);
pinMode(LED_CAUTION, OUTPUT);
pinMode(LED_DANGER, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
delay(1000); // Delay 1 second
// Send a ping to the ultrasonic sensor to get the distance
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
unsigned int distance = pulseIn(ECHO_PIN, HIGH) / 58;
// Check the water level and display the appropriate status on the LCD
if (distance >= 400) {
lcd.setCursor(0, 0);
lcd.print("Air Bahaya");
digitalWrite(LED_DANGER, HIGH);
tone(BUZZER_PIN, 2000);
} else if (distance >= 300) {
lcd.setCursor(0, 0);
lcd.print("Air Waspada");
digitalWrite(LED_CAUTION, HIGH);
noTone(BUZZER_PIN);
} else if (distance >= 200) {
lcd.setCursor(0, 0);
lcd.print("Air Cukup");
digitalWrite(LED_ADEQUATE, HIGH);
noTone(BUZZER_PIN);
} else if (distance >= 100) {
lcd.setCursor(0, 0);
lcd.print("Air Dangkal");
digitalWrite(LED_SHALLOW, HIGH);
noTone(BUZZER_PIN);
}
// Turn off all LEDs
digitalWrite(LED_SHALLOW, LOW);
digitalWrite(LED_ADEQUATE, LOW);
digitalWrite(LED_CAUTION, LOW);
digitalWrite(LED_DANGER, LOW);
}