2017-07-11 7 views
0

私のラズベリーパイのブザープログラムを作成しました。私はセキュリティのためのプログラムを望んでいる:私のドアが長すぎる(私のドアが磁気センサーを持っている)場合、ブザーが鳴ります。ドアが閉じられるとブザーが止まります。しかし、ブザーが鳴る前に、ブザーに時間がかかる(time.sleep(10))ことがわかった。私のコードが停止する前にifステートメントをループするようです。ドアが閉まるとすぐにブザーを止めて欲しい。誰かが私のコードを教えてくれますか?Piのブザーシステムでelse文を入力した場合

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) 

注:ドアを閉じると、2番目のマークでブザーがオフになるため、少し遅れることがあります。睡眠の増加と持続時間を変えることで、常に正確さを増すことができます。あるいは、Gyppoの答えをスレッドを使って使うこともできます。編集:Gyppoは、浮動小数点のスリープ/カウンターを使用することに決めた場合、ifステートメントを次のように変更する必要があると指摘しました。

+0

ありがとうございました!あなたのトラッカーのアイデアは素晴らしいです! – Draenokh

+1

これは素敵でシンプルですが、split-second(浮動小数点)スリープ時間を使用している場合は、 'if seconds_open> = 10'をテストしたいことがあります。 – Samizdis

+0

@Gyppoはい、そうです。私はノートにそれを追加します。 – xNinjaKittyx

1

私はsleepの文章が欲しいとは思いません。現時点では、ドアを開くとすぐにsleepタイマーが始まり、10秒後にブザーが鳴ります(ドアを閉めてからでも)。 Pythonはコードを1行ずつ順番に実行し、10秒待ってからgpio.output(buzzer, True)に進みます(そして、ループの始めに戻ります)。その間に、Pythonは何もしていませんが、sleepは 'ブロック'機能です。

Timerと呼ばれる「非ブロッキング」スリープを持つthreadingを調べる価値があります。あなたはまた、持っている

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秒間閉じた場合、ブザーをオフにしてメインに戻ります。ループ –

関連する問題