2016-04-22 5 views
1

Я программирование 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? Благодарю.

+0

Вы должны будете использовать темы, если 'wait_for_edge' никогда не возвращается или стойлах из. Посмотрите, есть ли у него параметр тайм-аута, если нет, посмотрите на потоки. В конечном счете, вы должны создать поток, а затем проверить его в промежутках до нужного тайм-аута и затем отменить поток, если он превышает ваше окно таймаута. https://pymotw.com/2/threading/ –

+0

Я думаю, что здесь я должен возглавить. Существует альтернативная функция: «GPIO.add_event_detect (24, GPIO.RISING, callback = my_callback)», который управляет маршрутизатором в my_callback всякий раз, когда он выполняется. Думаю, это может содержать функцию приращения? –

+0

Нет, см. Ответ. Он имеет параметр таймаута. Проверьте ответ @ natecat (Спасибо). –

ответ

3

use the timeout parameter так что он будет так долго ждать. Например, этот код будет ждать только 1 секунду до выхода из цикла.

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

Вы также можете использовать (endTime-time.time())*1000 в качестве тайм-аута, чтобы подождать, пока EndTime не выбиться

+0

Отлично, отлично работает. Теперь мне нужно избегать возврата 1 вместо правильного 0, так как после таймаута он все еще увеличивает «импульс». –

+0

Если вы посмотрели мою ссылку, они на самом деле показывают пример того, как проверить, произошло ли тайм-аут или обнаружено ребро. – Natecat

 Смежные вопросы

  • Нет связанных вопросов^_^