# 匯入所需的函式庫
from machine import Pin, ADC # 從machine模組引入Pin和ADC類別
import network # 引入network模組,用於連接Wi-Fi
from umqtt.simple import MQTTClient
import dht # 引入dht模組,用於操作DHT22溫濕度傳感器
import time # 引入time模組,用於時間延遲
import uasyncio as asyncio
# 連接到 Wi-Fi 網絡
sta = network.WLAN(network.STA_IF) # 建立Wi-Fi station(STA)物件
sta.active(True) # 啟用Wi-Fi介面
sta.connect('Wokwi-GUEST','') # 連接到指定的Wi-Fi網絡,請替換成你的Wi-Fi SSID和密碼
print('Linking...')
while not sta.isconnected(): # 等待直到連接成功
pass
print('Link OK')
# 初始化 DHT22 溫濕度傳感器和連接的引腳
p0 = Pin(14, Pin.IN) # 創建Pin物件,將GPIO14設為資料腳,給定別名為p0,用於連接DHT22溫濕度傳感器
d = dht.DHT22(p0) # 創建DHT22物件,並指定並指定使用p0物件來連接DHT22溫溼度傳感器
def handle_callback(topic, msg):
m = msg.decode("utf-8")
print(m)
# key noi den broker
THINGAPEAK_MQTT_CLIENT_ID = "JSEOKS8fBAknNBM4PA0xKzY"
THINGAPEAK_MQTT_USERNAME = "JSEOKS8fBAknNBM4PA0xKzY"
THINGAPEAK_MQTT_PASSWORD = "6lYlTrEioZr6lSqCg6tgyMyS"
# THINGAPEAK_CHANNEL_ID = b"2493946"
server = "mqtt3.thingspeak.com"
client = MQTTClient(client_id = THINGAPEAK_MQTT_CLIENT_ID,
server = server,
user = THINGAPEAK_MQTT_USERNAME,
password = THINGAPEAK_MQTT_PASSWORD,)
client.set_callback(handle_callback)
client.connect()
client.subscribe(b"channels/2493946/subscribe/fields/+")
publish_topic = b"channels/2493946/publish"
# Task1
async def task1():
while True:
print("Update temperature and humidity!")
d.measure()
t = d.temperature()
h = d.humidity()
payload = f"field1={t}&field2={h}&status=MQTTPUBLISH"
client.publish(publish_topic,payload.encode("utf-8"))
await asyncio.sleep_ms(500)
# Task2
async def task2():
while True:
client.check_msg()
await asyncio.sleep_ms(500)
if__name__=="__main__":
loop = asyncio.get_event_loop()
loop.creat_task(task1())
loop.creat_task(task2())
loop.run_forever()
# # 定義 ThingSpeak API 的主機和 API 金鑰
# # host = 'http://api.thingspeak.com' # ThingSpeak API 的主機位址
# # api_key = '5LMSE9MIB2JUZCCN' # 你的 ThingSpeak API 金鑰,請替換成自己的金鑰
# # 初始化 ADC 和 LED 引腳
# adc = ADC(3) # 創建 ADC 物件,指定 ADC 引腳編號
# LED_Temp = Pin(20, Pin.OUT) # 創建 Pin 物件,指定引腳 20 為輸出引腳,並給定別名為LED_Temp
# LED_Hum = Pin(19, Pin.OUT) # 創建 Pin 物件,指定引腳 19 為輸出引腳,並給定別名為LED_Hum
# # 定義計數終止次數、延遲步長、溫度和濕度閾值
# countEnd = 5 # 設置測量的次數
# DelayStep = 3 # 設置每次測量之間的延遲時間(秒)
# Temp_Thres = 40 # 溫度閾值,超過此值時 LED_Temp 亮
# Hum_Thres = 60 # 濕度閾值,超過此值時 LED_Hum 亮
# # 轉換 ADC 讀數為電壓值的比例
# a = 3.3/4096 # 根據 ESP32 的 ADC 電壓範圍(3.3V)和分辨率(12位)計算比例
# while True:
# dht22_Temp = 0 # 初始化溫度變數
# dht22_Hum = 0 # 初始化濕度變數
# val_total = 0 # 初始化 ADC 讀數總和
# # 進行多次測量
# for CountTimes in range(countEnd): # 迴圈進行多次測量
# d.measure() # 讀取 DHT22 溫濕度傳感器數據
# val = adc.read() # 讀取 ADC 的數據
# val = val * a # 將 ADC 讀數轉換為電壓值
# val_total += val # 累加電壓值
# dht22_Temp += d.temperature() # 累加溫度值
# dht22_Hum += d.humidity() # 累加濕度值
# time.sleep(DelayStep) # 延遲一段時間,等待下一次測量
# # 計算平均電壓、溫度和濕度
# v = val_total / countEnd # 計算平均電壓
# t = dht22_Temp / countEnd # 計算平均溫度
# h = dht22_Hum / countEnd # 計算平均濕度
# # # # 將數據上傳到 ThingSpeak
# # url = '%s/update?api_key=%s&field1=%s&field2=%s&field3=%s'%(host, api_key, v, t, h) # 製作上傳 URL
# # r = urequests.get(url) # 發送 GET 請求將數據上傳到 ThingSpeak
# # 輸出數據和上傳結果
# print('Avg_voltage=', v, 'V')
# print('Avg_Temperature=', t, 'C')
# print('Avg_Humidity=', h, '%')
# # print('url=', url)
# # print('response=', r.text)
# # 根據溫度和濕度閾值控制 LED 燈
# if (dht22_Temp/countEnd > Temp_Thres): # 如果平均溫度超過閾值
# LED_Temp.value(1) # 溫度 LED 燈亮
# else:
# LED_Temp.value(0) # 溫度 LED 燈滅
# if (dht22_Hum/countEnd > Hum_Thres): # 如果平均濕度超過閾值
# LED_Hum.value(1) # 濕度 LED 燈亮
# else:
# LED_Hum.value(0) # 濕度 LED 燈滅
# client.connect()
# credentials = bytes("channels/{:s}/publish".format(THINGAPEAK_CHANNEL_ID), 'utf-8')
# payload = bytes("field1={:.1f}&field2={:.1f}&field3={:.1f}\n".format(v,t,h), 'utf-8')
# client.publish(credentials, payload)