/**********************************************************************************
* TITLE: Automatic Water Level controller using Arduino (V1) with float switch sensor
* Click on the following links to learn more.
* YouTube Video: https://youtu.be/qwSp1OE0VG4
* Related Blog : https://iotcircuithub.com/arduino-projects/
* by Tech StudyCell
*
* This code is provided free for project purpose and fair use only.
* Please do mail us to [email protected] if you want to use it commercially.
* Copyrighted © by Tech StudyCell
*
* Download Arduino AVR Board (1.8.6) : https://www.arduino.cc/
*
* Download the libraries
* AceButton Library (1.9.2): https://github.com/bxparks/AceButton
**********************************************************************************/
#include <AceButton.h>
using namespace ace_button;
// define the connected GPIO pins
#define BuzzerPin 4 //D4
#define PumpRelay 5 //D5
#define IndicatrLED 6 //D6
#define ModeLED 13 //D13
#define PumpSwitchPin 7 //D7
#define ModeSwitchPin 8 //D8
#define UpTankLevelHigh 9 //D9
#define UpTankLevelLow 10 //D10
#define DownTankLevelHigh 11 //D11
#define DownTankLevelLow 12 //D12
bool toggleState_1 = false; //Define the toggle state for relay
bool prevMode = false;
int upTankLow = 0;
int upTankHigh = 0;
int downTankLow = 0;
int downTankHigh = 0;
String val;
ButtonConfig config1;
AceButton button1(&config1);
void handleEvent1(AceButton*, uint8_t, uint8_t);
void controlBuzzer(int duration){
digitalWrite(BuzzerPin, HIGH);
delay(duration);
digitalWrite(BuzzerPin, LOW);
}
void checkMode(){
if (digitalRead(ModeSwitchPin)!= prevMode){
controlBuzzer(500);
if(digitalRead(ModeSwitchPin) == LOW){
digitalWrite(PumpRelay, HIGH);
digitalWrite(IndicatrLED, LOW);
toggleState_1 = false;
}
}
if(digitalRead(ModeSwitchPin) == HIGH){
prevMode = true;
}
else{
prevMode = false;
}
digitalWrite(ModeLED, prevMode);
}
void controlPump(){
if(digitalRead(ModeSwitchPin) == HIGH){
if((downTankHigh == 1) && (downTankLow == 0)){
if((upTankLow == 1) && (upTankHigh == 0)){
if(toggleState_1 == false){
controlBuzzer(1000);
digitalWrite(PumpRelay, LOW); //turn on the pump
toggleState_1 = true;
digitalWrite(IndicatrLED, toggleState_1);
Serial.print(val);
Serial.println("inside if");
delay(8000);
}
}
else if((upTankLow == 0) && (upTankHigh == 1)){
digitalWrite(PumpRelay, HIGH); //turn off the pump
toggleState_1 = false;
digitalWrite(IndicatrLED, toggleState_1);
Serial.print(val);
Serial.println("inside else");
delay(8000);
}
}
else if((downTankLow == 1) && (downTankHigh == 0)){
digitalWrite(PumpRelay, HIGH); //turn off the pump
toggleState_1 = false;
digitalWrite(IndicatrLED, toggleState_1);
Serial.print(val);
Serial.println("inside else 2");
delay(8000);
}
}
else{
button1.check();
if((downTankHigh == 0) && (downTankLow == 1) ){
toggleState_1 = false;
digitalWrite(PumpRelay, HIGH); //turn off the pump
digitalWrite(IndicatrLED, toggleState_1);
}
}
}
void setup()
{
Serial.begin(9600);
pinMode(PumpRelay, OUTPUT);
pinMode(IndicatrLED, OUTPUT);
pinMode(BuzzerPin, OUTPUT);
pinMode(ModeLED, OUTPUT);
pinMode(PumpSwitchPin, INPUT_PULLUP);
pinMode(ModeSwitchPin, INPUT_PULLUP);
pinMode(UpTankLevelHigh, INPUT);
pinMode(DownTankLevelHigh, INPUT);
pinMode(UpTankLevelLow, INPUT);
pinMode(DownTankLevelLow, INPUT);
//During Starting Relay & LEDs should TURN OFF
digitalWrite(PumpRelay, HIGH); // used active LOW relay
digitalWrite(IndicatrLED, LOW);
digitalWrite(ModeLED, LOW);
digitalWrite(BuzzerPin, LOW);
config1.setEventHandler(button1Handler);
button1.init(PumpSwitchPin);
delay(3000);
controlBuzzer(500);
delay(500);
}
void loop()
{
upTankLow = digitalRead(UpTankLevelLow);
upTankHigh = digitalRead(UpTankLevelHigh);
downTankLow = digitalRead(DownTankLevelLow);
downTankHigh = digitalRead(DownTankLevelHigh);
val = String(upTankLow) + String(upTankHigh) + String(downTankLow) + String(downTankHigh);
checkMode();
controlPump();
if((downTankLow == 1) && (downTankHigh == 0)){
if(toggleState_1 == true){
digitalWrite(BuzzerPin, HIGH);
Serial.println("inside point1");
}
}
else if((upTankLow == 0) && (upTankHigh == 1)){
if(toggleState_1 == true){
Serial.println("inside point2");
controlBuzzer(1000);
}
}
else{
digitalWrite(BuzzerPin, LOW);
//Serial.println("inside point3");
}
}
void button1Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) {
Serial.println("EVENT1");
if(digitalRead(ModeSwitchPin) == LOW){
switch (eventType) {
case AceButton::kEventPressed:
if(downTankHigh == 1 && downTankLow == 0 ){
controlBuzzer(1000);
toggleState_1 = true;
digitalWrite(PumpRelay, LOW); //turn on the pump
delay(1000);
}
break;
case AceButton::kEventReleased:
toggleState_1 = false;
digitalWrite(PumpRelay, HIGH); //turn off the pump
delay(1000);
break;
}
digitalWrite(IndicatrLED, toggleState_1);
}
}