#include <WiFi.h>
#include <PubSubClient.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Pin Definitions
#define DHTPIN 12
#define DHTTYPE DHT22
#define MQ135PIN 34
#define OLED_SDA 21
#define OLED_SCL 22
// OLED Display Settings
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Sensor Objects
DHT dht(DHTPIN, DHTTYPE);
// WiFi & MQTT Settings
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "broker.hivemq.com";
const char* clientID = "ESP32-Sensor";
const char* topic = "sensor/data";
WiFiClient espClient;
PubSubClient client(espClient);
// Timing Variables
unsigned long previousMillis = 0;
const long interval = 2000;
void setup() {
Serial.begin(115200);
dht.begin();
// Initialize OLED Display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED display failed to start");
while (1);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
// Connect to WiFi
connectWiFi();
// Set up MQTT
client.setServer(mqttServer, 1883);
}
void loop() {
if (!client.connected()) {
reconnectMQTT();
}
client.loop();
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// Read DHT22 Sensor
float temp = dht.readTemperature();
float hum = dht.readHumidity();
// Read MQ135 Sensor
int airQuality = analogRead(MQ135PIN);
// Print Values
Serial.print("Temp: "); Serial.print(temp); Serial.print("°C, ");
Serial.print("Humidity: "); Serial.print(hum); Serial.print("%, ");
Serial.print("Air Quality: "); Serial.println(airQuality);
// Display Data on OLED
display.clearDisplay();
display.setCursor(0, 10);
display.print("Temp: "); display.print(temp); display.println(" C");
display.print("Humidity: "); display.print(hum); display.println(" %");
display.print("Air Q: "); display.print(airQuality);
display.display();
// Send Data to MQTT
String payload = String(temp) + "," + String(hum) + "," + String(airQuality);
client.publish(topic, payload.c_str());
}
}
// WiFi Connection Function
void connectWiFi() {
Serial.print("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected!");
Serial.print("IP Address: "); Serial.println(WiFi.localIP());
}
// MQTT Reconnect Function
void reconnectMQTT() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
if (client.connect(clientID)) {
Serial.println("Connected to MQTT!");
} else {
Serial.print("Failed, retrying in 5s...");
delay(5000);
}
}
}