GPIO.input в цикле while без сна
Мне нужно быстро поймать импульс GPIO в цикле while
while True:
if GPIO.input(11) == 1:
sys.exit(0)
импульс настолько велик (магнит, проходящий через переключатель), что если я добавлю сон в то время, просто даже .5
, в некоторых случаях это пропустит значение. Без одного, даже с внутренним раскрывающимся списком, он мгновенно получит случайную ложь 1. Есть ли способ удалить сон и сделать его надежным? Может ли это решить что-то внешнее раскрытие?
3 ответа
Опрос для ввода на любом языке является плохим решением.
Python упрощает перехват прерываний, например.
# set an interrupt on a falling edge and wait for it to happen
GPIO.wait_for_edge(INT, GPIO.FALLING)
ПРИМЕЧАНИЕ. Это блокирует процесс, пока не произойдет прерывание, поэтому лучше всего сделать это в фоновом режиме.
Любая библиотека GPIO, которую вы решите использовать, почти наверняка обеспечит возможность прерывания.
Используйте эту возможность прерывания, чтобы сообщить вам, когда уровень GPIO изменяется от 0 до 1 (передний фронт), или от 1 до 0 (задний фронт) или при каждом изменении.
Кстати, я использовал датчики эффекта Холла для обнаружения магнитов, вращающихся на валу со скоростью около 9000 об /мин (из памяти).
В зависимости от приложения вы можете рассмотреть аппаратное решение. Вы можете обнаружить очень короткий импульс и использовать его для запуска моностабильности, которая связывается с Pi. Внешние аппаратные средства могут выполнять обработку сигналов и справляться с такими вещами, как контакт-отскок в коммутаторах. Насколько чистый ваш входной сигнал?