DHT sensor library
Adafruit Unified Sensor

4.Develop an ESP32 program to read temperature and humidity data and publish it to an MQTT broker, and develop a Python subscriber program to receive and display the published data.


pip install paho-mqtt

sketch.ino:


#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"

// DHT22 configuration
#define DHTPIN 4
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

// WiFi configuration
const char* ssid = "Wokwi-GUEST";
const char* password = "";

// MQTT broker configuration
const char* mqtt_server = "test.mosquitto.org";
const int mqtt_port = 1883;
const char* topic = "iot/dht22";

WiFiClient espClient;
PubSubClient client(espClient);

void connectWiFi() {
  Serial.print("Connecting to WiFi");

  WiFi.begin(ssid, password, 6);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("\nWiFi Connected!");
}

void reconnectMQTT() {
  while (!client.connected()) {
    Serial.print("Connecting to MQTT...");

    if (client.connect("ESP32_DHT22_Publisher")) {
      Serial.println("Connected!");
    }
    else {
      Serial.print("Failed, state: ");
      Serial.println(client.state());
      delay(2000);
    }
  }
}

void setup() {
  Serial.begin(115200);

  dht.begin();

  connectWiFi();

  client.setServer(mqtt_server, mqtt_port);

  Serial.println("DHT22 MQTT Publisher Started");
}

void loop() {
  if (!client.connected()) {
    reconnectMQTT();
  }

  client.loop();

  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();

  if (isnan(temperature) || isnan(humidity)) {
    Serial.println("DHT22 Read Failed!");
    delay(2000);
    return;
  }

  String payload = "{";
  payload += "\"temperature\":" + String(temperature, 2) + ",";
  payload += "\"humidity\":" + String(humidity, 2);
  payload += "}";

  if (client.publish(topic, payload.c_str())) {
    Serial.print("Published: ");
    Serial.println(payload);
    
  } else {
    Serial.println("MQTT publish failed!");
  }

  delay(5000);
}


diagram.json:


{
  "version": 1,
  "author": "",
  "editor": "wokwi",
  "parts": [
    {
      "type": "board-esp32-devkit-c-v4",
      "id": "esp",
      "top": 0,
      "left": 0,
      "attrs": {}
    },
    {
      "type": "wokwi-dht22",
      "id": "dht",
      "top": -20,
      "left": 200,
      "attrs": {}
    }
  ],
  "connections": [
    ["esp:TX", "$serialMonitor:RX", "", []],
    ["esp:RX", "$serialMonitor:TX", "", []],
    ["dht:VCC", "esp:3V3", "red", []],
    ["dht:GND", "esp:GND.1", "black", []],
    ["dht:SDA", "esp:4", "green", []]
  ],
  "dependencies": {}
}

subscriber.py:


import paho.mqtt.client as mqtt

# MQTT broker configuration
BROKER = "test.mosquitto.org"
PORT = 1883
TOPIC = "iot/dht22"

# Callback when connected
def on_connect(client, userdata, flags, reason_code, properties):
    if reason_code.is_failure:
        print("Connection failed:", reason_code)
        return

    print("Connected to MQTT Broker!")
    client.subscribe(TOPIC)
    print("Subscribed to:", TOPIC)


# Callback when a message arrives
def on_message(client, userdata, msg):
    print("\nReceived MQTT Message:")
    print(msg.payload.decode())


# Create MQTT client using Paho MQTT 2.x callback API
client = mqtt.Client(
    callback_api_version=mqtt.CallbackAPIVersion.VERSION2
)

client.on_connect = on_connect
client.on_message = on_message

# Connect to broker
client.connect(BROKER, PORT, 60)

print("Waiting for sensor data...")

# Keep receiving messages
client.loop_forever()