#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address for 16x2 LCD
const int triggerPin = 7; // Ultrasonic sensor trigger pin
const int echoPin = 6; // Ultrasonic sensor echo pin
const int buzzerPin = 12; // Buzzer pin
const int relayPin = 8; // Relay pin
const int greenLED = 4; // Green LED pin
const int yellowLED = 5; // Yellow LED pin
const int redLED = 2; // Red LED pin
const int maxDistance = 400; // Maximum range of the ultrasonic sensor in cm
const int numParts = 3; // Number of parts to divide the range into
const int partDistance = maxDistance / numParts; // Distance for each part
void setup() {
pinMode(triggerPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(relayPin, OUTPUT);
pinMode(greenLED, OUTPUT);
pinMode(yellowLED, OUTPUT);
pinMode(redLED, OUTPUT);
lcd.init();
lcd.backlight();
}
void loop() {
long duration, distance;
// 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;
// Determine the water level description
String waterLevel = "Unknown";
if (distance < partDistance) {
waterLevel = "Empty";
digitalWrite(greenLED, LOW);
digitalWrite(yellowLED, LOW);
digitalWrite(redLED, HIGH);
digitalWrite(buzzerPin, HIGH);
digitalWrite(relayPin, HIGH); // Turn on the relay (e.g., to pump water)
} else if (distance < partDistance * 2) {
waterLevel = "Half";
digitalWrite(greenLED, LOW);
digitalWrite(yellowLED, HIGH);
digitalWrite(redLED, LOW);
digitalWrite(buzzerPin, LOW);
digitalWrite(relayPin, LOW); // Turn off the relay
} else {
waterLevel = "Full";
digitalWrite(greenLED, HIGH);
digitalWrite(yellowLED, LOW);
digitalWrite(redLED, LOW);
digitalWrite(buzzerPin, LOW);
digitalWrite(relayPin, LOW); // Turn off the relay
}
// Display the water level and distance on the LCD with proper formatting
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Water Level: ");
lcd.print(waterLevel);
lcd.setCursor(0, 1);
lcd.print("Distance: ");
lcd.print(distance);
lcd.print(" cm");
delay(1000); // Delay for one second between readings
}