bitarnab
Published © GPL3+

Water Pump Controller

Controller to start/stop pump to store water in overhead tank automatically on its own without any human monitoring

BeginnerFull instructions provided8,966
Water Pump Controller

Things used in this project

Hardware components

Microchip Atmega8A
×1
16 MHz Crystal
16 MHz Crystal
×1
Capacitor 22 pF
Capacitor 22 pF
×2
Float Switch, Vertical
Float Switch, Vertical
×6
General Purpose Transistor NPN
General Purpose Transistor NPN
×2
1N4007 – High Voltage, High Current Rated Diode
1N4007 – High Voltage, High Current Rated Diode
×3
Linear Regulator (7805)
Linear Regulator (7805)
×1
Resistor 10k ohm
Resistor 10k ohm
×1
Through Hole Resistor, 680 ohm
Through Hole Resistor, 680 ohm
×6
5 mm LED: Green
5 mm LED: Green
×2
5 mm LED: Red
5 mm LED: Red
×2
5 mm LED: Yellow
5 mm LED: Yellow
×2
Toggle Switch, DPDT
Toggle Switch, DPDT
×1
Tactile Switch, Top Actuated
Tactile Switch, Top Actuated
×1

Software apps and online services

Arduino IDE
Arduino IDE

Hand tools and fabrication machines

Soldering iron (generic)
Soldering iron (generic)
Solder Flux, Soldering
Solder Flux, Soldering

Story

Read more

Schematics

Pump Controller Schematic

Code

Pump Controller

C/C++
Controller to control water pump so that pump starts automatically when water level in overhead tank falls below a certain level and shuts off when tank is full. Pump does not start if bottom reservoir is empty
//FULLY AUTOMATED SMART SYSTEM THAT WORKS WITHOUT HUMAN INTERVENTION

//The sketch makes an ARDUINO control a pump which cuts off when the overhead tank (OHT) is full and does not start the pump if the bottom pit is empty.
//For Level measurement, the pit and OHT have three sensors in each for three different water levels. The sensors are magnetic flow switches.
//The inputs are pulled HIGH with external 1k pull-up resistors as well as internal pull-up resistors. The switch gives a LOW signal when activated.
//The system shall reset by watchdog timer if it hangs. Time-out is 2 seconds.
//The pump starts automatically if the OHT is fully empty and stops when OHT is full. It does not start again unless the OHT is fully empty.
//The pump starts automatically if OHT is not full and the pit has overflown
//When pit red LED is ON (pit empty), pump stops immediately and buzzer rings for 40 seconds for one time only
//Status of Pit and OHT level transition variables stored in internal EEPROM, so that on power-on or reset the status is unchanged
//Pump running command variable stored in EEPROM location 0

//OHT
//When water level is below 'low' sensor, red LED glows; when water level is below 'mid' sensor, yellow LED glows; when water level is below 'high' sensor, green LED glows; when water level reaches 'high' sensor, pump is turned OFF and buzzer is ON
//Digital Pin 2: OHT 'low' sensor (pin4 of Atmega8A)
//Digital Pin 3: OHT 'mid' sensor (pin5 of Atmega8A)
//Digital Pin 4: OHT 'high' sensor (pin6 of Atmega8A)

//Digital Pin 17: OHT red LED (pin26 of Atmega8A)
//Digital Pin 18: OHT yellow LED (pin27 of Atmega8A)
//Digital Pin 19: OHT green LED (pin28 of Atmega8A)


//PIT
//When water level is below 'low' sensor, red LED glows; when water level is below 'mid' sensor, yellow LED glows; when water level is below 'high' sensor, green LED glows; when water level reaches 'high' sensor, green LED blinks.
//Digital Pin 5: PIT 'low' sensor (pin11 of Atmega8A)
//Digital Pin 6: PIT 'mid' sensor (pin12 of Atmega8A)
//Digital Pin 7: PIT 'high' sensor (pin13 of Atmega8A)

//Digital Pin 14: PIT red LED (pin23 of Atmega8A)
//Digital Pin 15: PIT yellow LED (pin24 of Atmega8A)
//Digital Pin 16: PIT green LED (pin25 of Atmega8A)

#include<avr/wdt.h>
#include<EEPROM.h>

byte v=EEPROM.read(0);//Pump running command variable
byte k;
byte i;

void setup() {
  // put your setup code here, to run once:
k=0;

pinMode(2, INPUT_PULLUP);//OHT low
pinMode(3, INPUT_PULLUP);//OHT mid
pinMode(4, INPUT_PULLUP);//OHT high

pinMode(5, INPUT_PULLUP);//Pit low
pinMode(6, INPUT_PULLUP);//Pit mid
pinMode(7, INPUT_PULLUP);//Pit high

pinMode(8, OUTPUT);//Relay
pinMode(9, OUTPUT);//Buzzer
pinMode(10, OUTPUT);//Pump running indicator (can be an LED)

pinMode(14, OUTPUT);//Pit red LED
pinMode(15, OUTPUT);//Pit amber LED
pinMode(16, OUTPUT);//Pit green LED

pinMode(17, OUTPUT);//OHT red LED
pinMode(18, OUTPUT);//OHT amber LED
pinMode(19, OUTPUT);//OHT green LED

wdt_enable(WDTO_2S); //watchdog timer enabled with 2 seconds timeout
}

void loop() {
  // put your main code here, to run repeatedly:

wdt_reset();

//OHT LEVEL INDICATION
if(digitalRead(2)==HIGH && digitalRead(3)==HIGH)//OHT red
{
  digitalWrite(17, HIGH);
  digitalWrite(18, LOW);
  digitalWrite(19, LOW);
}  
if(digitalRead(2)==LOW && digitalRead(3)==HIGH)//OHT amber
{
  digitalWrite(17, LOW);
  digitalWrite(18, HIGH);
  digitalWrite(19, LOW);
}
if(digitalRead(2)==LOW && digitalRead(3)==LOW)//OHT green
{
  digitalWrite(17, LOW);
  digitalWrite(18, LOW);
  digitalWrite(19, HIGH);
}

//PIT LEVEL INDICATION
if(digitalRead(5)==HIGH && digitalRead(6)==HIGH && digitalRead(7)==HIGH)//PIT red
{
  digitalWrite(14, HIGH);
  digitalWrite(15, LOW);
  digitalWrite(16, LOW);
}  
if(digitalRead(5)==LOW && digitalRead(6)==HIGH && digitalRead(7)==HIGH)//PIT amber
{
  digitalWrite(14, LOW);
  digitalWrite(15, HIGH);
  digitalWrite(16, LOW);
}
if(digitalRead(5)==LOW && digitalRead(6)==LOW && digitalRead(7)==HIGH)//PIT green
{
  digitalWrite(14, LOW);
  digitalWrite(15, LOW);
  digitalWrite(16, HIGH);
}
if(digitalRead(5)==LOW && digitalRead(6)==LOW && digitalRead(7)==LOW)//PIT overflow
{
  digitalWrite(14, LOW);
  digitalWrite(15, LOW);
  digitalWrite(16, HIGH);
  delay(450);
  digitalWrite(16, LOW);
  delay(450);
}

//Edge Crossing Algorithm
if(digitalRead(2)==LOW && digitalRead(4)==LOW)//OHT full
  {
    v=1;
    EEPROM.update(0, v);
    delay(5);
  }
if(digitalRead(2)==HIGH && digitalRead(4)==HIGH)//OHT fully empty
  {
    v=0;
    EEPROM.update(0, v);
    delay(5);
  } 
if(digitalRead(7)==LOW && digitalRead(3)==HIGH)//OHT partially empty and pit overflow
  {
    v=0;
    EEPROM.update(0, v);
    delay(5);
  }
  
//Pump running logic
if(digitalRead(5)==HIGH)
{
  digitalWrite(8, LOW);//Pump won't run if pit is empty
  if(k==0)
  {
     tone(9, 490);
     for(i=0;i<80;i++)
     {
       wdt_reset();
       delay(500);
     }
     noTone(9);
  }
  k=1; 
}

else
{
  
 if(v==0)
 {
   digitalWrite(8, HIGH);//Pump will run if OHT is not full
   digitalWrite(10, HIGH);   
 }

 if(v==1)
 {
   digitalWrite(8, LOW);//Pump won't run if OHT is full
   digitalWrite(10, LOW);
 }
}
}

Credits

bitarnab
1 project • 1 follower

Comments