#include <WiFi.h>
#include <PubSubClient.h>
#include "DHTesp.h"
#include <math.h>
/* ===== Pins ===== */
#define DHT_PIN 15
#define LED_PIN 13
#define MQ2_PIN 34
/* ===== WiFi ===== */
const char* ssid = "Wokwi-GUEST";
const char* password = "";
/* ===== MQTT ===== */
const char* mqttServer = "broker.hivemq.com";
const int mqttPort = 1883;
/* Topics */
const char* TOPIC_LED = "esp32/devender/led";
const char* TOPIC_TEMP = "esp32/yourname/temperature";
const char* TOPIC_HUM = "esp32/yourname/humidity";
const char* TOPIC_MQ2 = "esp32/yourname/smoke";
/* ===== MQ2 ===== */
const float Vcc = 3.3;
const float RL = 5.0;
float Ro = 10.0;
/* ===== Objects ===== */
WiFiClient espClient;
PubSubClient client(espClient);
DHTesp dht;
/* ===== MQ2 Helpers ===== */
float getRs(int adc) {
if (adc == 0) return 0;
float Vout = (adc / 4095.0) * Vcc;
return ((Vcc / Vout) - 1.0) * RL;
}
float rsRoToPPM(float ratio) {
if (ratio <= 0) return 0;
return 1000.0 * pow(ratio, -2.2);
}
/* ===== MQTT Callback (LED Control) ===== */
void callback(char* topic, byte* payload, unsigned int length) {
String msg;
for (unsigned int i = 0; i < length; i++) msg += (char)payload[i];
msg.toUpperCase();
if (String(topic) == TOPIC_LED) {
digitalWrite(LED_PIN, (msg == "ON") ? HIGH : LOW);
}
}
/* ===== MQTT Reconnect ===== */
void reconnect() {
while (!client.connected()) {
String cid = "ESP32-" + String(random(0xffff), HEX);
if (client.connect(cid.c_str())) {
client.subscribe(TOPIC_LED);
} else {
delay(3000);
}
}
}
/* ===== Setup ===== */
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
dht.setup(DHT_PIN, DHTesp::DHT22);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
delay(20000); // MQ2 warm-up
float rsSum = 0;
for (int i = 0; i < 50; i++) {
rsSum += getRs(analogRead(MQ2_PIN));
delay(100);
}
Ro = (rsSum / 50.0) / 9.83;
}
/* ===== Loop ===== */
void loop() {
if (!client.connected()) reconnect();
client.loop();
static unsigned long lastSend = 0;
if (millis() - lastSend > 5000) {
lastSend = millis();
/* ---- DHT22 ---- */
TempAndHumidity d = dht.getTempAndHumidity();
if (!isnan(d.temperature)) {
char tempStr[10];
dtostrf(d.temperature, 4, 2, tempStr);
client.publish(TOPIC_TEMP, tempStr);
}
if (!isnan(d.humidity)) {
char humStr[10];
dtostrf(d.humidity, 4, 2, humStr);
client.publish(TOPIC_HUM, humStr);
}
/* ---- MQ2 ---- */
float ppm = rsRoToPPM(getRs(analogRead(MQ2_PIN)) / Ro);
char smokeStr[10];
dtostrf(ppm, 4, 2, smokeStr);
client.publish(TOPIC_MQ2, smokeStr);
}
}