#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
// ---------------- LCD ----------------
LiquidCrystal_I2C lcd(0x27, 16, 2);
// ---------------- DHT ----------------
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// ---------------- MQ Pins ----------------
#define MQ2_PIN 34
#define MQ5_PIN 35
#define MQ7_PIN 32
// ---------------- WiFi ----------------
const char* ssid = "Wokwi-GUEST";
const char* wifi_password = "";
// ---------------- MQTT ----------------
const char* mqtt_server = "01b66b1f81634124907d5064cc4ec5b4.s1.eu.hivemq.cloud";
const int mqtt_port = 8883;
const char* mqtt_user = "Krishnateja";
const char* mqtt_pass = "Bokkale12345";
const char* mqtt_topic = "assam/aqi/live";
WiFiClientSecure espClient;
PubSubClient client(espClient);
// ---------------- AQI LOGIC ----------------
int calculateAQI(int mq2, int mq5, int mq7, float temp, float hum) {
float gasIndex = (mq2 + mq5 + mq7) / 3.0;
gasIndex = map(gasIndex, 0, 4095, 0, 300);
if (temp > 35) gasIndex += 20;
if (hum > 70) gasIndex += 15;
return constrain((int)gasIndex, 0, 500);
}
String aqiStatus(int aqi) {
if (aqi <= 50) return "GOOD";
if (aqi <= 100) return "MOD";
if (aqi <= 200) return "POOR";
return "DANGER";
}
// ---------------- CONNECT ----------------
void connectWiFi() {
WiFi.begin(ssid, wifi_password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected");
}
void connectMQTT() {
espClient.setInsecure(); // REQUIRED for HiveMQ Cloud in Wokwi
client.setServer(mqtt_server, mqtt_port);
while (!client.connected()) {
if (client.connect("ESP32-AQI", mqtt_user, mqtt_pass)) {
Serial.println("MQTT Connected");
} else {
Serial.println("MQTT Failed. Retrying...");
delay(2000);
}
}
}
// ---------------- SETUP ----------------
void setup() {
Serial.begin(115200);
Wire.begin(21, 22);
lcd.init();
lcd.backlight();
dht.begin();
lcd.setCursor(0, 0);
lcd.print("Air Quality Sys");
delay(2000);
lcd.clear();
connectWiFi();
connectMQTT();
}
// ---------------- LOOP ----------------
void loop() {
client.loop();
int mq2 = analogRead(MQ2_PIN);
int mq5 = analogRead(MQ5_PIN);
int mq7 = analogRead(MQ7_PIN);
float temp = dht.readTemperature();
float hum = dht.readHumidity();
int aqi = calculateAQI(mq2, mq5, mq7, temp, hum);
String status = aqiStatus(aqi);
// ----- LCD -----
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("AQI:");
lcd.print(aqi);
lcd.print(" ");
lcd.print(status);
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.print(temp, 1);
lcd.print(" H:");
lcd.print(hum, 0);
// ----- MQTT PUBLISH -----
char payload[256];
snprintf(payload, sizeof(payload),
"{\"aqi\":%d,\"temperature\":%.2f,\"humidity\":%.2f,\"pm25\":%d,\"pm10\":%d,\"status\":\"%s\"}",
aqi, temp, hum, mq5, mq2, status.c_str()
);
client.publish(mqtt_topic, payload);
Serial.println(payload);
delay(3000);
}
MQ5
MQ2
MQ7