# 匯入所需的函式庫
from machine import Pin, ADC # 從machine模組引入Pin和ADC類別
import network # 引入network模組,用於連接Wi-Fi
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
# 初始化 DHT22 溫濕度傳感器和連接的引腳
p0 = Pin(14, Pin.IN) # 創建Pin物件,將GPIO14設為資料腳,給定別名為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(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 燈滅