2016-04-22 11 views
1

私はRPiをプログラミングするPythonです。私は2つの磁石が取り付けられたフライホイールのRPMのためのホールセンサー出力をカウントするために 'エッジを待つ'を使用しています。 rpmルーチンは次のようになります。Python:時間の経過後にwhileループを中断する

# Imports 
import RPi.GPIO as GPIO 
import time 

# Set GPIO Mode as BCM 
GPIO.setmode(GPIO.BCM) 
GPIO.setup(17 , GPIO.IN)   # Hall sensor attached to GPIO 17 

def rpm(): 
    pulse = 0     # Reset pulse counter 
    endTime = time.time()+1  # Calculate end time in 1 second 
    while time.time() < endTime: # Loop while time is less than end time 
     GPIO.wait_for_edge(17, GPIO.FALLING) # Wait for a falling edge 
     pulse += 1    # Increment pulse 
    pulse = str((pulse*60)/2) # Calculate for pulse per minute 
    return pulse     # Return the 'RPM' 

if __name__ == "__main__": 
    print("You ran this module directly (and did not import it.") 
    input("\n\nPress the enter key to exit.") 

ホイールが回転してエッジがトリガされたときにコードは正常に機能します。問題は、ホイールが停止し、エッジがトリガされないときです。whileループはexit節とプログラムが停止することを決して確認しません。 pulse = 0の時でもendTimeで壊れることをどうすれば保証できますか?ありがとう。

+0

を抜け出すためにendTimeのまで待つ作るためにあなたのタイムアウトとして(endTime-time.time())*1000を使用することができます。それがタイムアウトパラメータを持っているかどうかを調べ、そうでなければスレッディングを調べます。 最終的には、スレッドを作成し、それを希望のタイムアウトまで間隔でチェックしてから、タイムアウト・ウィンドウを超えた場合はスレッドをキャンセルします。 https://pymotw.com/2/threading/ –

+0

私はこれが私が頭を下げる必要があると思います。代わりの機能があります: 'GPIO.add_event_detect(24、GPIO.RISING、callback = my_callback)'アクションが実行されるたびにmy_callbackのroutienがそのアクションを行います。私はインクリメント機能を含むことができると思いますか? –

+0

ナアは答えを見ます。タイムアウトパラメータがあります。 Check @ natecatの答え(ありがとう)。 –

答えて

3

use the timeout parameterですので、それほど長く待つことはありません。たとえば、このコードはループを中断する前に1秒間だけ待機します。

GPIO.wait_for_edge(17, GPIO.FALLING, timeout = 1000) 

また、それはあなたが `wait_for_edge`は返さないか、アウトストールない場合は、スレッドを使用する必要があります

+0

偉大な、うまく動作します。私は今、正しい0の代わりに1を返すのを避ける必要があります。それは、 'pulse'をインクリメントするタイムアウトに従います。 –

+0

私のリンクを見ると、タイムアウトが発生したかエッジが検出されたかどうかをテストする方法の例が実際に表示されます。 – Natecat

関連する問題