// Blynk credentials
#define BLYNK_TEMPLATE_ID "TMPL6x8Vs3KDg"
#define BLYNK_TEMPLATE_NAME "EEE379"
#define BLYNK_AUTH_TOKEN "eZK_4MZiSChneFmn1ngC-VRdEyLUQDqm"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Pin definitions
const int mq135Pin = A0; // GPIO pin for ADC reading on ESP32
const int ledGreen = 14;
const int ledYellow = 12;
const int ledRed = 27;
const int buzzer = 4;
const int relay = 33;
// Variables to store state
BlynkTimer timer;
void setup() {
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
pinMode(mq135Pin, INPUT);
pinMode(ledGreen, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledRed, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(relay, OUTPUT);
digitalWrite(ledGreen, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledRed, LOW);
digitalWrite(buzzer, LOW);
digitalWrite(relay, LOW);
lcd.init();
lcd.backlight();
// Setup a function to be called every second
timer.setInterval(1000L, checkAirQuality);
}
void checkAirQuality() {
int airQualityRaw = analogRead(mq135Pin);
int airQualityPercentage = map(airQualityRaw, 0, 4095, 0, 100); // ESP32 ADC is 12-bit (0-4095)
lcd.setCursor(0,0);
lcd.print("Air Quality (%):");
lcd.setCursor(7,1);
lcd.println(airQualityPercentage);
if (airQualityPercentage < 20) {
// Poor air quality
digitalWrite(ledGreen, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledRed, HIGH);
analogWrite(buzzer, 5200);
digitalWrite(relay, HIGH);
lcd.clear();
lcd.setCursor(2,0);
lcd.print("No Smoking In");
lcd.setCursor(2,1);
lcd.print("This Area!!!");
delay(5000);
lcd.clear();
} else if (airQualityPercentage >= 20 && airQualityPercentage < 80) {
// Moderate air quality
digitalWrite(ledGreen, LOW);
digitalWrite(ledYellow, HIGH);
digitalWrite(ledRed, LOW);
digitalWrite(buzzer, LOW);
digitalWrite(relay, LOW);
} else {
// Good air quality
digitalWrite(ledGreen, HIGH);
digitalWrite(ledYellow, LOW);
digitalWrite(ledRed, LOW);
digitalWrite(buzzer, LOW);
digitalWrite(relay, LOW);
}
// Blynk virtual writes
Blynk.virtualWrite(V1, airQualityPercentage);
if (airQualityPercentage < 20) {
Blynk.virtualWrite(V2, 0); //Green
Blynk.virtualWrite(V3, 0); //Yellow
Blynk.virtualWrite(V4, 255); //Red
Blynk.logEvent("smoke_activities_detected","Smoking activities detected in no smoking area !");
} else if (airQualityPercentage >= 20 && airQualityPercentage < 80) {
Blynk.virtualWrite(V2, 0);
Blynk.virtualWrite(V3, 255);
Blynk.virtualWrite(V4, 0);
} else {
Blynk.virtualWrite(V2, 255);
Blynk.virtualWrite(V3, 0);
Blynk.virtualWrite(V4, 0);
}
}
BLYNK_WRITE(V5) {
int pinValue = param.asInt(); // Get value as integer
if (pinValue == 1) {
digitalWrite(relay, HIGH); // Turn on air purifier
delay(5000);
} else {
digitalWrite(relay, LOW); // Turn off air purifier
}
}
void loop() {
Blynk.run();
timer.run(); // Initiates BlynkTimer
}