#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
Servo myServo;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C LCD
const int potPin = 14; // Pin untuk potensio
const int buzzerPin = 25; // Pin untuk buzzer
const int greenLedPin = 26; // Pin untuk LED hijau
const int redLedPin = 27; // Pin untuk LED merah
const int servoPin = 13; // Pin untuk servo
const int trigPin = 4; // Pin trig untuk HCSR04
const int echoPin = 5; // Pin echo untuk HCSR04
const float maxHeight = 30.0; // Tinggi maksimal air dalam cm (disesuaikan dengan tinggi wadah)
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
lcd.setCursor(2, 0); //Menggeser Letak Teks (x,y)
lcd.print("WATER LEVEL"); //Menampilkan Teks
lcd.setCursor(2, 1);
lcd.print("KELOMPOK 3");
delay(4000); //Jeda Waktu
lcd.clear(); //Membersihkan Tampilan Teks pada LCD
myServo.attach(servoPin);
myServo.write(0);
pinMode(potPin, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(greenLedPin, OUTPUT);
pinMode(redLedPin, OUTPUT);
pinMode(servoPin, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
float readDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
float duration = pulseIn(echoPin, HIGH);
float distance = duration * 0.034 / 2; // Menghitung jarak dalam cm
return distance;
}
void loop() {
float distance = readDistance();
float waterHeight = maxHeight - distance; // Ketinggian air dari dasar wadah
float waterLevel = (waterHeight / maxHeight) * 100; // Persentase level air
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Water Level: ");
lcd.print(waterLevel);
lcd.print("%");
// Menampilkan peringatan berdasarkan level air
if (waterLevel >= 100) {
lcd.setCursor(0, 1);
lcd.print("Evakuasi Darurat!");
} else if (waterLevel >= 75) {
lcd.setCursor(0, 1);
lcd.print("Siaga 3");
} else if (waterLevel >= 50) {
lcd.setCursor(0, 1);
lcd.print("Siaga 2");
} else if (waterLevel >= 25) {
lcd.setCursor(0, 1);
lcd.print("Siaga 1");
} else if (waterLevel >= 10) {
lcd.setCursor(0, 1);
lcd.print("potensi banjir!");
} else {
lcd.setCursor(0, 1);
lcd.print("Aman");
}
Serial.print("Water Level: ");
Serial.print(waterLevel);
Serial.println("%");
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
if (waterLevel < 75) {
digitalWrite(greenLedPin, HIGH);
digitalWrite(redLedPin, LOW);
noTone(buzzerPin);
delay(100);
myServo.attach(servoPin);
myServo.write(0);
} else {
digitalWrite(greenLedPin, LOW);
digitalWrite(redLedPin, HIGH);
tone(buzzerPin, 1000);
delay(100);
myServo.attach(servoPin);
myServo.write(180);
}
delay(250); // Delay untuk menghindari fluktuasi cepat pada pembacaan
}