In this quick hands‑on post, you’ll simulate an ESP32 with a DHT22 sensor in Wokwi, publish temperature and humidity via MQTT, and build a simple Node‑RED Dashboard to see live updates — inspired by the IoT Frontier video linked below.
MQTT with ESP32 + DHT22 on Node‑RED (Wokwi)
Overview
- Simulate ESP32 + DHT22 entirely in Wokwi.
- Publish readings over MQTT (e.g., temperature and humidity topics).
- Subscribe in Node‑RED and visualize on a Dashboard.
Prerequisites
- Wokwi account (free) to simulate ESP32 + DHT22
- Node‑RED installed locally (or hosted)
- An MQTT broker like Mosquitto (local or cloud)
Steps at a glance
-
Wokwi setup: Add ESP32 and DHT22. Connect data to a GPIO (e.g.,
GPIO 15), power to 3.3V, and ground to GND. -
Publish to MQTT: ESP32 sends JSON or plain text to topics like
home/dht22/temperatureandhome/dht22/humidity. - Subscribe in Node‑RED: Use MQTT‑in nodes for each topic and wire them to gauges/charts on the dashboard.
- View Dashboard: Open the Node‑RED dashboard to watch live updates from the simulator.
Code Snippet
npm install -g --unsafe-perm node-red
Copied!
Code Snippet
#include#include #include "DHTesp.h" const int DHT_PIN = 9; DHTesp dhtSensor; const char* ssid = "Wokwi-GUEST"; const char* password = ""; const char* mqtt_server = "broker.hivemq.com"; WiFiClient espClient; PubSubClient client(espClient); unsigned long lastMsg = 0; #define MSG_BUFFER_SIZE (50) float temp = 0; float hum = 0; int value = 0; void setup_wifi() { delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } randomSeed(micros()); Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); // Switch on the LED if an 1 was received as first character if ((char)payload[0] == '1') { digitalWrite(2, LOW); // Turn the LED on (Note that LOW is the voltage level // but actually the LED is on; this is because // it is active low on the ESP-01) } else { digitalWrite(2, HIGH); // Turn the LED off by making the voltage HIGH } } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Create a random client ID String clientId = "ESP8266Client-"; clientId += String(random(0xffff), HEX); // Attempt to connect if (client.connect(clientId.c_str())) { Serial.println("Connected"); // Once connected, publish an announcement... client.publish("iotfrontier/mqtt", "iotfrontier"); // ... and resubscribe client.subscribe("iotfrontier/mqtt"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void setup() { pinMode(2, OUTPUT); // Initialize the BUILTIN_LED pin as an output Serial.begin(115200); setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback); dhtSensor.setup(DHT_PIN, DHTesp::DHT22); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); unsigned long now = millis(); if (now - lastMsg > 2000) { lastMsg = now; TempAndHumidity data = dhtSensor.getTempAndHumidity(); String temp = String(data.temperature, 2); Serial.print("Temperature: "); Serial.println(temp); client.publish("iotfrontier/temperature", temp.c_str()); String hum = String(data.humidity, 1); Serial.print("Humidity: "); Serial.println(hum); client.publish("iotfrontier/humidity", hum.c_str()); } }
Copied!