# 引用必要的函式庫
import dht # 取得使用DHT22溫度與濕度的函式
from machine import Pin # 取得在微控制器(ESP32)上控制GPIO接腳的函式
import time # 取得使用時間相關的函式
import network # 取得使用網路連結管理的函式
import urequests # 取得使用HTTP要求的函式
# Wi-Fi連結相關設定
sta_if = network.WLAN(network.STA_IF) # 創建一個WLAN物件來管理Wi-Fi連結
sta_if.active(True) # 啟用WLAN介面
sta_if.connect('Wokwi-GUEST', '') # 透過現有的SSID與密碼,建立Wi-Fi連結
# 創建一個Pin物件(GPIO 15),讀取DHT22感測器收集到的資料
p_read = Pin(4, Pin.IN)
# 創建一個DHT22物件,透過Pin物件讀取資料
d = dht.DHT22(p_read)
# 初始化按鈕接腳
SW1 = Pin(5, Pin.IN, Pin.PULL_UP) # 設定開關SW1連結到接腳GPIO 5並啟用內部上拉電阻
warning_active = False # 初始化監測按鍵旗幟
SW1Time = 0 # 初始化SW1按鈕被按下的次數
# 創建Pin物件來控制LED燈
LED1 = Pin(2, Pin.OUT) # 將LED_Temp連接到GPIO 19
LED2 = Pin(15, Pin.OUT) # 將LED_Hum連接到GPIO 18
# 設定中華電信IoT智慧聯網大平台的設備編號(Device ID)-(D1mini-DHT11)
device_id = "34010416267"
# 創建HTTP請求的標頭,自定義標頭欄為"CK",其值為設備金鑰(API Key)-(D1mini-DHT11)
headers={"CK":"DKPAB279E3MRBREP14"}
# 建立一個用來上傳資料到中華電信IoT智慧聯網大平台的URL(需設備編號)
url_CHT="http://iot.cht.com.tw/iot/v1/device/" + device_id + "/rawdata"
# 等待Wi-Fi連結的建立
while not sta_if.isconnected():
print(".", end="") # 透過字串.來表達正在等待連結,避免造成當機誤會。
time.sleep(0.1) # 每次確認連結是否成功的延遲(0.1秒)
print(" WiFi連線成功!") # 當Wi-Fi連結建立成功後,於Shell列印Wi-Fi連線成功!的字串。
# 按鈕SW1被按下後行為的副函式
def alarm_Alert():
# 於Shell列印提示訊息:Warning! SW Touched!
print("Warning! SW Touched!")
# 讓紅藍燈交叉閃爍5次
for i in range(5):
LED1.value(1) # 點亮LED1(紅燈)
LED2.value(0) # 熄滅LED2(藍燈)
time.sleep(1) # 延遲1秒以利觀察
LED1.value(0) # 熄滅LED1(紅燈)
LED2.value(1) # 點亮LED2(藍燈)
time.sleep(1) # 延遲1秒以利觀察
time.sleep(0.1) # 延遲0.1秒
LED1.value(0) # 熄滅LED1(紅燈)
LED2.value(0) # 熄滅LED2(藍燈)
# 主迴圈,用以量測DHT22的溫度與濕度並上傳至中華電信IoT智慧聯網大平台
while True:
# 確認開關SW1是否被按下,若按下,則開始對SW1按鈕計數器(SW1Time)進行判別,並根據SW1按鈕計數器內含奇偶決定是否設定監測按鍵旗幟為True或False
if SW1.value() == 0:
print("SW1 pressed.")
SW1Time = SW1Time + 1 # 將SW1按鈕計數器(SW1Time)加一
if SW1Time % 2 == 0: # 若SW1按鈕被按下偶數次
warning_active = False # 設定監測按鍵旗幟為False
elif SW1Time % 2 == 1: # 若SW1按鈕被按下奇數次
warning_active = True # 設定監測按鍵旗幟為True
# 除按鈕彈跳機制
while SW1.value() == 0: # 等待SW1按鈕被釋放
pass
time.sleep(0.3) # 等待0.3秒避免按鈕彈跳
# 確認監測按鍵旗幟是否為True
if warning_active:
alarm_Alert() # 呼叫副函式alarm_Alert(),列印提示訊息:Warning! SW Touched!,讓紅藍燈閃爍
time.sleep(0.5) # 延遲0.5秒
# 量測DHT22數值,並上傳數據至中華電信IoT智慧聯網大平台
d.measure() # 觸發DHT22感測器的量測行為
t = d.temperature() # 從DHT22感測器上讀取當前溫度數值
h = d.humidity() # 從DHT22感測器上讀取當前濕度數值
print("Temp={}\u00b0C".format(t), ",", "Humi={}%".format(h)) # 於Shell中列印當前於DHT22測量到的溫度與濕度
# 以JSON格式建立上傳至中華電信IoT智慧聯網大平台的溫度資料
CHT_Temp_data = [{
"id":"DHT-Temp", # 填寫於感測器管理中的溫度感測器識別編號(ID)
"value":[str(t)] # 填寫溫度數值(要將原本的int資料格式改為str)
}]
# 以JSON格式建立上傳至中華電信IoT智慧聯網大平台的濕度資料
CHT_Hum_data = [{
"id":"DHT-Hum", # 填寫於感測器管理中的濕度感測器識別編號(ID)
"value":[str(h)] # 填寫濕度數值(要將原本的int資料格式改為str)
}]
# 避免沒有連結到Wi-Fi,導致傳輸失敗,再次確認當前Wi-Fi連結是否中斷,若中斷則重新建立連線
if not sta_if.isconnected():
# 等待Wi-Fi連結的建立
while not sta_if.isconnected():
print(".", end="") # 透過字串.來表達正在等待連結,避免造成當機誤會。
time.sleep(0.1) # 每次確認連結是否成功的延遲(0.1秒)
print(" WiFi連線成功!") # 當Wi-Fi連結再次建立成功後,於Shell列印Wi-Fi連線成功!的字串。
# 將溫度資料以JSON格式並透過HTTP POST請求上傳至中華電信IoT智慧聯網大平台
response_Temp = urequests.post(url_CHT, json=CHT_Temp_data, headers=headers)
response_Temp.close() # 關閉HTTP POST請求的回覆物件(否則將會導致程式崩潰)
# 將濕度資料以JSON格式並透過HTTP POST請求上傳至中華電信IoT智慧聯網大平台
response_Hum = urequests.post(url_CHT, json=CHT_Hum_data, headers=headers)
response_Hum.close() # 關閉HTTP POST請求的回覆物件(否則將會導致程式崩潰)
print("上傳完畢!") #當上述兩份資料上傳完畢後,於Shell列印出上傳完畢!的字串
time.sleep(3) # 延遲3秒後,進入下一個循環迭代