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()