#include <WiFi.h>
#include <DHTesp.h>
#include <PubSubClient.h>
// ================= WIFI =================
#define WIFI_AP_NAME "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// ================= THINGSBOARD =================
#define THINGSBOARD_SERVER "thingsboard.dmidft.com"
#define TOKEN "Jc9COeKFBBwZMiuFVSKA"
#define MQTT_PORT 1883
// ================= DHT SENSOR =================
#define DHT_PIN 15
DHTesp dht;
// ================= MQTT =================
WiFiClient espClient;
PubSubClient client(espClient);
// ================= TIMING =================
unsigned long lastSend = 0;
const unsigned long SEND_INTERVAL = 4000;
// ================= WIFI CONNECT =================
void connectWiFi() {
Serial.print("Connecting to WiFi");
WiFi.begin(WIFI_AP_NAME, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected");
}
// ================= MQTT CONNECT =================
void connectMQTT() {
client.setServer(THINGSBOARD_SERVER, MQTT_PORT);
while (!client.connected()) {
Serial.print("Connecting to ThingsBoard...");
if (client.connect("ESP32Client", TOKEN, NULL)) {
Serial.println("Connected");
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" retrying...");
delay(2000);
}
}
}
// ================= SETUP =================
void setup() {
Serial.begin(115200);
connectWiFi();
connectMQTT();
dht.setup(DHT_PIN, DHTesp::DHT22);
}
// ================= LOOP =================
void loop() {
if (WiFi.status() != WL_CONNECTED) {
connectWiFi();
}
if (!client.connected()) {
connectMQTT();
}
client.loop();
if (millis() - lastSend > SEND_INTERVAL) {
lastSend = millis();
float temperature = dht.getTemperature();
float humidity = dht.getHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("DHT sensor error!");
return;
}
// --------- JSON TELEMETRY ---------
String payload = "{";
payload += "\"temperature\":" + String(temperature) + ",";
payload += "\"humidity\":" + String(humidity);
payload += "}";
Serial.println(payload);
client.publish("v1/devices/me/telemetry", payload.c_str());
}
}