#include <LiquidCrystal_I2C.h>
const int trigger = 32;
const int echo = 33;
const int pump = 22;
const int buzzer = 25;
long duration;
float distance;
int waterlevel;
int pumpstate = LOW;
bool buzzFlag = false;
float levellow = 8.5; // cm
float levelhigh = 2.5; // cm
LiquidCrystal_I2C lcd(0x27, 16, 2);
void pumpAutomate() {
digitalWrite(trigger, LOW);
delayMicroseconds(2);
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, HIGH);
duration = pulseIn(echo, HIGH);
distance = (duration / 2.0) / 29.1; // Calculate distance in cm
// Map the distance to a percentage (inverse mapping)
waterlevel = map(distance * 100, levelhigh * 100, levellow * 100, 100, 0);
waterlevel = constrain(waterlevel, 0, 100);
if (waterlevel <= 10) {
pumpstate = HIGH;
if (!buzzFlag) {
digitalWrite(buzzer, HIGH);
delay(1000);
digitalWrite(buzzer, LOW);
buzzFlag = true;
}
} else if (waterlevel >= 90) {
pumpstate = LOW;
} else {
buzzFlag = false;
}
digitalWrite(pump, pumpstate);
lcd.setCursor(0, 0);
lcd.print("WATER LEVEL=");
lcd.print(waterlevel);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("WATER PUMP=");
lcd.print(pumpstate ? "HIGH" : "LOW ");
}
void setup() {
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
pinMode(pump, OUTPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Initialization...");
}
void loop() {
pumpAutomate();
}