#define BLYNK_TEMPLATE_ID "TMPL6UugwFIUZ"
#define BLYNK_TEMPLATE_NAME "Flood Level Monitor"
#define BLYNK_AUTH_TOKEN "6Pd-BykyvudxFxeZgYKeEmRL5LfPkG1a"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address for 16x2 LCD
const int triggerPin = 14; // Ultrasonic sensor trigger pin
const int echoPin = 12; // Ultrasonic sensor echo pin
const int buzzerPin = 5; // Buzzer pin
const int greenLED = 15; // Green LED pin
const int yellowLED = 2; // Yellow LED pin
const int redLED = 4;
const int LED = 18;
const int floatSwitch = 13; // Red LED pin
const int maxDistance = 400;
BlynkTimer timer;
// Enter your Auth token
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Salman";
char pass[] = "1234salman";
long duration, distance;
void sendSensor() {
if(distance < 50){
Serial.print("Notification sent");
Blynk.logEvent("water_level", "Flood detected");
}
}
void setup() {
Serial.begin(1000);
Blynk.begin(auth, ssid, pass);
Wire.begin(21, 22);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("FLOOD MONITORING");
lcd.setCursor(2, 1);
lcd.print(" SYSTEM");
delay(1000);
lcd.clear();
pinMode(triggerPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(greenLED, OUTPUT);
pinMode(yellowLED, OUTPUT);
pinMode(redLED, OUTPUT);
pinMode(LED, OUTPUT);
timer.setInterval(2500L, sendSensor);
}
void ultrasonic() {
// Trigger the ultrasonic sensor
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
// Measure the time it takes for the pulse to return
duration = pulseIn(echoPin, HIGH);
// Calculate the distance in centimeters
distance = (duration / 2) / 29.1;
Serial.println(duration);
Serial.println(distance);
int blynkDistance = ((distance - maxDistance) * -1) / 3;
if (distance <= maxDistance) {
Blynk.virtualWrite(V0, blynkDistance);
} else {
Blynk.virtualWrite(V0, 0);
}
// Determine the water level description
String waterLevel = "Unknown";
if (distance < 100 && distance > 50) {
Serial.println("Alert");
waterLevel = "RED ALERT";
digitalWrite(greenLED, LOW);
digitalWrite(yellowLED, LOW);
digitalWrite(redLED, HIGH);
digitalWrite(buzzerPin, HIGH);
tone(buzzerPin, 1000);
delay(200);
digitalWrite(buzzerPin, LOW);
tone(buzzerPin, 500);
delay(200);
}
else if (distance < 50) {
waterLevel = "DANGER ";
Serial.println("Danger");
digitalWrite(greenLED, LOW);
digitalWrite(yellowLED, HIGH);
digitalWrite(redLED, LOW);
for (int i = 0; i < 3; i++) { // Play the following sequence 3 times
digitalWrite(buzzerPin, HIGH);
tone(buzzerPin, 200);
delay(200);
digitalWrite(buzzerPin, LOW);
tone(buzzerPin, 1000);
delay(200);
digitalWrite(buzzerPin, HIGH);
tone(buzzerPin, 200);
delay(200);
digitalWrite(buzzerPin, LOW);
tone(buzzerPin, 1000);
delay(200);
}
digitalWrite(buzzerPin, HIGH);
tone(buzzerPin, 200);
delay(1000);
digitalWrite(buzzerPin, LOW);
}
else if(distance > 100){
waterLevel = "NORMAL";
Serial.println("Normal");
digitalWrite(greenLED, HIGH);
digitalWrite(yellowLED, LOW);
digitalWrite(redLED, LOW);
digitalWrite(buzzerPin, LOW);
noTone(buzzerPin);
delay(1000);
}
// Display the water level and distance on the LCD with proper formatting
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ALERT: ");
lcd.print(waterLevel);
lcd.setCursor(2, 1);
lcd.print("LEVEL: ");
lcd.print(distance);
lcd.print(" cm");
}
void loop() {
ultrasonic();
Blynk.run(); // Run the Blynk library
timer.run(); // Run the timer
}