from HCSR04 import HCSR04 #匯入自訂超音波模組
from machine import Pin,PWM,Signal,SoftI2C # 匯入Pin,PWM,Signal,SoftI2C模組
import time # 匯入time模組
from umqtt.robust import MQTTClient # 匯入umqtt.robust中的MQTTClient模組
import network # 匯入network模組
import urequests # 匯入urequests模組
import machine #匯入machine模組
from lcd_api import LcdApi #匯入lcd_api中的LcdApi模組
from i2c_lcd import I2cLcd #匯入li2c_lcd中的I2cLcd模組
# 連接到WiFi網絡
sta=network.WLAN(network.STA_IF) # 初始化STA模式的網絡接口
sta.active(True) # 啟用網絡接口
sta.connect('Wokwi-GUEST','') # 連接到WiFi,輸入您的WiFi名稱和密碼
print('Linking...') #顯示 Linking...
while not sta.isconnected() : # 等待直到連接成功
pass #跳過
print('Link OK') #顯示Link OK
# 設置連接 ThingSpeak 所需的信息
THINGSPEAK_MQTT_CLIENT_ID = b"DgwWBx8pBysXOSwbLBYzDyY"
THINGSPEAK_MQTT_USERNAME = b"DgwWBx8pBysXOSwbLBYzDyY"
THINGSPEAK_MQTT_PASSWORD = b"Ku4C8e2S+hEWdVYG9vP5xg68"
THINGSPEAK_CHANNEL_ID = b'2574528'
# 初始化 MQTTClient 對象
client = MQTTClient(server=b"mqtt3.thingspeak.com",
client_id=THINGSPEAK_MQTT_CLIENT_ID,
user=THINGSPEAK_MQTT_USERNAME,
password=THINGSPEAK_MQTT_PASSWORD,
ssl=False)
sr04_L = HCSR04(trigPin=33, echoPin=25) #設定左邊超音波感測器接腳為33,25
sr04_R = HCSR04(trigPin=18, echoPin=19) #設定右邊超音波感測器接腳為18,19
make_dist = 'https://hook.eu2.make.com/7553mlhwrwmiidihu4c774ooiw6661k5' #超音波距離 LINE網址
j=0
#設定I2C LCD
I2C_ADDR = 0x27
totalRows = 2
totalColumns = 16
i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=10000) #initializing the I2C method for ESP32
lcd = I2cLcd(i2c, I2C_ADDR, totalRows, totalColumns)
heart = bytearray([0x00,0x00,0x1B,0x1F,0x1F,0x0E,0x04,0x00])
face = bytearray([0x00,0x00,0x0A,0x00,0x11,0x0E,0x00,0x00])
lcd.custom_char(0, heart)
lcd.custom_char(1, face)
while True: #進入無窮迴圈
try: #當進行以下動作時
f=open('Dist.txt','w') #打開Dist.txt的檔案
Ultrasonic_L = 0 #令Ultrasonic_L=0
Ultrasonic_R = 0 #令Ultrasonic_R=0
Alarm = 0 #令Alarm=0
lcd.move_to(0,1) # 移動光標到第二行開頭
lcd.putstr("Under Detection") #在LCD顯示Under Detection
time.sleep(1) #暫停1秒
lcd.clear() #清除LCD上的文字
Ultrasonic_L = int(sr04_L.distance()) #讀取左邊超音波的距離
Ultrasonic_R = int(sr04_R.distance()) #讀取右邊超音波的距離
lcd.move_to(0, 0) # 移動光標到第一行開頭
lcd.putstr("Left: {} cm".format(Ultrasonic_L)) #在LCD顯示左邊超音波的距離
# 在第二行顯示右側測距結果
lcd.move_to(0, 1) # 移動光標到第二行開頭
lcd.putstr("Right: {} cm".format(Ultrasonic_R)) #在LCD顯示右邊超音波的距離
time.sleep(1) #暫停1秒
lcd.clear() #清除LCD上的文字
print('Left:', Ultrasonic_L ,'cm,Right:', Ultrasonic_R ,'cm') #顯示左、右超音波的距離
if(Ultrasonic_L<100) or (Ultrasonic_R<100) : #當任一測量距離小於100cm時,進入以下動作
Alarm = 1 #令Alarm=1
lcd.clear() #清除LCD上的文字
lcd.putstr("Alarm!") #在LCD顯示Alarm!
time.sleep(1) #暫停1秒
lcd.clear() #清除LCD上的文字
print(make_dist +"?Ultrasonic_L="+str(Ultrasonic_L)+"&Ultrasonic_R="+str(Ultrasonic_R)) #顯示LINE人員闖入警報
res=urequests.post(make_dist +"?Ultrasonic_L="+str(Ultrasonic_L)+"&Ultrasonic_R="+str(Ultrasonic_R)) #傳送LINE人員闖入警報
res.close()
print('警告!有人員闖入,左方超音波感測器偵測距離為',str(Ultrasonic_L),'cm,右方超音波感測器偵測距離為',str(Ultrasonic_R),'cm') #顯示人員闖入警報
else: #否則
Alarm = 0 #令Alarm=0
lcd.clear() #清除LCD上的文字
lcd.move_to(0,1) # 移動光標到第二行開頭
lcd.putstr("Under Detection")
time.sleep(1) #暫停1秒
lcd.clear() #清除LCD上的文字
j=j+1
print('第'+str(j),'筆','publish finish') #顯示目前第幾筆資料
f.write(str(Ultrasonic_L)+'\n') #將左邊超音波距離寫入Dist.txt
f.write(str(Ultrasonic_R)+'\n') #將右邊超音波距離寫入Dist.txt
client.connect() # 連接到MQTT服務器
credentials = bytes("channels/{:s}/publish".format(THINGSPEAK_CHANNEL_ID), 'utf-8') # 構建ThingSpeak發布憑證
payload = bytes("field1={:.1f}&field2={:.1f}&field3={:.1f}\n".format(Ultrasonic_L,Ultrasonic_R,Alarm), 'utf-8') # 構建發布的數據
client.publish(credentials, payload) # 發布數據到ThingSpeak
except Exception as e:
print(e.args[0])
time.sleep(5) #暫停5秒
f.close() #關閉Dist.txt的檔案