/* BLYNK CONNECTION INSTRUCTION
V1:HUMIDITY
V0:TEMPERATURE
V2:DUST
V3:GAS
V4:NOTICATION
V5:
V6:
V7:
*/
#define BLYNK_TEMPLATE_ID "TMPL24XEWly-e"
#define BLYNK_TEMPLATE_NAME "AIR QUALITY MONITORING SYSTEM"
#define BLYNK_AUTH_TOKEN "4zLXiOu6ILZFkn1BYTnxINUusuS7npa7"
#define FAN 26
#define GLED 18
#define RLED 21
#define DUST 5
#define MQ7 33
#define DHTPIN 23
#define TESTP 35
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <LiquidCrystal_I2C.h>
#include <string.h>
#include <DHT.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
LiquidCrystal_I2C lcd(0x27,16,2);
DHT dht(DHTPIN, DHT22,15);
String alert1="",alert2="",alert3="",alert4="";
float coAmount,dustAmount,Humidity,Temperature;
const int maxTemperature=50,maxcoAmount=50,maxdustAmount=50;
String notification;
unsigned long duration;
unsigned long starttime;
unsigned long endtime;
unsigned long sampletime_ms = 30000;
unsigned long lowpulseoccupancy = 0;
float ratio = 0;
float concentration = 0;
void setup()
{
lcd.init();
lcd.backlight();
loadingdisplay();
dht.begin();
Serial.begin(9600);
pinMode(GLED,OUTPUT);
pinMode(RLED,OUTPUT);
pinMode(FAN,OUTPUT);
digitalWrite(FAN,LOW);
Blynk.begin(auth, ssid, pass);
digitalWrite(GLED,HIGH);
digitalWrite(RLED,LOW);
}
void loop()
{
Blynk.run();
checkCO();
checkDust;
tempHum();
if(coAmount>maxcoAmount)
{
digitalWrite(GLED,LOW);
digitalWrite(RLED,HIGH);
digitalWrite(FAN,HIGH);
notify("one");
}
else
{
digitalWrite(FAN,LOW);
}
if(dustAmount>maxdustAmount)
{
digitalWrite(GLED,LOW);
digitalWrite(RLED,HIGH);
digitalWrite(FAN,HIGH);
notify("two");
digitalWrite(FAN,HIGH);
}
else
{
digitalWrite(FAN,LOW);
}
if(Temperature>maxTemperature)
{
digitalWrite(GLED,LOW);
digitalWrite(RLED,HIGH);
digitalWrite(FAN,HIGH);
notify("three");
}
else
{
digitalWrite(FAN,LOW);
}
digitalWrite(RLED,LOW);
digitalWrite(GLED,HIGH);
homedisplay();
send_update();
}
/*
BLYNK_WRITE(V4)
{
int data=param.asInt();
if(data!= minTemperature)
{
minTemperature=data;
}
}*/
void send_update()
{
Blynk.virtualWrite(V0,Temperature);
Blynk.virtualWrite(V4,notification);
Blynk.virtualWrite(V2,dustAmount);
Blynk.virtualWrite(V3,coAmount);
delay(150);
}
void loadingdisplay()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("SMART AQ MONITOR");
lcd.setCursor(0,1);
lcd.print("SYSTEM STARTING.");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("PLEASE WAIT");
lcd.setCursor(0,1);
for(int k=0;k<16;k++)
{
lcd.setCursor(k,1);
lcd.print(".");
delay(500);
}
}
void homedisplay()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("T:");
lcd.print(Temperature,1);
lcd.setCursor(7,0);
lcd.print("H:");
lcd.print(Humidity,1);
lcd.setCursor(0,1);
lcd.print("D:");
lcd.print(dustAmount,1);
lcd.setCursor(7,1);
lcd.print("G:");
lcd.print(coAmount,1);
delay(500);
}
void alert_display(String textAlert)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("EMERGENCY ALERT");
lcd.setCursor(0,1);
lcd.print(textAlert);
}
void checkDust()
{
duration = pulseIn(DUST, LOW);
lowpulseoccupancy += duration;
endtime = millis();
if ((endtime-starttime) > sampletime_ms)
{
ratio = (lowpulseoccupancy-endtime+starttime + sampletime_ms)/(sampletime_ms*10.0); // Integer percentage 0=>100
concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; // using spec sheet curve
//dustAmount=concentration;
dustAmount=map(analogRead(35),0,4095,0,100);
Serial.print("lowpulseoccupancy:");
Serial.print(lowpulseoccupancy);
Serial.print(" ratio:");
Serial.print(ratio);
Serial.print(" DSM501A:");
Serial.println(concentration);
lowpulseoccupancy = 0;
starttime = millis();
}
}
void checkCO()
{
int sensorValue = analogRead(MQ7); // read analog input pin 0
Serial.print(sensorValue/60, DEC); // prints the value read
coAmount=map(sensorValue,0,4095,0,100);
}
void notify(String code)
{
if(code=="one")
{
alert_display("co GAS DETECTED");
notification="DANGEROUS GAS DETECTED PLEASE MOVE AWAY";
//ADD SOUND
}
if(code=="two")
{
alert_display(" DUST DETECTED ");
notification="DANGEROUS DUST DETECTED PLEASE MOVE AWAY";
//ADD SOUND
}
if(code=="three")
{
alert_display("HIGH TEMPERATURE");
notification="HIGH TEMPERATURE DETECTED PLEASE MOVE AWAY";
//ADD SOUND
}
delay(3000);
}
void tempHum()
{
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" degrees Celcius Humidity: ");
Serial.print(h);
Temperature=t;
Humidity=h;
}