#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include <Servo.h>
#define ECHO_PIN 2
#define TRIG_PIN 3
#define buzzer 4
#define red 13
#define yellow 12
#define green 11
#define DHTPIN 7
#define DHTTYPE DHT22
#define SERVO_PIN 6
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4);
Servo myservo;
void setup() {
pinMode(red, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(green, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(buzzer, OUTPUT);
Serial.begin(9600);
lcd.init();
lcd.backlight();
myservo.attach(SERVO_PIN);
digitalWrite(red, HIGH);
digitalWrite(yellow, HIGH);
digitalWrite(green, HIGH);
tone(4, 300, 500);
lcd.setCursor(0, 0);
lcd.print("Flood Detector");
delay(3000);
digitalWrite(red, LOW);
digitalWrite(yellow, LOW);
digitalWrite(green, LOW);
digitalWrite(buzzer, LOW);
lcd.clear();
myservo.write(0);
}
float waterdepth() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
return 400 - duration * 0.034 / 2;
}
void readDHT22(float &temperature, float &humidity) {
temperature = dht.readTemperature();
humidity = dht.readHumidity();
}
void displayData(float depth, float temperature, float humidity, const char *status) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Depth :");
lcd.setCursor(7, 0);
lcd.print(depth);
lcd.setCursor(14, 0);
lcd.print("cm");
lcd.setCursor(0, 1);
lcd.print("Temp :");
lcd.setCursor(7, 1);
lcd.print(temperature);
lcd.setCursor(14, 1);
lcd.print("C");
lcd.setCursor(0, 2);
lcd.print("Humidity :");
lcd.setCursor(11, 2);
lcd.print(humidity);
lcd.setCursor(17, 2);
lcd.print("%");
lcd.setCursor(0, 3);
lcd.print("Status :");
lcd.setCursor(9, 3);
lcd.print(status);
}
void loop() {
float depth = waterdepth();
float temperature, humidity;
readDHT22(temperature, humidity);
Serial.begin(115200);
dht.begin();
if (depth > 370) {
digitalWrite(red, HIGH);
digitalWrite(yellow, LOW);
digitalWrite(green, LOW);
displayData(depth, temperature, humidity, "Danger");
tone(4, 800, 1000);
myservo.write(90);
delay(1000);
} else if (depth >= 320 && depth < 370) {
digitalWrite(red, LOW);
digitalWrite(yellow, HIGH);
digitalWrite(green, LOW);
displayData(depth, temperature, humidity, "Ready");
myservo.write(90);
delay(1000);
} else {
digitalWrite(red, LOW);
digitalWrite(yellow, LOW);
digitalWrite(green, HIGH);
displayData(depth, temperature, humidity, "Safe");
myservo.write(0);
delay(1000);
}
}