Я программирование python RPi. Я использую «wait for edge» для подсчета выходного сигнала датчика Холла для 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 никогда не проверяет предложение выхода, и программа останавливается. Как я могу гарантировать, чтобы вырваться на endTime, даже когда pulse = 0? Благодарю.
Вы должны будете использовать темы, если 'wait_for_edge' никогда не возвращается или стойлах из. Посмотрите, есть ли у него параметр тайм-аута, если нет, посмотрите на потоки. В конечном счете, вы должны создать поток, а затем проверить его в промежутках до нужного тайм-аута и затем отменить поток, если он превышает ваше окно таймаута. https://pymotw.com/2/threading/ –
Я думаю, что здесь я должен возглавить. Существует альтернативная функция: «GPIO.add_event_detect (24, GPIO.RISING, callback = my_callback)», который управляет маршрутизатором в my_callback всякий раз, когда он выполняется. Думаю, это может содержать функцию приращения? –
Нет, см. Ответ. Он имеет параметр таймаута. Проверьте ответ @ natecat (Спасибо). –