//water level controller v1.1
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
long duration, inches;
int set_val,percentage;
bool state,pump;
int pump2State=LOW;
int lastButtonState;
int currentButtonState;
int tankFull=0;
int alreadyBlinked = 0;
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("WATER LEVEL");
lcd.setCursor(4, 1);
lcd.print("CONTROLLER");
delay(1000);
lcd.clear();
lcd.print("WATER LEVEL:");
lcd.setCursor(0, 1);
lcd.print("PUMP : MANUAL");
pinMode(8, OUTPUT);//trigger
pinMode(9, INPUT);//echo
pinMode(10, INPUT_PULLUP);//push switch
pinMode(11, INPUT_PULLUP);//manual switch
pinMode(12, OUTPUT);//relay
pinMode(7, OUTPUT);//tank full
pinMode(6, INPUT_PULLUP);
pinMode(5, OUTPUT);//pump2
pinMode(4, INPUT_PULLUP);//lowe tank low level
pinMode(3, INPUT_PULLUP);//lower tank highlevel);
pinMode(2, OUTPUT); //relay for staterter
pinMode(13,OUTPUT);
currentButtonState= digitalRead(6);
Serial.begin(9600);
set_val=EEPROM.read(0);
if(set_val>150)set_val=150;
}
void loop() {
digitalWrite(8, HIGH);
delayMicroseconds(10);
digitalWrite(8, LOW);
noTone(13);
duration = pulseIn(9, HIGH);
inches = microsecondsToInches(duration);
percentage=(set_val-inches)*100/set_val;
lcd.setCursor(12, 0);
if(percentage<0)percentage=0;
lcd.print(percentage);
lcd.print("% ");
if(percentage<30&digitalRead(11))pump=1;
if(percentage>95)pump=0,pump2State=0;
digitalWrite(12,pump);
digitalWrite(5,pump2State); // for inverted relay output replace pump into !pump
lcd.setCursor(6, 1);
if(pump==1)lcd.print("ON ");
else if(pump==0 & pump2State==LOW) lcd.print("OFF");
lcd.setCursor(10, 1);
if(!digitalRead(11))lcd.print("MANUAL");
else lcd.print("AUTO ");
if(percentage>80) {digitalWrite(7, HIGH);
tankFull=1;}
else {digitalWrite(7, LOW);
tankFull=0;}
lastButtonState = currentButtonState; // save the last state
currentButtonState = digitalRead(6); // read new state
if(lastButtonState == HIGH && currentButtonState == LOW && !digitalRead(11)){
// toggle state of pump
pump2State = !pump2State;
// control pump2 arccoding to the toggled state
digitalWrite(5, pump2State);
}
if(pump&alreadyBlinked == 0)
{
digitalWrite(2, HIGH); // set the satrter relay on
// play a note on pin 6 for 200 ms:
tone(13, 440, 200);
delay(1000); // wait for a second
digitalWrite(2, LOW); // set the relay off
// turn off tone function for pin 6:
noTone(13);
alreadyBlinked = 1;
}
if(!pump&alreadyBlinked == 1) alreadyBlinked = 0;
if(pump2State==HIGH)
{lcd.setCursor(0, 1);
lcd.print("PUMP2:ON ");
}
else
{lcd.setCursor(0, 1);
lcd.print("PUMP ");}
if(!digitalRead(10)&!state&digitalRead(11)&!digitalRead(6)){
state=1;
set_val=inches;
EEPROM.write(0, set_val);
}
if(!digitalRead(10)&!state&!digitalRead(11)){
state=1;
pump=!pump;
}
if(!digitalRead(4)&!tankFull&!digitalRead(3)& !pump2State&digitalRead(11)){
pump2State=!pump2State;
digitalWrite(5,pump2State);
}
if(digitalRead(4)&digitalRead(3)&pump2State&digitalRead(11)) pump2State=0;
digitalWrite(5,pump2State);
if(digitalRead(10))state=0;
delay(500);
}
long microsecondsToInches(long microseconds) {
return microseconds / 74 / 2;
}