# 匯入所需的函式庫
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和密碼
print("Linking...") # shell顯示Linking...
while not sta.isconnected(): # 等待直到連接成功
pass
print("Link OK") # shell顯示Link OK
# 初始化 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 = '2GMEOUTAK9DIUHHJ' # 你的 ThingSpeak API 金鑰,請替換成自己的金鑰
# 初始化 ADC、LED 和 SW 引腳
adc = ADC(3) # 創建 ADC 物件,指定引腳 3 為輸入引腳,並給定別名為 adc
LED_red = Pin(19, Pin.OUT) # 創建 Pin 物件,指定引腳 19 為輸出引腳,並給定別名為 LED_Hum
LED_red.value(0) # 初始時,將 LED_red 關閉
sw = Pin(4, Pin.IN, Pin.PULL_UP) # 創建 Pin 物件,指定引腳 4 為輸入引腳,並使用內建的提升電阻,給定別名為SW
# 定義計數終止次數、延遲步長、溫度和濕度閾值
countEnd = 5 # 設置測量的次數
DelayStep = 3 # 設置每次測量之間的延遲時間(秒)
sw_count = 0 # 用來計算按鈕按下次數,初始化為0
a = 100 / 4096 # 根據 煙霧濃度範圍(100%)和分辨率(12位)計算比例
while True:
smoke_total = 0 # 初始化 ADC 讀數總和
Temp = 0 # 初始化溫度變數
Hum = 0 # 初始化濕度變數
try:
for i in range(countEnd):
d.measure() # 讀取 DHT22 溫濕度傳感器數據
Smoke = adc.read() # 讀取 ADC 的數據
Smoke = Smoke * a # 將 ADC 讀數轉換為煙霧濃度
dht22_Temp = d.temperature() # 讀取溫度值
dht22_Hum = d.humidity() # 讀取濕度值
smoke_total += Smoke # 累加煙霧濃度數值
Temp += dht22_Temp # 累加溫度值
Hum += dht22_Hum # 累加濕度值
if (sw.value() == 0): # 如果sw被按下
sw_count += 1 # 累加sw.count值+1
if (sw_count % 2 == 1): # 如果sw_count值為奇數
LED_red.value(1) # 紅燈亮
print(sw_count) # shell顯示sw_count數值
print("Warning! Water injecting!") # shell顯示Warning! Water injecting!
else:
LED_red.value(0) # 否則紅燈滅
print(sw_count) # shell顯示sw_count數值
print("Warning closed!!") # shell顯示Warning closed!!"
while (sw.value() == 0): # 等待SW釋放
pass
time.sleep(DelayStep) # 延遲Delaystep數值的秒數
except ValueError:
print('test') # shell顯示test
# 計算平均電壓、溫度和濕度
s = smoke_total / countEnd # 計算平均煙霧濃度
t = Temp / countEnd # 計算平均溫度
h = Hum / countEnd # 計算平均濕度
# 將數據上傳到 ThingSpeak
url = '%s/update?api_key=%s&field1=%s&field2=%s&field3=%s&'%(host, api_key, s, t, h) # 製作上傳 URL
r = urequests.get(url) # 發送 GET 請求將數據上傳到 ThingSpeak
# 輸出數據和上傳結果
print('Avg_smoke=' , s, '%', 'Avg_Temperature=', t, 'C', 'Avg_Humidity=', h, '%') # 顯示平均煙霧濃度、溫溼度值
print('url=', url) # 顯示url
print('response=', r.text) # 顯示response值
if (s > 45): # 如果煙霧濃度大於45
LED_red.value(1) # 紅燈亮
print("Warning! Smoke level is too High!") # shell顯示Warning! Smoke level is too High!
else:
LED_red.value(0) # 否則紅燈滅