22

Raspberry Pi の GPIO ピンと PIR センサーを使用してモーションを検出しています。センサーがモーションを検出したら、ソフトウェアを他の機能に移動したいと考えています。

現時点では、モーションを検出するために、モーションが検出されるのを待っている間、プログラムを常にループで実行しています。これは現時点では機能しますが、将来的に使用するには非常に非効率的であり、イベントに割り当てることでこれを改善したいと考えています.

手動でループを実行せずに、プログラムによって検出されたイベントに GPIO 入力をバインドする方法はありますか。

モーションを検出するための現在のループは次のとおりです。

var = 1
counter = 0
while var == 1:
    if GPIO.input(7):
        counter += 1
        time.sleep(0.5)
    else:
        counter = 0
        time.sleep(1)

    if counter >= 3:
        print "Movement!"
        captureImage()
        time.sleep(20)

カウンターとモーションの複数回の検出は、センサーが検出する誤検知の数を減らすために使用されます。

4

4 に答える 4

1

GPIO コードを独自のスレッドにラップし、GPIO が入力を待っている間、プログラムの残りの部分に別の処理をさせることができます。スレッド化モジュールをチェックしてください

まず、コードを関数にラップします

def wait_input():
    var=1
    counter = 0
    while var == 1:
        if GPIO.input(7):
            counter += 1
        time.sleep(0.5)
        else:
            counter = 0
            time.sleep(1)
        if counter >= 3:
            print "Movement!"
            captureImage()
            time.sleep(20)

そして、メインプログラムでは、次のようなことができます

input_thread = threading.Thread(target = wait_input)
input_thread.start()
# do something in the meanwhile
input_thread.join()

SO には Python スレッドに関する質問がたくさんあるので、掘り下げてみてください。スレッドを使用する際には、考慮すべきことがたくさんあることに注意してください。特に、一度に 1 つのプロセスしか実行できないグローバル インタープリター ロック (GIL) を持つ Python では注意が必要です。GIL を迂回できるマルチプロセッシング モジュールをチェックするのも賢明かもしれません。

于 2013-04-22T09:44:54.753 に答える