#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "EEPROM.h"
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
long duration, inches;
int lvl,m,sm,fulllvl,lowlvl,lowset,mode,dly,inch;
bool st,out;
void setup()
{
pinMode(2, INPUT);
pinMode(4, OUTPUT);
pinMode(15, OUTPUT);
pinMode(34, INPUT);
pinMode(35, INPUT);
Serial.begin(9600);
EEPROM.begin(4);
//-----------
// initialize the LCD
lcd.begin(16,2);
// Turn on the blacklight and print a message.
lcd.backlight();
lcd.print("TANK LEVEL: 100%");
lcd.setCursor(0, 1);
lcd.print("MODE:A OUT:OFF");
mode=EEPROM.read(0);
lowset=EEPROM.read(1);
fulllvl=EEPROM.read(2);
lowlvl=EEPROM.read(3);
if(mode>1)mode=0;
if(lowset<10)lowset=10;
if(lowset>90)lowset=10;
if(fulllvl>100)lowlvl=0;
if(lowlvl>120)lowlvl=1;
}
void loop()
{
dly++;
digitalWrite(4, LOW);
delayMicroseconds(2);
digitalWrite(4, HIGH);
delayMicroseconds(10);
digitalWrite(4, LOW);
duration = pulseIn(2, HIGH);
inches = microsecondsToInches(duration);
inch=inches-fulllvl;
lvl=(((lowlvl-inch))*100)/(lowlvl);
if(lvl<0)lvl=0;
if(lvl>100)lvl=100;
//----------------------------------
if( digitalRead(35)&digitalRead(34))st=0;
if( !digitalRead(34)&!st){
st=1;
if(m==0){m=1;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" MODE ");}
else if(m==2|m==1){
lcd.setCursor(0, 1);
lcd.print(" ");
if(sm==0){sm=1;
}
else if(sm==1){sm=0;
if(m==1) EEPROM.write(0, mode);
else EEPROM.write(1, lowset);
EEPROM.commit();
}
}
else if(m==3){
fulllvl=inches;
lcd.setCursor(7, 1);
lcd.print(fulllvl);
EEPROM.write(2, fulllvl);
EEPROM.commit();
delay(1000);
lcd.setCursor(0, 1);
lcd.print(" ");
}
else if(m==4){
lowlvl=inch;
if(lowlvl<1)lowlvl=1;
lcd.setCursor(7, 1);
lcd.print(lowlvl);
EEPROM.write(3, lowlvl);
EEPROM.commit();
delay(1000);
lcd.setCursor(0, 1);
lcd.print(" ");
}
else if(m==5){
m=0;
lcd.setCursor(0, 0);
lcd.print("TANK LEVEL: 100%");
lcd.setCursor(0, 1);
lcd.print("MODE:A OUT:OFF");
}
}
if( !digitalRead(35)&!st){
st=1;
if(m==0){
if(mode==1&lvl<99){out=!out; delay(500); }
}
else{
if(sm==0){m++;
if(m>5)m=1;
lcd.setCursor(0, 0);
if(m==1)lcd.print(" MODE ");
if(m==2)lcd.print(" LOW LEVEL ");
if(m==3)lcd.print(" CALIBRATE FULL");
if(m==4)lcd.print(" CALIBRATE EMPTY");
if(m==5)lcd.print(" EXIT ");
}else{
if(m==1)mode++;
if(m==2)lowset+=10;
if(mode>1)mode=0;
if(lowset>90)lowset=10;
}
} }
//---------------------
//-------------
if(dly>30){dly=0;
Serial.print("level ");
Serial.print(lvl);
Serial.print(" inch ");
Serial.println(inches);
if(lvl>99)out=0;
else if(mode==0&lvl<lowset)out=1;
if(m==0) {
//------------------------------
lcd.setCursor(12, 0);
if(lvl<100)lcd.print(" ");
if(lvl<10)lcd.print(" ");
lcd.print(lvl);
lcd.setCursor(5, 1);
if(mode==0)lcd.print("ATO");
else if(mode==1)lcd.print("MAN");
lcd.setCursor(13, 1);
if(out)lcd.print("ON ");
else lcd.print("OFF");
}
else if(sm==1){
if(m==1) {
lcd.setCursor(6, 1);
if(mode==0)lcd.print("ATO");
else if(mode==1)lcd.print("MAN");
}else if(m==2){
lcd.setCursor(7, 1);
lcd.print(lowset);
}
}
}
//----------------------------
digitalWrite(15,out);
//----------------
delay(10);
}
long microsecondsToInches(long microseconds) {
return microseconds / 74 / 2;
}