//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);
}
}
}
Comments