#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// --- Definitions ---
#define DHTPIN 15 // Cyan wire in your diagram
#define DHTTYPE DHT22 // White DHT22 sensor
#define MQ2_PIN 34 // Gas sensor pin
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// --- Network & ThingsBoard ---
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "thingsboard.cloud";
const char* token = "rs4g3t698mx0rsp7od4i"; // <--- MAKE SURE YOUR TOKEN IS HERE
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
// 1. Initialize OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0, 10);
display.println("Connecting WiFi...");
display.display();
// 2. Initialize WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
display.clearDisplay();
display.setCursor(0, 10);
display.println("WiFi Connected!");
display.display();
// 3. Initialize MQTT & DHT
client.setServer(mqtt_server, 1883);
dht.begin();
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("ESP32_Client", token, NULL)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void loop() {
// 1. Read and Display sensors FIRST (Local display works even without internet)
float temp = dht.readTemperature();
float hum = dht.readHumidity();
int gas = analogRead(MQ2_PIN);
display.clearDisplay();
display.setCursor(0, 0);
display.println("--- SENSOR DATA ---");
display.setCursor(0, 20);
display.print("Temp: "); display.print(temp); display.println(" C");
display.setCursor(0, 35);
display.print("Hum: "); display.print(hum); display.println(" %");
display.setCursor(0, 50);
display.print("Gas: "); display.println(gas);display.println(" ppm");
display.display();
// 2. Now try to talk to ThingsBoard in the background
if (!client.connected()) {
Serial.println("MQTT Connecting...");
if (client.connect("ESP32_Client", token, NULL)) {
Serial.println("Connected to ThingsBoard!");
} else {
Serial.print("Auth Failed, rc=");
Serial.println(client.state());
}
}
if (client.connected()) {
client.loop();
String payload = "{\"temperature\":" + String(temp) + ",\"humidity\":" + String(hum) + ",\"gas\":" + String(ppm) + "}";
client.publish("v1/devices/me/telemetry", payload.c_str());
}
delay(2000);
}