#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <NewPing.h> // Include library used for measuring the distance using HC-SR 06 sonar sensor
//https://www.texobot.com/content/embedded-system/Pump-automation-using-Arduino
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int TRIG = 11;
const int ECHO = 10;
const int LED = 5;
#define MAX_DISTANCE 500 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
NewPing sonar(TRIG, ECHO, 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 TH=2;
int flag;
byte readval;
#define Manul 8
#define Up 6
#define Down 7
int ManulState = 0;
int UpState = 0;
int DownState = 0;
float TankHeight, MaxWaterLevel, EmptySpace, SonarReading, ActualReading, Temp;
int percentage;
float TankBrith = 50, TankLenth = 210, TankCap = 0, TankStore = 0 ;
///long b = 48, le = 60, h = 60, fvol = 0, st = 0;
// 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() {
// initialize serial communication:
Serial.begin(9600);
lcd.init(); // initialize the lcd
lcd.backlight();
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(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(200);
//lcd.clear();
lcd.print("Long Press Button to Change Tank Height");
delay(300);
for (int positionCounter = 0; positionCounter < 23; positionCounter++) {
// scroll one position left:
lcd.scrollDisplayLeft();
// wait a bit:
delay(300);
}
if (ManulState == HIGH)// red butto
{
lcd.clear();
lcd.print("Tank Lenth");
lcd.setCursor(0, 1);
TankHeight = EEPROM.read(TH);
lcd.setCursor(0, 0);
lcd.print(TankHeight);
delay(2000);
}
// delay(500);
// 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(500);
// lcd.clear();
// lcd.print("Change Tnk Height");
// for (int i = 0; i <= 3; i++)
// {
// lcd.setCursor(0, 1);
// lcd.print(" in:");
// lcd.print(3 - i);
// lcd.print(" Seconds");
// buttonState = digitalRead(buttonPin);
// if (buttonState == HIGH)
// {
// TankHeight = sonar.ping_cm();
// EEPROM.write(addr, TankHeight);
// }
// delay(500);
//}
//TankHeight = EEPROM.read(addr);
TankHeight = 130;
//lcd.clear();
// lcd.print("Tnk Height Set:");
// lcd.setCursor(0, 1);
//lcd.print(" ");
//lcd.print(TankHeight);
//lcd.print("cm ");
// d//elay(1000);
//lcd.clear();
//MaxWaterLevel = 0.90 * TankHeight;
MaxWaterLevel = 125;
EmptySpace = TankHeight - MaxWaterLevel;
}
void loop()
{
delay(50);
SonarReading = sonar.ping_cm();
// put your main code here, to run repeatedly:
Temp = SonarReading - EmptySpace;
ActualReading = MaxWaterLevel - Temp;
percentage = (ActualReading / MaxWaterLevel * 100);
lcd.clear();
ManulState = digitalRead(Manul);
if (ManulState == HIGH)
{
flag = 1;
EEPROM.write(addr2, flag);
flag = EEPROM.read(addr2);
lcd.setCursor(0, 0);
lcd.print("PMP ON ");
}
delay(500);
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 (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 ");
}
else if (percentage > 20 && percentage <= 100 && flag == 0)
{
//digitalWrite(RELAYPIN, LOW);
//digitalWrite(EXTRELAYPIN, HIGH);
lcd.setCursor(0, 0);
lcd.print("PMP OFF ");
}
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();
}
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();
}
delay(1500);
TankCap = (TankHeight * TankBrith * TankLenth / 1000);
TankStore = ((ActualReading * TankBrith * TankLenth) / 1000);
lcd.clear();
lcd.setCursor(0, 0);
//lcd.print(MaxWaterLevel);
lcd.print("Cap: ");
lcd.print(TankCap);
lcd.print(" Ltr");
//lcd.print(" ");
//lcd.print(TankLenth);
//lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("bal: ");
if (TankStore > 999)
{
lcd.print(TankStore);
}
else
{
lcd.setCursor(6, 1);
lcd.print(TankStore);
}
lcd.print(" Ltr.");
delay(2000);
}
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));
}