# 匯入所需的函式庫
from machine import Pin # 從machine模組引入Pin類別
import network # 引入network模組,用於連接Wi-Fi
from umqtt.robust import MQTTClient
import dht # 引入dht模組,用於操作DHT22溫濕度傳感器
import time # 引入time模組,用於時間延遲
import urequests # 引入urequests模組,用於發送HTTP請求
# 連接到 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和密碼
while not sta.isconnected(): # 等待直到連接成功
pass
THINGAPEAK_MQTT_CLIENT_ID = b"JSEOKS8fBAknNBM4PA0xKzY"
THINGAPEAK_MQTT_USERNAME = b"JSEOKS8fBAknNBM4PA0xKzY"
THINGAPEAK_MQTT_PASSWORD = b"6lYlTrEioZr6lSqCg6tgyMyS"
THINGAPEAK_CHANNEL_ID = b"2493946"
client = MQTTClient(server = b"mqtt3.thingspeak.com",
client_id = THINGAPEAK_MQTT_CLIENT_ID,
user = THINGAPEAK_MQTT_USERNAME,
password = THINGAPEAK_MQTT_PASSWORD,
ssl = False)
# 初始化 DHT22 溫濕度傳感器和連接的引腳
p0 = Pin(13, Pin.IN) # 創建Pin物件,將GPIO13設為資料腳,給定別名為p0,用於連接DHT22溫濕度傳感器
d = dht.DHT22(p0) # 創建DHT22物件,並指定並指定使用p0物件來連接DHT22溫溼度傳感器
# 定義 ThingSpeak API 的主機和 API 金鑰
# host = 'http://api.thingspeak.com' # ThingSpeak API 的主機位址
# api_key = '5LMSE9MIB2JUZCCN' # 你的 ThingSpeak API 金鑰,請替換成自己的金鑰
# 初始化 ADC 和 LED 引腳
adc = ADC(34) # 創建 ADC 物件,指定 ADC 引腳編號
LED_Temp = Pin(18, Pin.OUT) # 創建 Pin 物件,指定引腳 18 為輸出引腳,並給定別名為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)