2017-07-18 11 views
2

ラズベリーパイにIRセンサーを使用して動きを検出させようとしていて、0.5秒ごとにIRセンサーをポーリングしながら5秒間LEDをオンにします。ここでは...まさにあなたのコードに基づいて正しい動作ですPython:1秒ごとにループを実行し、5秒間トリガー機能を実行します

import RPi.GPIO as GPIO 
import time 

GPIO.setmode(GPIO.BCM) 
PIR_PIN = 18 
GPIO.setup(PIR_PIN, GPIO.IN) 
LED_PIN = 17 
GPIO.setup(LED_PIN, GPIO.OUT) 
def light(): 
    GPIO.output(LED_PIN, GPIO.input(PIR_PIN)) 
    time.sleep(5) 
    GPIO.output(LED_PIN, False) 
try: 
    while True: 
    if GPIO.input(PIR_PIN): 
     print("Motion Detected!") 
     light() 
    time.sleep(0.5) 
except KeyboardInterrupt: 
    GPIO.cleanup() 
+1

マルチスレッドを使用 – Benjamin

答えて

2

私のコードは、これまでのところですが、LEDは再びIRセンサーをチェックする前にオフにすることが待っています。 light() defでブロックされないようにするには、time.sleepのようなブロックステートメントを使用することはできません。この問題を解決するために

一つの方法は、スレッドを使用することです:

from threading import Thread 
import RPi.GPIO as GPIO 
import time 

GPIO.setmode(GPIO.BCM) 
PIR_PIN = 18 
GPIO.setup(PIR_PIN, GPIO.IN) 
LED_PIN = 17 
GPIO.setup(LED_PIN, GPIO.OUT) 
def light(): 
    GPIO.output(LED_PIN, GPIO.input(PIR_PIN)) 
    time.sleep(5) 
    GPIO.output(LED_PIN, False) 
try: 
    while True: 
    if GPIO.input(PIR_PIN): 
     print("Motion Detected!") 
     t = Thread(target=light) # Create thread 
     t.start() # Start thread 
    time.sleep(0.5) 
except KeyboardInterrupt: 
    GPIO.cleanup() 

Threadingは、あなたのプログラムの中で一度に複数のことを実行することができます。これで、スレッド同期が必要な別のワームを開くことができます。

私は、上記のコードを実装する前に、マルチスレッドでのマルチスレッドの読解を強くお勧めします。間違って実行するとスレッド化は非常に危険です。

+0

いいね! light関数でt.stop()を呼び出さなければなりませんか? –

+1

いいえ、あなたはいったんやった、それは完了です。スレッドを外部に停止させるのは、一般的には悪い考えです。スレッドにそのスレッドを実行させ、自分自身を停止させるようにしてください。 – Chris

+0

Ok - 素晴らしいです!ライトが点灯している間にモーションが再び検出された場合、スレッドを再開する方法(またはスリープタイマーと思う)がありますか? –

関連する問題