# 匯入必要的模組
from machine import Pin, ADC, PWM # 從 machine 模組匯入 Pin、ADC 和 PWM 類別
import network # 匯入 network 模組,用於設置網路連接
import dht # 匯入 dht 模組,用於控制 DHT22 感測器
import time # 匯入 time 模組,用於時間相關功能
import urequests # 匯入 urequests 模組,用於進行 HTTP 請求
import machine # 匯入 machine 模組
# 設置 WiFi 連接
sta = network.WLAN(network.STA_IF) # 創建 STA_IF 類別的實例,用於設置 Station 模式
sta.active(True) # 啟用 WiFi 連接
sta.connect('Wokwi-GUEST', '') # 連接到 WiFi 網絡,請更換成您自己的 SSID 和密碼
print('Linking...')
# 等待連接到 WiFi
while not sta.isconnected():
pass
print('Link OK')
# ThingSpeak 配置
host = 'http://api.thingspeak.com' # ThingSpeak 伺服器的主機地址
api_key = 'GN5WMGYDJXZUZWEW' # 您的 ThingSpeak 寫入 API 金鑰
# 設置 RGB LED 的腳位,使用 PWM 控制
LED_R = PWM(Pin(19, Pin.OUT)) # 創建紅色 LED 物件,設置為 GPIO 19
LED_B = PWM(Pin(18, Pin.OUT)) # 創建藍色 LED 物件,設置為 GPIO 18
LED_G = PWM(Pin(5, Pin.OUT)) # 創建綠色 LED 物件,設置為 GPIO 5
# 初始化 RGB LED 的亮度
LED_R.duty(0) # 將紅色 LED 的 PWM 占空比設置為 0,關閉 LED
LED_B.duty(0) # 將藍色 LED 的 PWM 占空比設置為 0,關閉 LED
LED_G.duty(0) # 將綠色 LED 的 PWM 占空比設置為 0,關閉 LED
# 設定超音波感測器的引腳
echoTimeout = 23200 # 設定超音波感測器的回應時間上限
trigPin = Pin(25, Pin.OUT) # 設定 GPIO 26 為輸出,連接超音波的 Trig 腳
echoPin = Pin(26, Pin.OUT) # 設定 GPIO 25 為輸入,連接超音波的 Echo 腳
trigPin.value(0) # 將 Trig 腳的電壓預設為低電位
# 定義 LED PWM 控制函式,用於控制 LED 的亮暗變化
def LED_PWM(led):
for i in range(0, 1024, 10): # 從 0 增加到 1023,每次增加 10
led.duty(i) # 設置 LED 的 PWM 占空比
time.sleep_ms(20) # 等待 20 毫秒
for i in range(1023, -1, -10): # 從 1023 減少到 0,每次減少 10
led.duty(i) # 設置 LED 的 PWM 占空比
time.sleep_ms(20) # 等待 20 毫秒
# 設定測距離的自定義副函式,單位為公分
def distance():
trigPin.value(1) # 設置 Trig 腳為高電位
time.sleep_us(10) # 等待 10 微秒
trigPin.value(0) # 設置 Trig 腳為低電位
pulseTime = machine.time_pulse_us(echoPin, 1, echoTimeout) # 讀取 Echo 腳的脈衝時間
if pulseTime > 0: # 如果脈衝時間有效
return pulseTime / 58 # 轉換為距離,單位為公分
else: # 如果脈衝時間無效
return pulseTime # 返回 0
# 主迴圈,不斷測距離並控制 LED 和發送數據
while True:
cm = distance() # 開始測距
if cm > 100: # 如果距離大於 100 公分
print('Distance:', cm, 'cm')
LED_R.duty(0) # 關閉紅色 LED
LED_B.duty(0) # 關閉藍色 LED
LED_PWM(LED_G) # 控制綠色 LED
elif 30 < cm <= 100: # 如果距離在 30 到 100 公分之間
print('Distance:', cm, 'cm')
LED_R.duty(0) # 關閉紅色 LED
LED_G.duty(0) # 關閉綠色 LED
LED_PWM(LED_B) # 控制藍色 LED
elif cm <= 30: # 如果距離小於等於 30 公分
print('Distance:', cm, 'cm')
LED_G.duty(0) # 關閉綠色 LED
LED_B.duty(0) # 關閉藍色 LED
LED_PWM(LED_R) # 控制紅色 LED
# 構建包含感測器數據的 URL
url = '%s/update?api_key=%s&field4=%s' % (host, api_key, cm)
r = urequests.get(url) # 發送 GET 請求
print('response=', r.text) # 顯示響應信息