from machine import Pin, ADC # 從 machine 模組匯入 Pin 類,用於控制 GPIO 腳位
import network # 匯入 network 模組,用於 WiFi 連接
import dht # 匯入 dht 模組,用於操作 DHT22 感測器
import time # 匯入 time 模組,用於時間延遲
import urequests # 匯入 urequests 模組,用於 HTTP 請求
import utime # 匯入 utime 模組,用於計時功能
#WiFi 設定
sta = network.WLAN(network.STA_IF) # 創建一個 WLAN 物件,用於 WiFi 連接
sta.active(True) # 啟用 WLAN 介面
sta.connect('Wokwi-GUEST','') # 連接到 WiFi 網路
while not sta.isconnected(): # 等待連接成功
print(".", end="") # 打印等待中的點
time.sleep(0.1) # 每 0.1 秒檢查一次
print(" Connected!") # 當連接成功時打印訊息
# 初始化 DHT22 感測器與 LED
p0 = Pin(0, Pin.IN) # 設置 GPIO 0 為輸入模式,連接 DHT22 感測器
d = dht.DHT22(p0) # 創建 DHT22 感測器物件
host = 'http://api.thingspeak.com' # 定義 ThingSpeak API 的主機地址
api_key = 'X755V4HDEZK812S1' # ThingSpeak API 金鑰
AnalogInPin = ADC(Pin(32)) # 建立ADC物件讀取模擬輸入
LED_r = Pin(33, Pin.OUT)
LED_y = Pin(25, Pin.OUT) # 設置 GPIO 32 為輸出模式,控制黃色 LED
LED_g = Pin(14, Pin.OUT)
# 初始化按鈕(加入 PULL_UP)
sw1 = Pin(26, Pin.IN, Pin.PULL_UP) # 設置 GPIO 26 為輸入模式,並啟用上拉電阻,作為警示按鈕
# 全域變數
last_sw1_time = 0 # 儲存 SW1 上次觸發的時間
debounce_delay = 200 # 防彈跳延遲時間(毫秒)
warning_mode = False # 警示模式狀態
warning_printed = False # 控制警示訊息是否已經打印
led_running = True # 控制 LED 是否運行
press_count = 0
# 處理 SW1 按鍵:觸發警示模式
def sw1_handler(pin):
global press_count, last_sw1_time
current_time = utime.ticks_ms()
if utime.ticks_diff(current_time, last_sw1_time) > debounce_delay:
last_sw1_time = current_time
press_count += 1
if press_count % 2 == 1:
LED_r.value(1) # 紅色 LED 亮
LED_g.value(1) # 綠色 LED 亮
print("Warning! SW Touched!")
else:
LED_r.value(0) # 紅色 LED 滅
LED_g.value(0) # 綠色 LED 滅
print("Warning disable!!")
# 設定中斷
sw1.irq(trigger=Pin.IRQ_FALLING, handler=sw1_handler) # 設定 SW1 的中斷觸發,下降沿觸發
# 主迴圈
while True:
AnalogIn = AnalogInPin.read()
WaterPercent = (AnalogIn / 4095) * 100
if WaterPercent < 30: # 當水位低於30%
LED_r.value(1)
msg = 'Warning! Water level is too low! (%.1f%%)' % WaterPercent
print(msg)
event_log.append("水位過低警告: " + msg)
time.sleep(0.1)
else:
LED_r.value(0)
time.sleep(0.1)
print("Water Level = %.1f%%" % WaterPercent)
d.measure()
t = d.temperature()
h = d.humidity()
if t > 32:
LED_y.value(1)
print('Warning! Temp. is too High!')
time.sleep(0.1)
else:
LED_y.value(0)
time.sleep(0.1)
if h > 45:
LED_g.value(1)
print('Warning! Hum. is too High!')
time.sleep(0.1)
else:
LED_g.value(0)
time.sleep(0.1)
# 讀取5次平均值
t = 0
h = 0
for i in range(5):
d.measure()
t += d.temperature()
h += d.humidity()
time.sleep(5)
t /= 5
h /= 5
url = '%s/update?api_key=%s&field1=%s&field2=%s&field3=%s' % (host, api_key, h, t, WaterPercent)
print('Temperature=', t, 'C', 'Humidity=', h, '%')
r = urequests.get(url)
print('response=', r.text)
r.close()