#include <WiFi.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
// Pin definitions
// DHT22 temperature/humidity sensor
#define DHTPIN 15 // Data pin -> GPIO15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Ultrasonic (HC-SR04) sensor pins
const int trigPin = 26;
const int echoPin = 25;
// LEDs and buzzer for alerts
const int greenPin = 14;
const int orangePin = 27;
const int redPin = 12;
const int buzzPin = 13;
// I2C LCD (address 0x27, 16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// 🌧️ Rain sensor (Potentiometer simulation)
const int rainPin = 34; // Analog pin
int rainValue = 0;
// Global state
float temperature;
float humidity;
long duration;
long distance;
void setup() {
Serial.begin(115200);
// Initialize pins
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(greenPin, OUTPUT);
pinMode(orangePin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(buzzPin, OUTPUT);
// Rain pin
pinMode(rainPin, INPUT);
// Initialize sensors and LCD
dht.begin();
lcd.init();
lcd.backlight();
// Show a startup message
lcd.setCursor(0, 0);
lcd.print("Flood Detection");
lcd.setCursor(0, 1);
lcd.print("System... Online");
delay(2000);
}
void loop() {
// Read sensors, update display, and handle alerts
readSensors();
updateLCD();
triggerAlerts();
}
void readSensors() {
// Read temperature and humidity from DHT22
humidity = dht.readHumidity();
temperature = dht.readTemperature();
// Abort if sensor read failed
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read DHT sensor");
return;
}
// Read Ultrasonic Sensor
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2; // Calculate distance in cm
// 🌧️ Read Rain Sensor (Potentiometer)
rainValue = analogRead(rainPin);
Serial.print("Rain Value: ");
Serial.println(rainValue);
}
void updateLCD() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temperature);
lcd.print(" H:");
lcd.print(humidity);
lcd.setCursor(0, 1);
lcd.print("W:");
lcd.print(distance);
lcd.print(" R:");
lcd.print(rainValue);
}
void triggerAlerts() {
// Shorter distance means more water (higher risk)
if (distance <= 5) {
// RED: dangerous
lcd.setCursor(14, 0);
lcd.print("!!");
digitalWrite(redPin, HIGH);
digitalWrite(orangePin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(buzzPin, HIGH); // steady tone
} else if (distance <= 20) {
// ORANGE: warning
digitalWrite(redPin, LOW);
digitalWrite(orangePin, HIGH);
digitalWrite(greenPin, LOW);
// short beep
digitalWrite(buzzPin, HIGH);
delay(100);
digitalWrite(buzzPin, LOW);
} else {
// GREEN: safe
digitalWrite(redPin, LOW);
digitalWrite(orangePin, LOW);
digitalWrite(greenPin, HIGH);
digitalWrite(buzzPin, LOW);
}
}