#include <EEPROM.h>
#include <Servo.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
Servo myservo;
long duration, inches;
int set_val, percentage;
bool state, pump;
int buttonPin = 13;
void setup() {
lcd.begin(16, 2);
lcd.print("WATER LEVEL:");
lcd.setCursor(0, 1);
lcd.print("PUMP:OFF MANUAL");
pinMode(8, OUTPUT);
pinMode(9, INPUT);
pinMode(10, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(12, OUTPUT);
pinMode(buttonPin, INPUT);
myservo.attach(10);
}
void loop() {
digitalWrite(3, LOW);
delayMicroseconds(2);
digitalWrite(8, HIGH);
delayMicroseconds(10);
digitalWrite(8, LOW);
duration = pulseIn(9, HIGH);
inches = microsecondsToInches(duration);
percentage = (set_val - inches) * 100 / set_val;
set_val = EEPROM.read(0);
if (set_val > 150) set_val = 150;
lcd.setCursor(12, 0);
if (percentage < 0) percentage = 0;
lcd.print(percentage);
lcd.print("% ");
// Water level pumping
if (percentage < 30 && digitalRead(11)) {
pump = 1;
} else if (percentage > 99) {
pump = 0;
}
// Pump on/off
digitalWrite(12, !pump);
lcd.setCursor(5, 1);
lcd.print(pump ? "ON " : "OFF");
// Slide switch
lcd.setCursor(9, 1);
lcd.print(digitalRead(11) ? "AUTO " : "MANUAL");
// Manual mode control using the push button
if (!state && !digitalRead(11) && digitalRead(buttonPin)) {
state = 1;
set_val = inches;
EEPROM.write(0, set_val);
delay(10);
}
// Reset state when in AUTO mode
if (state && digitalRead(11)) {
state = 0;
}
// SERVO
myservo.write(pump ? 0 : 180);
delay(500);
}
long microsecondsToInches(long microseconds) {
return microseconds / 74 / 2;
}