我想做到每3秒偵測有沒有人移動,(補說明)
發現並不是30秒內未偵測到移動時停止計時,而是未偵測到移動時就停止了,可以修改未偵測到移動時30秒內如果沒有偵測到移動才停止,在期間如果又發現移動就繼續計時嗎? 出現訊息 持續偵測到物體移動! 計時... 522.09 秒 30秒內未偵測到移動。持續計時時間為:525.09 秒,停止計時... 停止時間:00:37:05
為了解決這個問題,您可以修改程式的邏輯,使其在30秒內沒有偵測到移動才停止計時。如果在這30秒內再次偵測到移動,則繼續計時。這裡需要新增一個「等待」時間的邏輯,當沒有偵測到移動時啟動計時器,如果在30秒內偵測到移動則重置計時器。
以下是修改後的程式碼:
import RPi.GPIO as GPIO
import time
from datetime import datetime
# 設定 GPIO 模式為 BCM
GPIO.setmode(GPIO.BCM)
# 定義 HC-SR501 的輸出腳位
PIR_PIN = 16
# 設定 GPIO 腳位為輸入模式
GPIO.setup(PIR_PIN, GPIO.IN)
# 設定相關變數
detect_flag = False # 是否偵測到物體
start_time = 0 # 計時開始時間
timeout = 30 # 偵測間隔為30秒
interval = 3 # 偵測間隔時間,單位:秒
no_motion_start_time = None # 用於記錄無移動時的開始時間
# 設定程式結束時的清理函數
def cleanup():
GPIO.cleanup()
try:
print("PIR 模組初始化中...")
time.sleep(2) # 等待模組穩定
print("準備偵測中(按 Ctrl+C 結束)")
while True:
# 讀取當前的 PIR 狀態
current_state = GPIO.input(PIR_PIN)
if current_state:
if not detect_flag:
# 當偵測到移動並且標誌為 False 時,開始計時
detect_flag = True
start_time = time.time()
no_motion_start_time = None # 重置無移動計時器
print("\n偵測到物體移動! 開始計時...", end="\r")
else:
# 偵測到物體移動且計時已開始,更新計時器顯示
elapsed_time = time.time() - start_time
print(f"持續偵測到物體移動! 計時... {elapsed_time:.2f} 秒", end="\r")
else:
if detect_flag and no_motion_start_time is None:
# 如果沒有偵測到移動,開始計算無移動的時間
no_motion_start_time = time.time()
print("\n未偵測到移動,開始計算30秒倒數...", end="\r")
elif no_motion_start_time is not None:
# 計算無移動的持續時間
no_motion_elapsed_time = time.time() - no_motion_start_time
if no_motion_elapsed_time >= timeout:
# 假如超過30秒未偵測到移動,則停止計時
elapsed_time = time.time() - start_time
stop_time = datetime.now().strftime('%H:%M:%S')
print(f"\n30秒內未偵測到移動。持續計時時間為:{elapsed_time:.2f} 秒,停止計時... 停止時間:{stop_time}")
detect_flag = False
no_motion_start_time = None
start_time = 0
else:
print(f"\n30秒倒數中,還剩:{timeout - no_motion_elapsed_time:.2f} 秒", end="\r")
# 每隔3秒檢查一次狀態,更新時間顯示
time.sleep(interval)
except KeyboardInterrupt:
print("\n程式結束")
finally:
cleanup()
新增變數 no_motion_start_time:
當 PIR 感測器沒有偵測到移動時,啟動這個計時器,記錄開始沒有移動的時間。
無移動的計時邏輯:
當沒有偵測到移動時,啟動一個30秒的計時器。若在30秒內沒有再次偵測到移動,則停止計時並顯示計時結果。如果在30秒內偵測到移動,則重置計時器,繼續計時。
無移動的時間檢查:
若 PIR 偵測器超過30秒未偵測到移動,則會輸出「停止計時」的訊息。如果在30秒內偵測到移動,則重新開始計時,無移動的倒數計時也會重置。
訊息顯示:
每次無移動超過30秒後停止計時,並在訊息中顯示「停止計時... 停止時間:時:分:秒」。
在30秒內未偵測到移動時,還會顯示倒數計時剩餘的秒數,這樣可以更加清楚看到無移動的狀況。
這樣的邏輯應該能夠符合您的要求,讓計時器在30秒內沒有偵測到移動時才停止,並在倒數期間持續監控。當再次偵測到移動時,計時器會繼續累加計時而不重置。