Automatic Water Tank Level Controller with Dry Pump Run Protection Using Arduino

Hi All, welcome to yet another video. In this Video we will learn how to create Fully Automatic Water Tank Level Controller with DRY PUMP RUN PROTECTION feature using Arduino Nano.

Block Diagram

Let’s learn the Designing and Working of this project using given block diagram.

The first block is Arduino Nano, Arduino is the brain of this project. It will take input from the sensors and control all other units according to the value received.

The second block is 16x2 LCD display. This unit will display the Water Level in percentage as well as in Bar Diagram, it will also show the Pump status. This section will also notify us whenever the Sump tank is empty.

The third block is the Sonar Sensor. This is used to measure the water level present on the overhead water tank.

Let’s understand the working principle of the Sonar sensor.

Sonar Sensor emits an ultrasound at 40 kilohertz, which travels through the air, and if there is an object or obstacle on its path, It will bounce back to the module.

Arduino will use the echo pin, present on Ultrasonic sensor to measure sound wave travel time in microseconds.

Considering the travel time and the speed of the sound, you can calculate the distance using the formula shown here.

The fourth block is the Sump Water level sensor. These are two copper wires which are dipped in to the Sump Water Tank. And Analog pin present on the Arduino Nano will be used to sense the presence of water.

The fifth block is the push button, this is used to measure the Tank height at the time of installation of this Circuit. This can further used if you wish to replace the water tank with a new one.

The sixth block is the Internal Relay plush Water Pump. Arduino will control the Water pump using the Internal relay. The relay present on the circuit can be used to start any kind of 1 HP single phase Water pump without starters.

The Seventh block is also the used for the same purpose, you can use this section to replace the internal relay with any relay which is operating in 5V DC to get better power rating for driving the Water pump.

The Eight block is the Buzzer, this is used to notify when the sump tank is empty.

Required Components

Now let’s move to the components required to build this project. You can buy all these components from third party vendors like E-bay, Amazon etc.

Visit our Amazon.in(India) Store to view and purchase recommended products

Designing the PCB and Generating the Gerber File

So first of all, you need to design your PCB. You can choose online or offline platform for designing your PCBs.

Here we used Fritzing software to design the PCB. Go to Fritzing, design your circuit using the Breadboard tab. You can pick the required components to build the circuit from the top right search panel and add it to the Breadboard tab.


Refer the Circuit diagram shown here to make one by your own. Please visit the link in the description to know more about the Circuit. I have also added wire sensors to measure the Overhead tank water level in this circuit and I will be doing a separate video to show you how to replace the sonar sensor and measure the water level using these wire sensors in my next video. In this video let’s stick to Sonar sensor.

Go to PCB tab, you could see the PCB Layout automatically created according to the design that we made in Breadboard tab.

Arrange the components on to the PCB.Now Go to Routing and Click on Autoroute. This will rearrange the connections to fit with the PCB.

Once the design is done you can export it to a Gerber format.

Go to File-> Export-> For Production-> Extended Gerber.

Create a new folder and click on Select Folder. This will export all files to that folder.

Now compress the Folder to ZIP or RAR format using any of the Zipping Software.

Placing an Order on JLCPCB

We are going to use JLCPCB website for placing the order for our PCB’s. JLCPCB provides great quality PCB’s.

The basic price goes $2 for 10 pieces of PCBs if you order a two-layer PCB of size up to 100 x 100 mm. This is perfect price if you want to make prototype of your hobby projects or even for your professional products.

I am ordering my PCB’s from this website from past couple of months, I am totally satisfied with the build quality of the PCB’s.

Now let’s see how to order the PCB’s.

Now let’s see how to order the PCB’s.

To order PCBs, first of all you need to make an account in this website. You can do so by clicking on register option if you are not yet registered.

Provide a user name, then input your email id and finally set a password. Now you are ready to upload your gerber file that we created earlier.

Click on Quote now button.


Click on add your Gerber file to upload the PCB file

Once it is successfully uploaded then You will be able to view your PCB in the gerber viewer.

If you need the Gerber file that I have used for this project for ordering your PCB’s, please let me know through Contact us Option.

The PCB dimensions are automatically adjusted here. JLCPCB also gives a choice for choosing the color of PCB masking. You can choose any color from this available options.

You can leave all the other parameters as default. You can see it is only costing you $2 for 10 PCBs.

Now we will click on save to cart option, after that click on checkout securely.

Now you need to add your shipping address and shipping method.

Talking about the delivery speed, DHL will deliver it in 3 to 4 business days while airmail will deliver it in 15 to 20 business days. Chose the method according to your need.

After that select the payment method. You can pay using your credit or debit card or you can even pay using your paypal account. Complete the payment and wait for the delivery

It took me 7 days to get this delivered at my home address in India.

Unboxing

Once you tear of the wrapper, you could see your PCB's inside a cardboard box with JLCPCB printed on top of the box.

The PCBs are covered on a bubble wrap. Here one thing to notice that JLCPCB takes ultimate care of our PCBs.

Now let’s tear off the seal and take our PCBs, as you could see the PCB which comes look same as per the design that we uploaded to the JLCPCB website. And the PCB came with green masking if you could remember we had selected green color while ordering the PCB.

Now let’s have a closer look to check the quality of the PCB.

The silk screen perfectly overlaps with the pads. The silk screen is neat and clearly visible.

Then we have this shiny solder pads on both sides which makes the soldering of the components very easy.

Soldering Process

Now let's try to solder the components. Please follow the order shown in this video while soldering the components to the PCB.

The soldering of the components makes very easy because of the perfect solder pads. I would like to give a big thumps up for JLCPCB for it’s cheap price and good build quality.

1. Solder 220 ohm resistor

2. Solder the 10K resistors

3. Solder the 1K and 10K resistors at the Left hand side of the PCB

4. Solder the Diode

5. Solder the Push Button

6. Solder the 10K trimport

7. Solder the LED

8. Solder the Male Header Pin

9. Solder the transistor

10. Solder the Female Header Pin

11. Solder the Relay Port

12. Solder the Buzzer

13. Solder the Relay

14. Solder the Male Pin Header to 16*2 Display

Upload the Sketch to Arduino

Now we can upload the sketch to our Arduino. Connect Arduino to your computer using the USB cable and upload the code shown below.

Click here to download the program or else copy the code shown below to your Arduino IDE


/*

LiquidCrystal Library - Hello World


Demonstrates the use a 16x2 LCD display. The LiquidCrystal

library works with all LCD displays that are compatible with the

Hitachi HD44780 driver. There are many of them out there, and youre

can usually tell them by the 16-pin interface.


This sketch prints "Hello World!" to the LCD

and shows the time.


The circuit:

* LCD RS pin to digital pin 12

* LCD Enable pin to digital pin 11

* LCD D4 pin to digital pin 5

* LCD D5 pin to digital pin 4

* LCD D6 pin to digital pin 3

* LCD D7 pin to digital pin 2

* LCD R/W pin to ground

* LCD VSS pin to ground

* LCD VCC pin to 5V

* 10K resistor:

* ends to +5V and ground

* wiper to LCD VO pin (pin 3)


Library originally added 18 Apr 2008

by David A. Mellis

library modified 5 Jul 2009

by Limor Fried (http://www.ladyada.net)

example added 9 Jul 2009

by Tom Igoe

modified 22 Nov 2010

by Tom Igoe

modified 7 Nov 2016

by Arturo Guadalupi


This example code is in the public domain.


http://www.arduino.cc/en/Tutorial/LiquidCrystalHelloWorld


*/


// include the library code:


#include <LiquidCrystal.h>


const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; // define the Arduino pins used to connect with the LCD pins RS, EN, D4 to D7

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);//initialize the library by associating any needed LCD interface pinwith the arduino pin number it is connected to


#include <NewPing.h> // Include library used for measuring the distance using HC-SR 06 sonar sensor


#define TRIGGER_PIN 6 // Arduino pin tied to trigger pin on the ultrasonic sensor.

#define ECHO_PIN 7 // Arduino pin tied to echo pin on the ultrasonic sensor.

#define MAX_DISTANCE 500 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.


NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

#define RELAYPIN 8 // Arduino pin tied to Relaypin of the Relay Circuit

#define EXTRELAYPIN 13 // Arduino pin tied to vin pin of the External Relay Circuit

#define BUZZER 9 // Arduino pin tied to +ve terminal of the Buzzer

float val;

#include <EEPROM.h>

int addr = 0;

int addr2 = 1;

int flag;

byte readval;


#define buttonPin 10

int buttonState = 0; // variable for reading the pushbutton status

float TankHeight, MaxWaterLevel, EmptySpace, SonarReading, ActualReading, Temp;

int percentage;

int SpmpSensorPin = A0; // set A0 as the Spump water sensor pin

int SpmpsensorValue = 0; // variable to store the value coming from the sensor


// Creating Charaters for Bar Graph and Reverse Mode Icon

byte Level0[8] = {

0b00000,

0b00000,

0b00000,

0b00000,

0b00000,

0b00000,

0b11111,

0b11111

};

byte Level1[8] = {

0b00000,

0b00000,

0b00000,

0b00000,

0b11111,

0b11111,

0b11111,

0b11111

};

byte Level2[8] = {

0b00000,

0b00000,

0b11111,

0b11111,

0b11111,

0b11111,

0b11111,

0b11111

};

byte Level3[8] = {

0b11111,

0b11111,

0b11111,

0b11111,

0b11111,

0b11111,

0b11111,

0b11111

};

byte NoLevel[8] = {

0b00000,

0b00000,

0b00000,

0b00000,

0b00000,

0b00000,

0b00000,

0b00000,

};


void setup() {

Serial.begin(9600);

lcd.createChar(0, Level0);

lcd.createChar(1, Level1);

lcd.createChar(2, Level2);

lcd.createChar(3, Level3);

lcd.createChar(4, NoLevel);

Serial.println(flag);

lcd.begin(16, 2); // set up the LCD's number of columns and rows:

pinMode(RELAYPIN,OUTPUT);// Relay pin as output pin

pinMode(EXTRELAYPIN,OUTPUT);// External Relay pin as output pin

digitalWrite(RELAYPIN,LOW); //Turn off the relay

digitalWrite(EXTRELAYPIN,HIGH); //Turn off the external relay(External Relay I used was turning on while giving LOW signal, Check your one while doing the program)

pinMode(BUZZER,OUTPUT);// Buzzer pin as output pin

digitalWrite(BUZZER,LOW); //Turn off the Buzzer

lcd.print("Automatic Water");

lcd.setCursor(0,1);

lcd.print("*Pumping System*");

delay(2000);

lcd.clear();

lcd.print("Long Press Button to Change Tank Height");

delay(1000);

for (int positionCounter = 0; positionCounter < 23; positionCounter++) {

// scroll one position left:

lcd.scrollDisplayLeft();

// wait a bit:

delay(300);

}

delay(1000);

lcd.clear();

lcd.print("Tank must be Empty!");

delay(1000);

for (int positionCounter = 0; positionCounter < 3; positionCounter++) {

// scroll one position left:

lcd.scrollDisplayLeft();

// wait a bit:

delay(300);

}

delay(1000);

lcd.clear();


lcd.print("Change Tnk Height");

for (int i=0; i<=5; i++)

{

lcd.setCursor(0,1);

lcd.print(" in:");

lcd.print(5-i);

lcd.print(" Seconds");

buttonState = digitalRead(buttonPin);

if (buttonState == HIGH)

{

TankHeight =sonar.ping_cm();

EEPROM.write(addr, TankHeight);

}

delay(1000);

}


TankHeight= EEPROM.read(addr);

lcd.clear();

lcd.print("Tnk Height Set:");

lcd.setCursor(0,1);

lcd.print(" ");

lcd.print(TankHeight);

lcd.print("cm ");

delay(2000);

lcd.clear();

MaxWaterLevel=0.85*TankHeight;

EmptySpace=TankHeight-MaxWaterLevel;

}


void loop() {

// put your main code here, to run repeatedly:


delay(50); // Wait 100ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.

SonarReading=sonar.ping_cm();

SpmpsensorValue=analogRead(SpmpSensorPin);

Serial.println(SpmpsensorValue);

Temp= SonarReading-EmptySpace;

ActualReading= MaxWaterLevel-Temp;

percentage=(ActualReading/MaxWaterLevel*100);

lcd.setCursor(8,0);

lcd.print("Lev:");

lcd.print(percentage);

lcd.print("% ");

lcd.setCursor(0, 1);

lcd.print("LOW");

lcd.setCursor(11, 1);

lcd.print("HIGH ");

if(SpmpsensorValue>=100)

{

if(percentage<=20)

{

lcd.setCursor(0,0);

lcd.print("PMP ON ");

digitalWrite(RELAYPIN,HIGH);

digitalWrite(EXTRELAYPIN,LOW);

flag=1;

EEPROM.write(addr2, flag);

flag= EEPROM.read(addr2);

ZeroPercentage();

}

else if(percentage>20 && percentage<=100)

{

flag= EEPROM.read(addr2);

if(percentage>20 && percentage<=100 && flag ==1)

{

digitalWrite(RELAYPIN,HIGH);

digitalWrite(EXTRELAYPIN,LOW);

lcd.setCursor(0,0);

lcd.print("PMP ON ");

if(percentage>20 && percentage<=25)

{

TwentyFivePercentage();

}

else if(percentage>25 && percentage<=50)

{

FiftyPercentage();

}

else if(percentage>50 && percentage<=75)

{

SeventyFivePercentage();

}

else if(percentage>75 && percentage<=100)

{

HundredPercentage();

}

}

else if(percentage>20 && percentage<=100 && flag ==0)

{

digitalWrite(RELAYPIN,LOW);

digitalWrite(EXTRELAYPIN,HIGH);

lcd.setCursor(0,0);

lcd.print("PMP OFF ");

if(percentage>20 && percentage<=25)

{

TwentyFivePercentage();

}

else if(percentage>25 && percentage<=50)

{

FiftyPercentage();

}

else if(percentage>50 && percentage<=75)

{

SeventyFivePercentage();

}

else if(percentage>75 && percentage<=100)

{

HundredPercentage();

}

}

}

else if(percentage>100)

{

delay(500);

lcd.setCursor(0,0);

lcd.print("PMP OFF ");

lcd.setCursor(8,0);

lcd.print("Lev:");

lcd.print("100");

lcd.print("% ");

digitalWrite(RELAYPIN,LOW);

digitalWrite(EXTRELAYPIN,HIGH);

flag=0;

EEPROM.write(addr2, flag);

flag= EEPROM.read(addr2);

HundredPercentage();

}

}

else if(SpmpsensorValue<=100)

{

flag= EEPROM.read(addr2);

if(flag==1)

{ lcd.clear();

lcd.setCursor(0,0);

lcd.print("*SumTank Empty*");

lcd.setCursor(0,1);

lcd.print("*Pump kept OFF*");

digitalWrite(BUZZER,HIGH);

digitalWrite(RELAYPIN, LOW);

digitalWrite(EXTRELAYPIN, HIGH);

delay(100);

digitalWrite(BUZZER,LOW);

delay(100);

}

else if(flag==0)

{

lcd.setCursor(0,0);

lcd.print("STnk MT ");

if(percentage<=20)

{

ZeroPercentage();

}

else if(percentage>20 && percentage<=25)

{

TwentyFivePercentage();

}

else if(percentage>25 && percentage<=50)

{

FiftyPercentage();

}

else if(percentage>50 && percentage<=75)

{

SeventyFivePercentage();

}

else if(percentage>75 && percentage<=100)

{

HundredPercentage();

}

else if(percentage>100)

{

HundredPercentage();

}

}

}

}

void ZeroPercentage()

{

lcd.setCursor(3, 1);

lcd.write(byte(4));

lcd.setCursor(4, 1);

lcd.write(byte(4));

lcd.setCursor(5, 1);

lcd.write(byte(4));

lcd.setCursor(6, 1);

lcd.write(byte(4));

lcd.setCursor(7, 1);

lcd.write(byte(4));

lcd.setCursor(8, 1);

lcd.write(byte(4));

lcd.setCursor(9, 1);

lcd.write(byte(4));

lcd.setCursor(10, 1);

lcd.write(byte(4));

}

void TwentyFivePercentage()

{

lcd.setCursor(3, 1);

lcd.write(byte(0));

lcd.setCursor(4, 1);

lcd.write(byte(0));

lcd.setCursor(5, 1);

lcd.write(byte(4));

lcd.setCursor(6, 1);

lcd.write(byte(4));

lcd.setCursor(7, 1);

lcd.write(byte(4));

lcd.setCursor(8, 1);

lcd.write(byte(4));

lcd.setCursor(9, 1);

lcd.write(byte(4));

lcd.setCursor(10, 1);

lcd.write(byte(4));

}

void FiftyPercentage()

{

lcd.setCursor(3, 1);

lcd.write(byte(0));

lcd.setCursor(4, 1);

lcd.write(byte(0));

lcd.setCursor(5, 1);

lcd.write(byte(1));

lcd.setCursor(6, 1);

lcd.write(byte(1));

lcd.setCursor(7, 1);

lcd.write(byte(4));

lcd.setCursor(8, 1);

lcd.write(byte(4));

lcd.setCursor(9, 1);

lcd.write(byte(4));

lcd.setCursor(10, 1);

lcd.write(byte(4));

}

void SeventyFivePercentage()

{

lcd.setCursor(3, 1);

lcd.write(byte(0));

lcd.setCursor(4, 1);

lcd.write(byte(0));

lcd.setCursor(5, 1);

lcd.write(byte(1));

lcd.setCursor(6, 1);

lcd.write(byte(1));

lcd.setCursor(7, 1);

lcd.write(byte(2));

lcd.setCursor(8, 1);

lcd.write(byte(2));

lcd.setCursor(9, 1);

lcd.write(byte(4));

lcd.setCursor(10, 1);

lcd.write(byte(4));

}

void HundredPercentage()

{

lcd.setCursor(3, 1);

lcd.write(byte(0));

lcd.setCursor(4, 1);

lcd.write(byte(0));

lcd.setCursor(5, 1);

lcd.write(byte(1));

lcd.setCursor(6, 1);

lcd.write(byte(1));

lcd.setCursor(7, 1);

lcd.write(byte(2));

lcd.setCursor(8, 1);

lcd.write(byte(2));

lcd.setCursor(9, 1);

lcd.write(byte(3));

lcd.setCursor(10, 1);

lcd.write(byte(3));

}


Make sure to download the ping.h library and add it to the Arduino IDE.

Click here to download the Ping Library(v1.9.0)

Refer the below snap to add the library to Arduino IDE.

I have added comments in the program for better understanding of each codes. I have also added links to watch Arduino IDE installation for Windows and Ubuntu in the description. This will help you to understand more about Arduino if you are using it for the First time.

Let's assemble it together

We are going to assemble the project as shown in this diagram.

Please refer the sequence shown in this video while assembling the components together.

For the demo purpose we are using a 12V DC water pump. This circuit can support up to 1 HP Single phase water pump if you wish to use this circuit for Application level.

If you wish you can also connect a 5V relay having better current rating on to this circuit.

Let's test the project

We will go through all the possible scenarios while testing our project. Let’s see the working first, then we will test all the possible scenarios one by one.

So, our project is working as per our design. We hope that you enjoyed the Project. And I would like to thank you once again for watching this video.

Watch Full Project Video:-


Please do not forget to subscribe to our YouTube channel if you like this video

Also support us by contributing some money

Consider supporting TexoBot by contributing to its research and development.