import dht
import utime
import ujson
from machine import Pin
from umqtt.simple import MQTTClient
# MQTT Server Parameters
MQTT_BROKER = "broker.hivemq.com"
MQTT_CLIENT_ID = f"USK-IoT-RD-{utime.time_ns()}"
# Broker has no Username and Password
MQTT_USER = ""
MQTT_PASSWORD = ""
# Topic
MQTT_TOPIC = "usk/iot/mqtt/contoh"
# DHT22 Configuration
DHT22_PIN = 15
dht22 = dht.DHT22(Pin(DHT22_PIN))
# Callback function when message is received
def mqttCallback(topic, msg):
print("\n===== MESSAGE RECEIVED =====")
print("Topic :", topic.decode())
try:
# Convert JSON message into dictionary
data = ujson.loads(msg)
print("Temperature :", data["temp"], "C")
print("Humidity :", data["humidity"], "%")
except:
print("Message :", msg.decode())
print("============================\n")
# Create MQTT Client
print("Creating MQTT object...")
client = MQTTClient(
MQTT_CLIENT_ID,
MQTT_BROKER,
port=1883,
user=MQTT_USER,
password=MQTT_PASSWORD
)
# Set callback
print("Setting callback...")
client.set_callback(mqttCallback)
# Connect to MQTT Broker
try:
print("Connecting to server...", end="")
client.connect()
except:
while True:
utime.sleep(0.1)
print(".", end="")
try:
client.reconnect()
break
except:
pass
print("\nConnected to MQTT server!")
# Subscribe to topic
print("Subscribing to topic:", MQTT_TOPIC)
client.subscribe(MQTT_TOPIC)
print("System ready!\n")
while True:
try:
print("===== READING SENSOR =====")
# Read DHT22 data
dht22.measure()
temperature = dht22.temperature()
humidity = dht22.humidity()
# Display sensor values on Serial Monitor
print("Temperature :", temperature, "C")
print("Humidity :", humidity, "%")
# Create JSON payload
msg = ujson.dumps({
"temp": temperature,
"humidity": humidity
})
# Publish data to MQTT Broker
print("Publishing data...")
print("Topic :", MQTT_TOPIC)
print("Message :", msg)
client.publish(MQTT_TOPIC, msg)
print("Data published successfully!")
# Check if there is incoming message
client.check_msg()
print("Waiting for next reading...\n")
utime.sleep(5)
except Exception as e:
print("Error:", e)
utime.sleep(2)