/* BLYNK CONNECTION INSTRUCTION
V0:level
V1:TEMPERATURE
V2:pressure
V3:maxlevel
V4:maxtemp
V5:maxPressure
V6:minlevel
V7:
*/
#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL2yZMhyJYW"
#define BLYNK_TEMPLATE_NAME "IOT BASED FUEL TANK MONITORING"
#define BLYNK_AUTH_TOKEN "7oExtXypvElg2a1XKZPhxCg6HSF7DmSY"
#define led3 23
#define led1 19
#define led2 18
#define buzzer 4
#define triggerPin 26
#define echoPin 25
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <HCSR04.h>
#include <LiquidCrystal_I2C.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
LiquidCrystal_I2C lcd(0x27,20,4);
HCSR04 hc(triggerPin,echoPin);
String alert1="HIGH TEMPERATURE",alert2="HIGH PRESSURE",alert3="OVER FLOW",alert4="LOW FUEL";
float Temperature,Pressure,Level,volume;
float maxTemperature=30,maxPressure=85,maxLevel=95,minLevel=5;
const int tankHeight=400;
const float radius=100,length=500;
const float pi=3.14;
void setup()
{
lcd.init();
lcd.backlight();
loadingdisplay();
Serial.begin(115200);
pinMode(led3,OUTPUT);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(buzzer,OUTPUT);
digitalWrite(buzzer,LOW);
Blynk.begin(auth, ssid, pass);
Blynk.virtualWrite(V3,maxLevel);
Blynk.virtualWrite(V4,maxTemperature);
Blynk.virtualWrite(V5,maxPressure);
digitalWrite(led3,HIGH);
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
}
void loop()
{
Blynk.run();
get_data();
send_update();
homedisplay();
if(Temperature >= maxTemperature)
{
Blynk.virtualWrite(V6,HIGH);
Blynk.virtualWrite(V7,alert1);
digitalWrite(led1,LOW);
digitalWrite(led2,HIGH);
alert_display(alert1);
Alert(3);
}
if(Pressure >= maxPressure)
{
Blynk.virtualWrite(V6,HIGH);
Blynk.virtualWrite(V7,alert2);
digitalWrite(led1,LOW);
digitalWrite(led2,HIGH);
alert_display(alert2);
Alert(3);
}
if(Level >= maxLevel)
{
Blynk.virtualWrite(V6,HIGH);
Blynk.virtualWrite(V7,alert3);
digitalWrite(led1,LOW);
digitalWrite(led2,HIGH);
alert_display(alert3);
Alert(3);
}
if(Level <= minLevel)
{
Blynk.virtualWrite(V6,HIGH);
Blynk.virtualWrite(V7,alert4);
digitalWrite(led1,LOW);
digitalWrite(led2,HIGH);
alert_display(alert4);
Alert(3);
}
digitalWrite(led1,HIGH);
digitalWrite(led2,LOW);
}
BLYNK_WRITE(V3)
{
int data=param.asInt();
if(data!= maxLevel)
{
maxLevel=data;
}
}
BLYNK_WRITE(V4)
{
int data=param.asInt();
if(data!= maxTemperature)
{
maxTemperature=data;
}
}
BLYNK_WRITE(V5)
{
int data=param.asInt();
if(data!= maxPressure)
{
maxPressure=data;
}
}
BLYNK_WRITE(V6)
{
int data=param.asInt();
if(data!= minLevel)
{
minLevel=data;
}
}
void get_data()
{
Level =map((tankHeight-(hc.dist())),tankHeight,0,0,100);
if(radius==Level)
{
volume=0.5*pi*sq(Level)*length;
volume=volume/1000;
}
else if(Level < radius)
{
volume=( (sq(radius)*acos((radius-Level)/radius)) - ((radius-Level)*sqrt(2*radius*Level-sq(Level))))*length;
volume=volume/1000;
}
else if(Level > radius)
{
volume=(((Level-radius)*sqrt(2*radius*Level-sq(Level)))+ (sq(radius)*(pi-2*acos((Level-radius)/radius))))*length;
volume=volume/1000;
}
Temperature =map(analogRead(34),0,4095,0,50);
Pressure =map(analogRead(35),0,4095,0,100);
}
void send_update()
{
Blynk.virtualWrite(V0,volume);
Blynk.virtualWrite(V1,Temperature);
Blynk.virtualWrite(V2,Pressure);
delay(150);
}
void loadingdisplay()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("*FUEL STORAGE TANK*");
lcd.setCursor(0,1);
lcd.print("* MONITORING *");
lcd.setCursor(0,2);
lcd.print(" SYSTEM INITIALIZE ");
lcd.setCursor(0,3);
lcd.print("PLEASE WAIT");
for(int k=11;k<20;k++)
{
lcd.setCursor(k,3);
lcd.print(".");
delay(500);
}
}
void homedisplay()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("-FUEL TANK ANALYSIS-");
lcd.setCursor(0,1);
lcd.print("F.VOLUME:");
lcd.setCursor(9,1);
lcd.print(volume,1);
lcd.print("L");
lcd.setCursor(0,2);
lcd.print("F.TEMP:");
lcd.setCursor(9,2);
lcd.print(Temperature,1);
lcd.print("°C");
lcd.setCursor(0,3);
lcd.print("PRESSURE:");
lcd.setCursor(9,3);
lcd.print(Pressure,1);
lcd.print("%");
delay(500);
}
void alert_display(String textAlert)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" -EMERGENCY ALERT- ");
lcd.setCursor(0,1);
lcd.print("********************");
lcd.setCursor(0,2);
lcd.print("*");
lcd.setCursor(1,2);
lcd.print(textAlert);
lcd.setCursor(19,2);
lcd.print("*");
lcd.setCursor(0,3);
lcd.print("********************");
}
void Alert(uint8_t num)
{
for(num;num>0;num--)
{
digitalWrite(buzzer,HIGH);
delay(750);
digitalWrite(buzzer,LOW);
delay(500);
}
}