#include <LiquidCrystal.h> //for LCD
LiquidCrystal lcd(12, 11, 2, 3, 4, 5);
int MinLevel = 60; //This is the sensor reading when the tank is full
int MaxLevel = 145; //This is the sensor reading when the tank is empty
float dist_1 = 0;
float dist_2 = 0;
int trig = 6; //trigger pin of ultrasonic sensor
int echo = 7; //Echo pin of ultrasonic sensor
int data = 0;
int previous_data = 0;
int red_led = A0;
int button1 = 9;
int button1_state = 1;
int buzzer = A3;
char str[8];
#define Sa 2093
#define Ri 2217
#define Ga 2637
#define Ma 2793
#define Pa 3135
// notes in the melody:
int melody[] = { Pa, 0, Pa, Ma, Ga, Ri, Sa, 0, Ma, Ga, Ri, Sa, Ma, Ga, Ri, Sa, 0, Ga, Ri, Sa, 0, Ri, Sa, 0, Sa, 0, Sa, Ri, Ga, Ma};
int noteDurations[] = { 4, 4, 2, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 };
//custom charachtors for the presantage bar
byte p10[8] = {B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000};
byte p20[8] = {B10000, B10000, B10000, B10000, B10000, B10000, B10000, B10000};
byte p40[8] = {B11000, B11000, B11000, B11000, B11000, B11000, B11000, B11000};
byte p60[8] = {B11100, B11100, B11100, B11100, B11100, B11100, B11100, B11100};
byte p80[8] = {B11110, B11110, B11110, B11110, B11110, B11110, B11110, B11110};
byte p100[8] = {B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111};
void setup() {
Serial.begin(9600);
lcd.begin(16,2);
pinMode(trig, OUTPUT);
digitalWrite(trig, LOW);
pinMode(echo, INPUT);
pinMode(A0, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(9, INPUT);
lcd.createChar(0,p10);
lcd.createChar(1,p20);
lcd.createChar(2,p40);
lcd.createChar(3,p60);
lcd.createChar(4,p80);
lcd.createChar(5,p100);
digitalWrite(9, HIGH);
// Boot-up message
lcd.setCursor(0,0);
lcd.print(" WELCOME ");
lcd.setCursor(0,1);
lcd.print("OHT Water level ");
delay(500);
lcd.clear();
}
void loop() {
getsensor_data();
lcd.clear();
digitalWrite(A0, LOW);
data = map (dist_1, MinLevel, MaxLevel, 100, 0);
dist_2 = dist_1;
/*
button1_state = digitalRead(9);
if ((button1_state == 1) & (data >= 98)){
play_music();
}
if (button1_state == 0){
noTone(8);
}
*/
display_bar(data);
miniNote(data);
display_percent(data);
miniNote_1(dist_2);
delay(2000);
}
int getsensor_data(){
// Standerd code for getting value from the ultrasonic sensor
digitalWrite(trig, LOW);
delayMicroseconds(5);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
//this gets the value in centimeters
dist_1 = ( pulseIn(echo, HIGH))*0.034/2;
//change if needed
// if (dist_1 < MaxLevel+100){
// data = map (dist_1, MinLevel, MaxLevel, 100, 0);
// }
return dist_1;
// return data;
// debuging code
// Serial.print(dist_1);
// Serial.print('\n');
// delay(500);
}
void miniNote_1(float dist_1){
dist_2 = .0328*(MaxLevel - dist_1);
dtostrf(dist_2,4,2,str);
delay(1000);
lcd.setCursor(0,1);
//lcd.print("Wtr lvl : ");
lcd.print(str);
lcd.println(" Feet ");
/*
if(dist_2<10){
lcd.setCursor(14, 1);} //for one digit values
if((dist_2<100) & (data>9)){
lcd.setCursor(13, 1); //for two digit values
}
if((dist_2<1000) & (data>99)){
lcd.setCursor(12, 1); //for three digit values
}
lcd.print(dist_2);
//lcd.print("%");
*/
}
void miniNote(int data){
if ((data < 8) || (data > 200)){
lcd.setCursor(0,1);
lcd.print("Almost Empty "); //Keep 16 charachtors between ""
digitalWrite(A0, HIGH);
}
else if( (data > 7) & (data < 15)){
lcd.setCursor(0,1);
lcd.print("Refill ");
digitalWrite(A0, HIGH);
}
else if ((data >14) & (data < 95)){
lcd.setCursor(0,1);
lcd.print("Normal ");
}
else if ((data>94) & (data<101)){
lcd.setCursor(0,1);
lcd.print("Tank Full ");
}
else if ((data>100) & (data<110)){
lcd.setCursor(0,1);
lcd.print("Overflowing ");
button1_state = digitalRead(9);
if (button1_state == 1){
play_music();
}
if (button1_state == 0){
noTone(8);
}
}
}
void display_percent(int data) {
//Serial.print('\n');
//Serial.print(data);
//Serial.print('\n');
if(data<10){
lcd.setCursor(14, 1);} //for one digit values
if((data<100) & (data>9)){
lcd.setCursor(13, 1); //for two digit values
}
if((data<1000) & (data>99)){
lcd.setCursor(12, 1); //for three digit values
}
lcd.print(data);
lcd.print("%");
}
void display_bar(int data){
if((data >= 0) & (data < 110)){
int dplay = map(data, 0, 100, 0, 80);
if( dplay > 80){
dplay = 80;
}
int qution = dplay / 5; //for full blocks
int reminder = dplay % 5; //for partial blocks
for(int x=0;x<qution;x++){
lcd.setCursor(x, 0);
lcd.write(5);
delay (100);
}
lcd.setCursor(qution, 0);
lcd.write(int(reminder));
}
}
void play_music() {
for (int thisNote = 0; thisNote < sizeof(melody)/2 ; thisNote++){
int noteDuration = 572/noteDurations[thisNote];
tone(A3, melody[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.3;
delay(pauseBetweenNotes);
noTone(12);
}
}