#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define ECHO_PIN 4 // Echo pin of ultrasonic sensor
#define TRIG_PIN 5 // Trigger pin of ultrasonic sensor
#define ON_BUTTON_PIN 12 // Pin connected to the "Turn On" push button
#define OFF_BUTTON_PIN 14 // Pin connected to the "Turn Off" push button
#define RELAY_PIN 13 // Pin connected to the relay module
#define LED1_PIN 16 // Pin connected to LED1
#define LED2_PIN 17 // Pin connected to LED2
#define LED3_PIN 18 // Pin connected to LED3
#define LED4_PIN 19 // Pin connected to LED4
const int MIN_DISTANCE = 5; // Minimum distance in cm
const int MAX_DISTANCE = 180; // Maximum distance in cm
bool relayState = LOW; // Initial state of the relay
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 columns, 2 rows
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(115200);
lcd.begin(16, 2);
pinMode(ECHO_PIN, INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ON_BUTTON_PIN, INPUT_PULLUP);
pinMode(OFF_BUTTON_PIN, INPUT_PULLUP);
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(LED3_PIN, OUTPUT);
pinMode(LED4_PIN, OUTPUT);
digitalWrite(RELAY_PIN, relayState);
}
void loop() {
long duration, distance;
// Trigger ultrasonic sensor
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Measure the duration of the pulse from the echo pin
duration = pulseIn(ECHO_PIN, HIGH);
// Calculate distance in cm
distance = constrain(duration * 0.034 / 2, MIN_DISTANCE, MAX_DISTANCE);
// Scale the distance to a percentage (0-100)
int percentage = map(distance, MAX_DISTANCE, MIN_DISTANCE, 0, 100);
Serial.print("Distance: ");
Serial.print(distance);
Serial.print(" cm, Percentage: ");
Serial.print(percentage);
Serial.println("%");
// Check if the "Turn On" button is pressed and the distance is greater than 5 cm
if (digitalRead(ON_BUTTON_PIN) == LOW && distance > 5) {
relayState = HIGH; // Water level is sufficient, turn on the relay
}
// Check if the "Turn Off" button is pressed or the distance is less than or equal to 5 cm
if (digitalRead(OFF_BUTTON_PIN) == LOW || distance <= 5) {
relayState = LOW; // Water level is low, turn off the relay
}
// Update relay state
digitalWrite(RELAY_PIN, relayState);
// Update LED indicators based on water level percentage
updateLEDIndicators(percentage);
// Display on LCD
//lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Water Level: ");
lcd.print(percentage);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("Relay: ");
lcd.print(relayState == HIGH ? "ON" : "OFF");
delay(1000); // Adjust the delay based on your needs
}
void updateLEDIndicators(int percentage) {
if (percentage >= 25 && percentage < 25) {
digitalWrite(LED1_PIN, HIGH);
digitalWrite(LED2_PIN, LOW);
digitalWrite(LED3_PIN, LOW);
digitalWrite(LED4_PIN, LOW);
} else if (percentage >= 25 && percentage < 50) {
digitalWrite(LED1_PIN, HIGH);
digitalWrite(LED2_PIN, HIGH);
digitalWrite(LED3_PIN, LOW);
digitalWrite(LED4_PIN, LOW);
} else if (percentage >= 50 && percentage < 75) {
digitalWrite(LED1_PIN, HIGH);
digitalWrite(LED2_PIN, HIGH);
digitalWrite(LED3_PIN, HIGH);
digitalWrite(LED4_PIN, LOW);
} else {
digitalWrite(LED1_PIN, HIGH);
digitalWrite(LED2_PIN, HIGH);
digitalWrite(LED3_PIN, HIGH);
digitalWrite(LED4_PIN, HIGH);
}
}