from machine import Pin, PWM # 從machine模組引入Pin、PWM模組
from HCSR04 import HCSR04 # 從HCSR04模組中引入HCSR04用於超聲波測距
import time # 引入time模組
import network # 引入network模組,用於連接Wi-Fi
import urequests # 引入urequests模組,用於發送HTTP請求
from umqtt.simple import MQTTClient # 從umqtt.simple模組引入MQTTClient物件,用於MQTT通訊
import machine # 引入machine模組
from machine import SoftI2C, Pin # 引入SoftI2C和Pin類別
from lcd_api import LcdApi # 從lcd_api模組引入LcdApi物件,用於MQTT通訊
from i2c_lcd import I2cLcd # 從i2c_lcd模組引入I2cLcd物件,用於MQTT通訊
# LCD初始化參數
I2C_ADDR = 0x27
totalRows = 2 # LCD顯示行數
totalColumns = 16 # LCD每行字符數
# 初始化I2C介面及LCD顯示
i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=10000)
lcd = I2cLcd(i2c, I2C_ADDR, totalRows, totalColumns)
# Make Webhook URL
make_url = 'https://hook.eu2.make.com/wt0ckfkkaoedasf73tqtl7v73s67268n'
# 連接到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...') # 連線中...
while not sta.isconnected(): # 等待直到連接成功
pass
print('Link OK') # 連線成功
# ThingSpeak MQTT帳號和頻道訊息
THINGAPEAK_MQTT_CLIENT_ID = b"AAAYCxYKBSUjMAwyCyEPDQA" # ThingSpeak MQTT客戶端ID
THINGAPEAK_MQTT_USERNAME = b"AAAYCxYKBSUjMAwyCyEPDQA" # ThingSpeak MQTT用戶名
THINGAPEAK_MQTT_PASSWORD = b"OkNDiXyqdPhi7CJlRUDSKRBN" # ThingSpeak MQTT密碼
THINGAPEAK_CHANNEL_ID = b"2497873" # ThingSpeak頻道ID
# 建立MQTT客戶端並連接到服務器
client = MQTTClient(server = b"mqtt3.thingspeak.com", # 客戶端ID
client_id = THINGAPEAK_MQTT_CLIENT_ID, # MQTT服務器地址
user = THINGAPEAK_MQTT_USERNAME, # 用戶名
password = THINGAPEAK_MQTT_PASSWORD, # 密碼
ssl = False) # 是否使用SSL
client.connect() # 連接到MQTT服務器
# 超聲波模組初始化
sr01 = HCSR04(trigPin=18, echoPin=19)
sr02 = HCSR04(trigPin=33, echoPin=32)
try:
while True:
try:
# 顯示距離數據在LCD上
lcd.clear()
dist_left = sr01.distance()
dist_right = sr02.distance()
lcd.move_to(0, 0)
lcd.putstr("Left: {:.2f} cm".format(dist_left))
lcd.move_to(0, 1)
lcd.putstr("Right: {:.2f} cm".format(dist_right))
print("Left: {:.2f} cm, Right: {:.2f} cm".format(dist_left, dist_right))
# 將數據發布到ThingSpeak的MQTT頻道
payload = "field1={:.2f}&field2={:.2f}&field3={}".format(dist_left, dist_right, 1 if dist_left < 100 or dist_right < 100 else 0)
credentials = bytes("channels/{:s}/publish".format(THINGAPEAK_CHANNEL_ID), 'utf-8')
client.publish(credentials, bytes(payload, 'utf-8'))
# 若距離低於100cm,顯示警報信息在LCD上
if dist_left < 100 or dist_right < 100:
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr("Alarm!")
time.sleep(1)
except Exception as e:
print("Error:", e)
# 延遲10秒後進入下一次循環
time.sleep(10)
except KeyboardInterrupt:
print('Program stopped!') # 程式停止