import time
import network
from machine import Pin
import dht
from umqtt.simple import MQTTClient
# -----------------------------
# Wi-Fi Configuration
# -----------------------------
SSID = "Wokwi-GUEST"
PASSWORD = ""
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print("Connecting to Wi-Fi...")
wlan.connect(SSID, PASSWORD)
while not wlan.isconnected():
time.sleep(0.5)
print("Connected! IP:", wlan.ifconfig()[0])
return wlan
wlan = connect_wifi()
# -----------------------------
# Hardware Setup
# -----------------------------
led = Pin(2, Pin.OUT) # ESP32 onboard LED
sensor = dht.DHT22(Pin(15)) # DHT22 sensor on GPIO 15
# -----------------------------
# MQTT Configuration
# -----------------------------
MQTT_BROKER = "broker.hivemq.com"
CLIENT_ID = "esp32-wokwi-demo"
TOPIC_TEMP = b"esp32/iot/22UG3-0218temp"
TOPIC_HUM = b"esp32/iot/22UG3-0218hum"
TOPIC_STATUS = b"esp32/iot/22UG3-0218status"
TOPIC_CMD = b"esp32/iot/22UG3-0218cmd"
# Temperature threshold
TEMP_THRESHOLD = 28
# Publishing interval
PUBLISH_INTERVAL = 2
# -----------------------------
# MQTT Setup and Callback
# -----------------------------
mqtt = None
def mqtt_callback(topic, msg):
topic = topic.decode()
msg = msg.decode()
print("Received:", topic, "->", msg)
if msg.upper() == "ON":
led.value(1)
mqtt.publish(TOPIC_STATUS, b"LED turned ON")
print("LED turned ON")
elif msg.upper() == "OFF":
led.value(0)
mqtt.publish(TOPIC_STATUS, b"LED turned OFF")
print("LED turned OFF")
def mqtt_connect():
global mqtt
print("Connecting to MQTT broker...")
try:
mqtt = MQTTClient(CLIENT_ID, MQTT_BROKER)
mqtt.set_callback(mqtt_callback)
mqtt.connect()
mqtt.subscribe(TOPIC_CMD)
mqtt.publish(TOPIC_STATUS, b"ESP32 connected and ready")
print("Connected to MQTT broker")
except Exception as e:
print("Failed to connect to MQTT broker:", e)
time.sleep(5)
mqtt_connect()
mqtt_connect()
# -----------------------------
# Main Loop
# -----------------------------
while True:
# Reconnect Wi-Fi if disconnected
if not wlan.isconnected():
print("Wi-Fi disconnected. Reconnecting...")
wlan = connect_wifi()
mqtt_connect()
# Check for incoming MQTT messages
try:
mqtt.check_msg()
except OSError as e:
print("MQTT error:", e)
mqtt_connect()
# Read DHT22 sensor
try:
sensor.measure()
temp = sensor.temperature()
hum = sensor.humidity()
# Only publish if temperature exceeds threshold
if temp > TEMP_THRESHOLD:
mqtt.publish(TOPIC_TEMP, str(temp).encode())
mqtt.publish(TOPIC_HUM, str(hum).encode())
mqtt.publish(TOPIC_STATUS, b"Data sent successfully")
print("Published:", temp, "°C |", hum, "%")
# Blink LED after publish
led.value(1)
time.sleep(0.2)
led.value(0)
else:
print("Temperature below threshold:", temp, "°C. Not publishing.")
except Exception as e:
print("Sensor error:", e)
# Wait for next interval
time.sleep(PUBLISH_INTERVAL)