#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Define pins for LEDs
const int ledPin1 = 2;
const int ledPin2 = 4;
const int ledPin3 = 5;
const int ledPin4 = 18;
// Define pins for ultrasonic sensor
const int trigPin = 15; // Trigger pin
const int echoPin = 19; // Echo pin
// Define LCD properties
const int lcdColumns = 16;
const int lcdRows = 2;
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows); // I2C address 0x27
void setup() {
// Initialize serial communication
Serial.begin(9600);
// Initialize LED pins as outputs
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
// Initialize ultrasonic sensor pins
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Initialize LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Water Level:");
}
void loop() {
// Trigger ultrasonic sensor
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Measure echo time
long duration = pulseIn(echoPin, HIGH);
// Calculate distance
float distance = duration * 0.5 * 0.0343; // Distance in cm
// Map distance to LED levels
int level;
if (distance < 50) {
level = 0;
} else if (distance < 100) {
level = 1;
} else if (distance < 200) {
level = 2;
} else if (distance < 300) {
level = 3;
} else {
level = 4;
}
// Update LED indicators
switch (level) {
case 0:
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin4, HIGH);
// Clear the LCD screen and display "TURN OFF PUMP"
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("TURN OFF PUMP");
break;
case 1:
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin4, HIGH);
break;
case 2:
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin4, HIGH);
break;
case 3:
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, HIGH);
break;
case 4:
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
break;
}
// Update LCD display
if (level != 0) {
lcd.setCursor(0, 1);
lcd.print("Level: ");
lcd.print(level);
}
// Print distance and level to Serial Monitor
Serial.print("Distance: ");
Serial.print(distance);
Serial.print(" cm, Level: ");
Serial.println(level);
delay(1000); // Adjust delay as needed
}