#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int ledPin = 9;
char c;
long duration, inches;
int set_val, percentage;
bool state, pump;
void setup() {
lcd.begin();
lcd.backlight();
lcd.print("WATER LEVEL:");
lcd.setCursor(0, 1);
lcd.print("PUMP: OFF MANUAL");
pinMode(2, OUTPUT);
pinMode(3, INPUT);
pinMode(10, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(13, OUTPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
set_val = EEPROM.read(0);
if (set_val > 20) {
set_val = 20;
}
}
void loop() {
digitalWrite(2, HIGH);
delayMicroseconds(10);
digitalWrite(2, LOW);
duration = pulseIn(3, HIGH);
inches = microsecondsToInches(duration);
percentage = (set_val - inches) * 110 / set_val;
lcd.setCursor(12, 0);
if (percentage < 0) {
percentage = 0;
}
lcd.print(percentage);
lcd.print("% ");
if (percentage < 30 && digitalRead(11)) {
pump = true;
}
if (percentage > 85) {
pump = false;
}
digitalWrite(13, !pump);
lcd.setCursor(5, 1);
c = Serial.read();
if (c == '1') {
digitalWrite(ledPin, HIGH);
}
else if (c == '0') {
digitalWrite(ledPin, LOW);
}
if (pump) {
lcd.print("ON ");
}
else if (!pump) {
lcd.print("OFF");
}
lcd.setCursor(9, 1);
if (!digitalRead(11)) {
lcd.print("MANUAL ");
}
lcd.print("AUTO ");
if (!digitalRead(10) && !state && digitalRead(11)) {
state = true;
set_val = inches;
EEPROM.write(0, set_val);
}
if (!digitalRead(10) && !state && !digitalRead(11)) {
state = true;
pump = !pump;
}
if (digitalRead(10)) {
state = false;
}
delay(500);
}
long microsecondsToInches(long microseconds) {
return microseconds / 29 / 2;
}