#include <EEPROM.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
const int triggerPin = 8;
const int echoPin = 9;
const int manualSwitchPin = 10;
const int autoSwitchPin = 11;
const int pumpPin = 12;
long duration, inches;
int set_val, percentage;
bool pumpState, manualMode;
void setup() {
lcd.begin(16, 2);
lcd.print("WATER LEVEL:");
lcd.setCursor(0, 1);
lcd.print("PUMP:OFF MANUAL");
pinMode(triggerPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(manualSwitchPin, INPUT_PULLUP);
pinMode(autoSwitchPin, INPUT_PULLUP);
pinMode(pumpPin, OUTPUT);
set_val = min(EEPROM.read(0), 150);
}
void loop() {
measureWaterLevel();
updateDisplay();
checkPumpState();
handleSwitches();
delay(500);
}
void measureWaterLevel() {
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
duration = pulseIn(echoPin, HIGH);
inches = microsecondsToInches(duration);
percentage = map(constrain(set_val - inches, 0, set_val), 0, set_val, 0, 100);
}
void updateDisplay() {
lcd.setCursor(12, 0);
lcd.print(percentage);
lcd.print("% ");
lcd.setCursor(5, 1);
lcd.print(pumpState ? "ON " : "OFF");
lcd.setCursor(9, 1);
lcd.print(manualMode ? "MANUAL" : "AUTO ");
}
void checkPumpState() {
pumpState = (percentage < 30 && digitalRead(autoSwitchPin));
digitalWrite(pumpPin, !pumpState);
}
void handleSwitches() {
if (!digitalRead(manualSwitchPin) && !manualMode) {
manualMode = true;
set_val = inches;
EEPROM.write(0, set_val);
}
if (!digitalRead(manualSwitchPin) && !digitalRead(autoSwitchPin) && !manualMode) {
manualMode = true;
pumpState = !pumpState;
}
if (digitalRead(manualSwitchPin))
manualMode = false;
}
long microsecondsToInches(long microseconds) {
return microseconds / 74 / 2;
}