#!/usr/bin/env python3
"""
Raspberry Pi DHT22 Temperature Publisher to MQTT Broker
Author: Your Name
Date: 2026-09-11
"""
import time
import json
import sys
import Adafruit_DHT
import paho.mqtt.client as mqtt
# ------------------ CONFIGURATION ------------------
# DHT Sensor type and GPIO pin
DHT_SENSOR = Adafruit_DHT.DHT22
DHT_PIN = 4 # GPIO4 (Pin 7 on Raspberry Pi header)
# MQTT Broker settings
MQTT_BROKER = "broker.hivemq.com" # Public broker for testing
MQTT_PORT = 1883
MQTT_TOPIC = "raspberrypi/temperature"
# Publish interval in seconds
PUBLISH_INTERVAL = 5
# -----------------------------------------------------
def read_temperature():
"""Reads temperature from DHT22 sensor."""
humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
if temperature is None:
raise ValueError("Failed to read from DHT22 sensor.")
return round(temperature, 2), round(humidity, 2) if humidity else None
def on_connect(client, userdata, flags, rc):
"""Callback when connected to MQTT broker."""
if rc == 0:
print("✅ Connected to MQTT Broker")
else:
print(f"❌ Failed to connect, return code {rc}")
def main():
# Initialize MQTT client
client = mqtt.Client()
client.on_connect = on_connect
try:
client.connect(MQTT_BROKER, MQTT_PORT, keepalive=60)
except Exception as e:
print(f"Error connecting to MQTT broker: {e}")
sys.exit(1)
client.loop_start()
try:
while True:
try:
temp, hum = read_temperature()
payload = {
"temperature": temp,
"humidity": hum,
"unit": "C"
}
client.publish(MQTT_TOPIC, json.dumps(payload))
print(f"📤 Published: {payload}")
except ValueError as ve:
print(f"Sensor error: {ve}")
except Exception as e:
print(f"Unexpected error: {e}")
time.sleep(PUBLISH_INTERVAL)
except KeyboardInterrupt:
print("\nStopping publisher...")
finally:
client.loop_stop()
client.disconnect()
if __name__ == "__main__":
main()