from machine import Pin #從machine引入Pin
import network, dht, time, urequests #引入time、dht、network
from umqtt.simple import MQTTClient #從umqtt.simple引入MQTTClient
import uasyncio as asyncio #asynchronous processing library
#網路設定
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.connect('Wokwi-GUEST', '')
print('Linking...')
while not sta.isconnected() :
pass
print('Link OK')
DHT_Pin = Pin(14, Pin.IN) #使用Pin物件,將GPIO14設定為輸入並給定別名為DHT_Pin
dht22 = dht.DHT22(DHT_Pin) #初始化dht22
LED_Temp = Pin(27, Pin.OUT) #使用Pin物件,將GPIO27設定為輸出並給定別名為LED_Temp
LED_Hum = Pin(26, Pin.OUT) #使用Pin物件,將GPIO26設定為輸出並給定別名為LED_Hum
LED_Temp.value(0) #初始化LED_Temp
LED_Hum.value(0) #初始化LED_Hum
def handle_callback(topic, msg): #定義回調函數,用於處理MQTT消息
m = msg.decode("utf-8") # 解碼消息為UTF-8格式
print('Current topic is %s, Value is %s'%(topic, m)) # 印出當前主題和消息值
#連接到MQTT代理
client_id = "NQwuCxwCGhEKMTEtFA4DDiU" #客戶端ID
user_name = "NQwuCxwCGhEKMTEtFA4DDiU" #使用者名稱
password = "95mz6zdYpbWxVKibgC/cnCPC" #密碼
server = "mqtt3.thingspeak.com" #伺服器地址
client = MQTTClient(client_id=client_id, server=server, user=user_name, password=password)
client.set_callback(handle_callback)
client.connect()
client.subscribe(b"channels/2556313/subscribe/fields/+")
publish_topic = b"channels/2556313/publish"
#Task 1: Publish data to MQTT broker each 5s
async def task1():
while True:
print("Update temperature and humidity!")
dht22_Temp = 0 #將dht22_Temp設為0
dht22_Hum = 0 #將dht22_Hum設為0
for i in range(8):#迴圈8次
dht22.measure() #重新測量溫溼度
dht22_Temp += dht22.temperature() #讀取攝氏溫度並且疊加八次
dht22_Hum += dht22.humidity() #讀取相對溼度並且疊加八次
t = dht22_Temp / 8 #計算平均溫度,將數值除8次
h = dht22_Hum / 8 #計算平均濕度,將數值除8次
payload = f"field1={t}&field2={h}&status=MQTTPUBLISH" #構建要發布的消息
client.publish(publish_topic, payload.encode("utf-8")) #發布消息到MQTT代理
if t > 35: #如果溫度大於35度
LED_Temp.value(1) #紅燈亮
print('temperature > 35℃') #印出溫度>35度
else: #否則
LED_Temp.value(0) #紅燈滅
if h > 80: #如果濕度大於80
LED_Hum.value(1) #黃燈亮
print('humidity > 80%') #印出濕度>80%
else: #否則
LED_Hum.value(0) #黃燈滅
await asyncio.sleep_ms(5000) #等待5秒
# Task 2: 0.5s check if any data is sent from MQTT Broker?
async def task2():
while True:
client.check_msg() #檢查查消息
await asyncio.sleep_ms(500) #等待0.5秒
if __name__ == "__main__":
loop = asyncio.get_event_loop() #事件循環
loop.create_task(task1()) #呼叫task1
loop.create_task(task2()) #呼叫task2
loop.run_forever() #事件循環