//water level controller v3
// future update plan: /over /under current protection/ dry run protection/ oled diplay/ voice message /IOT enable
//current features
//over voltage protection
//undervoltage protection
//main voltage indicator
//volume control used for ac reference only actual circuitis volt from unregulated 5v
//buzzer enabled
//manual and audo mode
//showing water level in %
//Auto set tank capacity
//main tank as fill mode- ie- when the tank level goes below 30% main pump start and when it reach 95 % stop
// at 80 % tank level green LED is on showing the tank has enough water
// manual ON /OFF push toggle button for main pump
//seperate relay for main pump starter capacitor on for 3 second and off
//the sub tank is used to collect municipal water. when the sub tank fill the sum motor start to uplift water from sub tank to main tank.
//when the main tank full theall pumps stop
// when the the main tank level over 80 % sub pump not work
//seperate buzzer tone indicate on of motors
// when the sub tank empty sub motor stops
//Ultrasonic sensor is used to sense continous water level in main tank
//float sensor or wire sensor used in sub tank (blue switch as hi sensor and yellow switch as low level sensor
//sub pump set as empty mode and main pump is set as fill mode
//at auto mode press both push button will set new tank capacity for ultrasonic sensor
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define trigger 8 //ultrasonic trigger
#define echo 9 //ultrasonic echo
#define p1sw 10 //pump1 push switch
#define p2sw 6 //pump2 push switch
#define manual 11// auto manual switch
#define p1out 12 //pump1 output relay
#define tfull 7 // tank full indicator
#define p2out 5 //pump2 out
#define ltl 4 //Low tank low sensor
#define lth 3 // low tank Hi sensor
#define starter 2 //starter relay
#define buzzer 13 //buzzer
#define mainAC A0 // Main AC Volt input converted 230V AC
//variable
long duration, inches;
int set_val,percentage;
bool state,pump;
bool state2,pump2;
int tankFull=0;
int alreadyBlinked = 0;
int alreadyoff=0;
int alreadybuzzed = 0;
int alreadyoff2 = 0;
int m;// initialise variable m
int n;//initialise variable n
int overV = 260;
int underV =180;
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(trigger, OUTPUT);
pinMode(echo, INPUT);//
pinMode(p1sw, INPUT_PULLUP);
pinMode(p2sw, INPUT_PULLUP);
pinMode(manual, INPUT_PULLUP);
pinMode(p1out, OUTPUT);
pinMode(tfull, OUTPUT);
pinMode(p2out, OUTPUT);
pinMode(ltl, INPUT_PULLUP);//lowe tank low level
pinMode(lth, INPUT_PULLUP);//lower tank highlevel);
pinMode(starter, OUTPUT); //relay for starter
pinMode(buzzer,OUTPUT);
pinMode(mainAC, INPUT);
set_val=EEPROM.read(0);
if(set_val>150)set_val=150;
}
void loop() {
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
duration = pulseIn(echo, 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("% ");
//main voltage check
m=analogRead(A0);// read analog values from pin A0 across capacitor
n=(m* .304177);// converts analog value(x) into input ac supply value using this formula (n=(311/1023)*m ) were 311is the maximum voltage .1023 is the analoge to digital valuw for 5 volt
lcd.setCursor(0,0);
lcd.print("V:");
lcd.print(n);
if(percentage<30 & digitalRead(manual)& n<overV & n>underV)pump=1;
if(percentage>95|| n>overV || n < underV)pump=0,pump2=0;
digitalWrite(p1out,pump);
digitalWrite(p2out,pump2); // for inverted relay output replace pump into !pump
lcd.setCursor(6, 1);
if(pump==1 || pump2==1)lcd.print("ON ");
else if(pump==0 & pump2==0) lcd.print("OFF");
lcd.setCursor(10, 1);
if(!digitalRead(manual))lcd.print("MANUAL");
else lcd.print("AUTO ");
if(percentage>80) {digitalWrite(tfull, HIGH);
tankFull=1;
}
else {digitalWrite(tfull, LOW);
tankFull=0;}
if(pump&alreadyBlinked == 0)
{
digitalWrite(starter, HIGH); // set the satrter relay on
// play a note on pin 6 for 200 ms:
tone(buzzer, 600, 200);
delay(1000);
// wait for a second
digitalWrite(starter, LOW); // set the relay off
// turn off tone function for pin 6:
alreadyBlinked = 1;
}
if(!pump&alreadyBlinked == 1) alreadyBlinked = 0;
// buzzer off for pump1
if(!pump & alreadyoff == 0)
{ tone(buzzer,2000,100);
alreadyoff =1;}
if (pump&alreadyoff == 1) alreadyoff=0;
if(pump2==HIGH)
{lcd.setCursor(0, 1);
lcd.print("PUMP2:ON ");
}
else
{lcd.setCursor(0, 1);
lcd.print("PUMP ");}
if(!digitalRead(p1sw)&!state&digitalRead(manual)&!digitalRead(p2sw)){
state=1;
set_val=inches;
EEPROM.write(0, set_val);
tone(buzzer, 2000, 100); //1000hzfrequency 100 microsecong duration
}
if(!digitalRead(p1sw)&!state&!digitalRead(manual)){
state=1;
pump=!pump;
}
if (!digitalRead(p2sw)&!state2&!digitalRead(manual))
{
state2=1;
pump2=!pump2;
}
if(pump2 & alreadybuzzed == 0)
tone(buzzer, 800, 200);
alreadybuzzed=1;
if(!pump2&alreadybuzzed ==1) alreadybuzzed = 0;
//buzz2 off
if (!pump2&alreadyoff2 == 0)
{
tone(buzzer,2000,100);
alreadyoff2 = 1;
}
if (pump2&alreadyoff2 ==1)alreadyoff2=0;
if(!digitalRead(ltl)&!tankFull&!digitalRead(lth)& !pump2&digitalRead(manual)){
pump2=!pump2;
digitalWrite(p2out,pump2);
}
if(digitalRead(ltl)&digitalRead(lth)&pump2&digitalRead(manual)) pump2=0;
digitalWrite(p2out,pump2);
if(digitalRead(p1sw))state=0;
delay(200);
if(digitalRead(p2sw))state2=0;
delay(200);
}
long microsecondsToInches(long microseconds) {
return microseconds / 74 / 2;
}