2016-05-06 10 views
0

私は2つの振動センサーを検出するPythonスクリプトでこの機能を持っていますが、問題はセンサーが非常に敏感であるためです。どのように私はそれらの両方が同時に検出されるのを止めるだろうか?私はどちらが最初であったかを検出したい。これは私が試したことです -pythonで2つのセンサーが同時に検出されないようにスクリプトを一時停止するにはどうすればよいですか?

#!/usr/bin/env python 
import RPi.GPIO as GPIO 
from time import sleep 

def setup(): 
    GPIO.setmode(GPIO.BOARD)   
    GPIO.setup(KnockPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) 
    GPIO.setup(ShockPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) 

def shock(): 
    print('shock') 

def knock(): 
    print('knock') 

def register_callbacks(): 
    if GPIO.add_event_detect(ShockPin, GPIO.FALLING, callback=shock, bouncetime=5000): 
     sleep(5) 
    elif GPIO.add_event_detect(KnockPin, GPIO.FALLING, callback=knock, bouncetime=5000): 
     sleep(5) 

if __name__ == '__main__': 
    try: 
     setup() 
     register_callbacks() 
+0

スニペットがうまく見えます。あなたのコードは動作しますか?そうでない場合は、エラーメッセージまたは望ましくない動作は何ですか? –

+0

両方のセンサーが同時に検出することを除いて、Yaコードが機能します。どちらか一方を検出したいだけです。 –

+0

最後のイベントの時間を節約する変数を追加し、最後のイベントが5秒以上前であればノック/ショックをチェックインするのはどうですか? –

答えて

1

私はそれをテストするためのセットアップはありません。最後のイベントの時刻を(datetimeを使用して)保存し、最後のイベントが5秒以上前であるかどうかを確認します。

import datetime 
sensor_delay = 5 #delay in seconds 
last_event = datetime.datetime.now() 

def shock(): 
    global last_event 
    if datetime.datetime.now() > last_event + datetime.timedelta(seconds=sensor_delay): 
     print ('shock') 
     last_event = datetime.datetime.now() 

def knock(): 
    global last_event 
    if datetime.datetime.now() > last_event + datetime.timedelta(seconds=sensor_delay): 
     print('knock') 
     last_event = datetime.datetime.now() 
+0

ありがとう@Ashafix、私はこれを行こう! –

+1

もう一度チップに感謝しますが、私は同じ問題を抱えています。センサがノックしたり衝撃を受けたりすると、両方のセンサが登録されます。センサーは開始時から5秒間検出されますが、 5秒間、ハードに叩かれた場合、両方を検出するという私の元の問題に戻ります。レジスタコールバック関数にこれを追加する必要があるかもしれませんか? –

+0

まあ、愚かだった、last_eventはグローバルでなければならない、https://docs.python.org/3/reference/simple_stmts.html#global –

関連する問題