#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int trigger = 34;
const int echo = 35;
const int pump = 32;
const int buzzer = 27;
const int button1 = 33;
const int button2 = 25;
const int button3 = 26;
float distance, duration, waterlevel;
bool pumpstate, mode, buzzerstatus;
int buzzercount;
byte zero[8] = { 0b00100, 0b01010, 0b10001, 0b10001, 0b10001, 0b10001, 0b10001, 0b11111 };
byte ten[8] = { 0b00100, 0b01010, 0b10001, 0b10001, 0b10001, 0b10001, 0b11111, 0b11111 };
byte twentyfive[8] = { 0b00100, 0b01010, 0b10001, 0b10001, 0b10001, 0b11111, 0b11111, 0b11111 };
byte fifty[8] = { 0b00100, 0b01010, 0b10001, 0b10001, 0b11111, 0b11111, 0b11111, 0b11111 };
byte seventyfive[8] = { 0b00100, 0b01010, 0b10001, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111 };
byte hundred[8] = { 0b00100, 0b01010, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111 };
void setup(){
lcd.init();
lcd.clear();
lcd.backlight();
lcd.setCursor(5,0);
lcd.print("SMART");
lcd.setCursor(2,1);
lcd.print("WATER PUMP");
delay(2000);
lcd.noBacklight();
lcd.createChar(0, zero);
lcd.createChar(1, ten);
lcd.createChar(2, twentyfive);
lcd.createChar(3, fifty);
lcd.createChar(4, seventyfive);
lcd.createChar(5, hundred);
lcd.clear();
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
pinMode(pump, OUTPUT);
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP);
}
void autoMode(){
if(waterlevel >= 85.0){
pumpstate = false;
}
else if(waterlevel <= 15.0){
if(buzzercount != 2){
digitalWrite(buzzer, HIGH);
delay(500);
digitalWrite(buzzer, LOW);
delay(500);
digitalWrite(buzzer, HIGH);
delay(500);
digitalWrite(buzzer, LOW);
delay(500);
buzzercount = 2;
}
pumpstate = true;
}
}
void manualMode(){
if(digitalRead(button2) == LOW){
pumpstate = !pumpstate;
}
}
void tank(){
if(waterlevel >= 0.0 && waterlevel < 10.0){
lcd.setCursor(15,0);
lcd.write(0);
}
if(waterlevel >= 10.0 && waterlevel < 25.0){
lcd.setCursor(15,0);
lcd.write(1);
}
if(waterlevel >= 25.0 && waterlevel < 50.0){
lcd.setCursor(15,0);
lcd.write(2);
}
if(waterlevel >= 50.0 && waterlevel < 75.0){
lcd.setCursor(15,0);
lcd.write(3);
}
if(waterlevel >= 75.0 && waterlevel < 100.0){
lcd.setCursor(15,0);
lcd.write(4);
}
if(waterlevel >= 100.0){
lcd.setCursor(15,0);
lcd.write(5);
}
}
void modeShift(){
if(!mode && waterlevel <= 15.0 || waterlevel >= 85.0){
mode = true;
if(!buzzerstatus){
digitalWrite(buzzer, HIGH);
delay(2000);
digitalWrite(buzzer, LOW);
buzzerstatus = true;
}
}
}
void loop(){
digitalWrite(trigger, HIGH);
delay(10);
digitalWrite(trigger, LOW);
duration = pulseIn(echo, HIGH);
distance = 0.017 * duration;
waterlevel = map(distance, 0.0, 10.0, 100.0, 0.0);
lcd.setCursor(11,0);
lcd.print(waterlevel);
lcd.setCursor(14,0);
lcd.print("%");
tank();
if(digitalRead(button1) == LOW){
digitalWrite(buzzer, HIGH);
mode = !mode;
}
if(mode){
autoMode();
lcd.setCursor(0,0);
lcd.print("AUTO ");
}
else {
manualMode();
lcd.setCursor(0,0);
lcd.print("MANUAL");
}
modeShift();
if(!pumpstate){
digitalWrite(pump, LOW);
lcd.setCursor(1,1);
lcd.print("WATER PUMP=OFF");
}
else {
digitalWrite(pump, HIGH);
lcd.setCursor(1,1);
lcd.print("WATER PUMP=ON ");
}
if(digitalRead(button3) == LOW){
lcd.backlight();
delay(3000);
lcd.noBacklight();
}
}