2017-07-11 33 views
0

我爲我的覆盆子pi做了蜂鳴器程序。我希望程序能夠保證安全:如果我的門打開時間過長(我的門上有一個磁性傳感器),蜂鳴器會發出嗡嗡聲。一旦門關閉,蜂鳴器將停止。然而,我注意到蜂鳴器在蜂鳴器鳴響之前需要一段時間(time.sleep(10))。看起來好像我的代碼在if語句停止之前循環。一旦門關閉,我想讓蜂鳴器停下來。有人可以用我的代碼幫助我嗎?如果其他語句在Pi中的蜂鳴器系統

import time 
import RPi.GPIO as gpio 

buzzer = 11 
door = 3 

gpio.setmode(gpio.BOARD) 
gpio.setwarnings(False) 
gpio.setup(buzzer, gpio.OUT) 
gpio.setup(door, gpio.IN, pull_up_down=gpio.PUD_UP) 

while True: 
    if gpio.output(door): 
     time.sleep(10) 
     gpio.output(buzzer, True) 
    else: 
     gpio.output(buzzer, False) 

gpio.cleanup() 
+0

10秒延遲的目的是什麼? – jacoblaw

+0

@jacoblaw鬧鐘響起前10秒鐘。它應該是一個安全系統。 – Draenokh

+0

好的。你能否確認這是你想要的:如果門被打開,啓動計時器10秒鐘。然後,10秒後發出聲音報警。如果門關閉,請關閉警報。永遠重複。 – jacoblaw

回答

3

如果你想有一個非常簡單的答案,這將是最好有一些跟蹤器每秒更新。

seconds_open = 0 
while True: 
    if gpio.output(door): 
     seconds_open += 1 
     if seconds_open == 10: 
      gpio.output(buzzer, True) 
    else: 
     gpio.output(buzzer, False) 
     seconds_open = 0 

    time.sleep(1) 

注意:當您關上門時,蜂鳴器會在第二個標記處關閉,因此它可能會稍微延遲。您始終可以通過更改睡眠的增量和持續時間來提高準確度。或者你可以使用Gyppo的線程回答。編輯:Gyppo指出,如果你決定使用浮點睡眠/計數器,你需要改變if語句爲:

if seconds_open >= 10: 
+0

非常感謝!您的追蹤器想法非常棒! – Draenokh

+1

這很好,很簡單,但如果您使用分秒(浮點)睡眠時間,則可能需要測試'if seconds_open> = 10'。 – Samizdis

+0

@Gyppo是的,的確如此。我會將其添加到註釋中。 – xNinjaKittyx

1

我不認爲sleep聲明正在做你想做的事。目前,只要您打開門,sleep計時器開始工作,10秒鐘後蜂鳴器響起(即使您關閉了門)。 Python逐行執行代碼,直到等待10秒後才進入gpio.output(buzzer, True)(然後返回到循環的開始處)。在那10年中,Python沒有做其他任何事情,sleep是一個'阻塞'功能。

這可能是值得看看threading,它有一個'非阻塞'睡眠Timer。你可能有這樣的事情

while True: 
    if door_is_open: 
     Timer(10.0, buzz_if_still_open).start() 

在那裏你也有:

def buzz_if_still_open(): 
    if door_is_still_open: 
     buzz() 

使用threadingTimer,Python會繼續快樂地繼續圍繞主while True循環和功能buzz_if_still_open將運行10秒後。 (此代碼仍然會發出蜂鳴聲,如果你趕緊關上了門,然後打開它,固定被作爲練習留給讀者:P)

1

你可以嘗試使用多個while循環:

while True: 
    if gpio.output(door): 
     time.sleep(10) 
     if gpio.output(door): 
      gpio.output(buzzer, True) 
      while True: 
       if not gpio.output(door): 
        gpio.output(buzzer, False) 
        break 
     else: 
      gpio.output(buzzer, False) 
    else: 
     gpio.output(buzzer, False) 

這可以通過測試門是否打開來工作,等待10秒鐘。如果它仍然打開,蜂鳴器就會熄滅,然後進入循環,直到門關閉,從而脫離循環。

編輯: 添加else聲明儘可能修復

+0

這段代碼似乎不起作用。只要我開始程序,蜂鳴器就會熄滅。 – Draenokh

+0

此代碼不起作用。如果在這10秒鐘內任何時候門被關閉,如果最後的門狀態打開,蜂鳴器仍會熄滅。 – xNinjaKittyx

+0

現在,如果在10秒內門關閉,蜂鳴器應該關閉並返回主循環 –