/**
Water level Indicator for Home
created by RAKESH PATIL
Released on 08.05.2024.
*/
#include <LiquidCrystal.h>
#define trigger 3 //pin for trigger
#define echo 2 //pin for Echo
#define motor 5 //LED for indication
#define buzzer 6 //buzzer for sound
#define buttonPin 4 //LED with buzzer
int high = 0; //high level sensor
int low = 0; // low level sensor
int waterIN = 0; //Water in sensor
int newvalue = 0; //to check change in state of alarm
/* Display */
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
float time = 0, distance = 0;
int buttonState = 0;
int temp = 0, water = 0, alarm=0;
unsigned int oldvalue = newvalue = 0xFFFF;
void setup()
{
Serial.begin(9600); //serial begins
lcd.begin(16, 2); //LCD display begins
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
pinMode(motor, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(buttonPin, INPUT);
digitalWrite(motor, LOW);
digitalWrite(buzzer, LOW);
digitalWrite(buttonPin, HIGH);
pinMode(A0, INPUT); //pin configured to HIGH level
pinMode(A1, INPUT); //pin configured to LOW level
pinMode(A2, INPUT); //pin configured to Water IN
lcd.print(" Water Level ");
lcd.setCursor(0, 1);
lcd.print(" Indicator ");
delay(2000);
lcd.clear();
}
void loop()
{
//Start sensing Water level
digitalWrite(trigger, LOW);
delayMicroseconds(2);
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
delayMicroseconds(2);
time = pulseIn(echo, HIGH);
distance = time * 340 / 20000; //calculate distance
water = map(distance, 0, 400, 999, 0); //map water level as per distance
Serial.println("Distance= " + String(distance));
Serial.println("Water level= "+String(water)+" Liters");
lcd.clear();
lcd.print("Water level "); //display water level on first ROW of display
lcd.print(water);
lcd.print("L");
high = analogRead(A0); //sense high level
low = analogRead(A1); //sense low level
waterIN = analogRead(A2); //sense Water In
Serial.println("High= "+String(high));
Serial.println("Low= "+String(low));
Serial.println("WaterIN= "+String(waterIN));
Serial.println("Alarm no "+ String(alarm));
Serial.println("Button logic ="+String(buttonState));
Serial.println(oldvalue);
Serial.println(newvalue);
delay(500);
buttonState = digitalRead(buttonPin); // check if the pushbutton is pressed
delay(50);
if (waterIN > 500) //if Water is coming in tank
{
lcd.setCursor(0, 1);
lcd.print("Water filling");
alarm=1;
if (high > 500 || distance < 30) //check high level when water is coming
{
lcd.clear();
lcd.print("Water level ");
lcd.print(water);
lcd.print("L");
lcd.setCursor(0, 1);
lcd.print("Tank Overflow ^");
alarm=2;
}
}
else if (high > 500 || distance<30) //check high level in other case
{
lcd.setCursor(0, 1);
lcd.print("Tank Overflow_");
alarm=3;
}
else if (distance < 50 && high < 500) //if tank is filling toward high level
{
lcd.setCursor(0, 1);
lcd.print("Tank FULL");
}
else if (distance > 300 && low > 500) //check is water level is LOW
{
lcd.setCursor(0, 1);
lcd.print("Water level LOW");
alarm = 4;
}
else if (distance > 300 || low < 500) //check if tank is empty
{
lcd.setCursor(0, 1);
lcd.print("----NO WATER----");
alarm = 5;
}
//delay(500);
newvalue = alarm;
if (alarm==1 && temp==0)
{
digitalWrite(buzzer, HIGH);
digitalWrite(motor, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
digitalWrite(motor, LOW);
delay(2000);
}
else if ((alarm==2 || alarm==3) && temp==0)
{
digitalWrite(buzzer, HIGH);
digitalWrite(motor, HIGH);
delay(500);
digitalWrite(buzzer, LOW);
digitalWrite(motor, LOW);
delay(500);
}
else if (alarm==4 && temp==0)
{
digitalWrite(buzzer, HIGH);
digitalWrite(motor, HIGH);
delay(2000);
digitalWrite(buzzer, LOW);
digitalWrite(motor, LOW);
delay(500);
}
else if (alarm==5 && temp==0)
{
digitalWrite(buzzer, HIGH);
digitalWrite(motor, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
digitalWrite(motor, LOW);
delay(200);
}
else
{
delay(500);
}
if (buttonState == LOW && temp==0 && alarm>0)// && lock==0)
{
temp=1;
}
else if (newvalue != oldvalue || alarm==0)
{
temp=0;
oldvalue = newvalue;
}
alarm=0;
}
/*
unsigned int oldvalue = newvalue = 0xFFFF;
newvalue = read_my_data();
if (newvalue != oldvalue) {
update_my_data(newvalue);
oldvalue = newvalue;
}*/