import time
import machine
import network
import dht
import ujson
from umqtt.simple import MQTTClient
# MQTT configuration
MQTT_SERVER = "mqtt.netpie.io"
MQTT_PORT = 1883
MQTT_CLIENT_ID = "87f07d0f-6da1-4e8e-a145-117d5cc0636e"
MQTT_USERNAME = "cqy3UQNrX2End2tFPQwuW3tLsom8FDTG"
MQTT_PASSWORD = "hQKu1JEjqBtuRSXbdVAbnpTAZH317yLDv"
MQTT_TOPIC = "@msg/data/update"
MQTT_PUBLISH_TOPIC = "@shadow/data/update"
# Wi-Fi credentials
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASSWORD = ""
# Pin definitions
DHT_PIN = 32
BUTTON_PINS = {"red": 16, "green": 17, "yellow": 5, "purple": 19}
LED_PINS = {"red": 26, "green": 27, "yellow": 14, "purple": 12}
# Initialize DHT sensor
dht_sensor = dht.DHT22(machine.Pin(DHT_PIN))
# Initialize LEDs and buttons
buttons = {color: machine.Pin(pin, machine.Pin.IN, machine.Pin.PULL_UP) for color, pin in BUTTON_PINS.items()}
leds = {color: machine.Pin(pin, machine.Pin.OUT) for color, pin in LED_PINS.items()}
# Connect to Wi-Fi
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
retry_count = 0
while not wlan.isconnected():
print("Connecting to Wi-Fi...")
time.sleep(1)
retry_count += 1
if retry_count > 10:
print("Failed to connect to Wi-Fi. Rebooting...")
machine.reset() # Reboot if Wi-Fi connection fails
print("Wi-Fi connected:", wlan.ifconfig())
# Callback function for MQTT messages
def mqtt_callback(topic, msg):
try:
message = msg.decode()
print("Received message:", message)
if topic.decode() == MQTT_TOPIC:
if message == "ledon":
leds["red"].value(1) # Turn red LED on
elif message == "ledoff":
leds["red"].value(0) # Turn red LED off
except Exception as e:
print("Error in MQTT callback:", e)
# Connect to MQTT broker
def connect_mqtt():
try:
client = MQTTClient(MQTT_CLIENT_ID, MQTT_SERVER, MQTT_PORT, MQTT_USERNAME, MQTT_PASSWORD)
client.set_callback(mqtt_callback)
client.connect()
print("Connected to MQTT broker")
client.subscribe(MQTT_TOPIC)
return client
except Exception as e:
print("Failed to connect to MQTT broker:", e)
time.sleep(5)
machine.reset() # Reboot if MQTT connection fails
# Main loop
def main():
connect_wifi()
client = connect_mqtt()
while True:
try:
# Read DHT sensor data
dht_sensor.measure()
humidity = dht_sensor.humidity()
temperature_c = dht_sensor.temperature()
print(f"Humidity: {humidity:.2f}%, Temperature: {temperature_c:.2f}°C")
# Publish sensor data to MQTT
payload = ujson.dumps({
'data': {
'temperature': temperature_c,
'humidity': humidity,
'ledValues': {color: led.value() for color, led in leds.items()}
}
})
client.publish(MQTT_PUBLISH_TOPIC, payload)
print("Published data to MQTT:", payload)
# Handle button presses to toggle LEDs
for color, button in buttons.items():
if button.value() == 0: # Button pressed
leds[color].value(not leds[color].value()) # Toggle corresponding LED
time.sleep_ms(100)
# Handle MQTT messages
client.check_msg()
time.sleep(1) # Delay 1 seconds between readings
except OSError as e:
print("Sensor or connection error:", e)
time.sleep(5)
except Exception as e:
print("Unexpected error:", e)
time.sleep(5)
def mqtt_callback(topic, msg):
try:
message = msg.decode()
print("Received message:", message)
if topic.decode() == MQTT_TOPIC: # ตรวจสอบหัวข้อที่ได้รับ
if message == "ledon":
leds["red"].value(1) # เปิดไฟ LED สีแดง
elif message == "ledoff":
leds["red"].value(0) # ปิดไฟ LED สีแดง
except Exception as e:
print("Error in MQTT callback:", e)
if __name__ == "__main__":
main()