// Blynk credentials
#define BLYNK_TEMPLATE_ID "TMPL6np_pbtfZ"
#define BLYNK_TEMPLATE_NAME "Sistem Pemantauan Kualitas Udara"
#define BLYNK_AUTH_TOKEN "UozwRfktnT1Co6U5lm9rL6h-VshQzEg8"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
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
bool manualOverride = false;
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);
// 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)
Serial.print("Air Quality (raw): ");
Serial.println(airQualityRaw);
Serial.print("Air Quality (%): ");
Serial.println(airQualityPercentage);
if (manualOverride) {
// Manual override active
return;
}
if (airQualityPercentage < 30) {
// Good air quality
digitalWrite(ledGreen, HIGH);
digitalWrite(ledYellow, LOW);
digitalWrite(ledRed, LOW);
digitalWrite(buzzer, LOW);
digitalWrite(relay, LOW);
} else if (airQualityPercentage >= 30 && airQualityPercentage < 60) {
// Moderate air quality
digitalWrite(ledGreen, LOW);
digitalWrite(ledYellow, HIGH);
digitalWrite(ledRed, LOW);
digitalWrite(buzzer, LOW);
digitalWrite(relay, LOW);
} else {
// Poor air quality
digitalWrite(ledGreen, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledRed, HIGH);
digitalWrite(buzzer, HIGH);
digitalWrite(relay, HIGH); // Turn on air purifier
}
// Blynk virtual writes
Blynk.virtualWrite(V1, airQualityPercentage);
if (airQualityPercentage < 30) {
Blynk.virtualWrite(V2, 255); // Green LED ON
Blynk.virtualWrite(V3, 0); // Yellow LED OFF
Blynk.virtualWrite(V4, 0); // Red LED OFF
} else if (airQualityPercentage >= 30 && airQualityPercentage < 60) {
Blynk.virtualWrite(V2, 0); // Green LED OFF
Blynk.virtualWrite(V3, 255); // Yellow LED ON
Blynk.virtualWrite(V4, 0); // Red LED OFF
} else {
Blynk.virtualWrite(V2, 0); // Green LED OFF
Blynk.virtualWrite(V3, 0); // Yellow LED OFF
Blynk.virtualWrite(V4, 255); // Red LED ON
}
}
// Blynk write handler for manual override
BLYNK_WRITE(V5) {
int pinValue = param.asInt(); // Get value as integer
if (pinValue == 0) {
// Manual override ON
manualOverride = true;
digitalWrite(relay, HIGH); // Turn on air purifier
} else {
// Manual override OFF
manualOverride = false;
digitalWrite(relay, LOW); // Turn off air purifier
}
}
void loop() {
Blynk.run();
timer.run(); // Initiates BlynkTimer
}