私は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で壊れることをどうすれば保証できますか?ありがとう。
を抜け出すためにendTimeのまで待つ作るためにあなたのタイムアウトとして
(endTime-time.time())*1000
を使用することができます。それがタイムアウトパラメータを持っているかどうかを調べ、そうでなければスレッディングを調べます。 最終的には、スレッドを作成し、それを希望のタイムアウトまで間隔でチェックしてから、タイムアウト・ウィンドウを超えた場合はスレッドをキャンセルします。 https://pymotw.com/2/threading/ –私はこれが私が頭を下げる必要があると思います。代わりの機能があります: 'GPIO.add_event_detect(24、GPIO.RISING、callback = my_callback)'アクションが実行されるたびにmy_callbackのroutienがそのアクションを行います。私はインクリメント機能を含むことができると思いますか? –
ナアは答えを見ます。タイムアウトパラメータがあります。 Check @ natecatの答え(ありがとう)。 –