Как отключить событие Raspberry Pi GPIO на определенный период времени после его запуска в Python? - PullRequest
2 голосов
/ 30 апреля 2020

Я создаю событие всякий раз, когда вывод GPIO моего Raspberry Pi имеет спадающий фронт. Однако я хочу отключить это событие на определенное время (например, 5 секунд) после каждого его запуска. Я хочу, чтобы событие было снова включено после этого периода времени.

Моей первой мыслью было просто использовать sleep(5) в фактической функции события. Но я считаю, что это не сработает из-за запуска события в отдельном потоке.

Может ли кто-нибудь указать мне правильное направление на то, что я пытаюсь выполнить sh? Это не так просто, как я себе представлял.

import RPi.GPIO as GPIO                   
import time
from time import sleep

# wait 1 second at startup
sleep(1)

# event function
def event(ev=None):
        print("Event was triggered! Should not run again for 5 seconds.")
        # sleep(5)

# initialize GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

# setup the pin and the event
GPIO.setup(21, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.add_event_detect(21, GPIO.FALLING, callback=event)



while 1:
        continue

1 Ответ

1 голос
/ 30 апреля 2020

Существует эффект отказов переключателя , который происходит, когда мы используем простые дешевые кнопки с двумя контактами, подключенными к GPIO.

Во время нажатия и нажатия происходит много аналоговых вещей, которые не принадлежат цифровому домену.

Существует два способа устранения этих отказов:

  • аппаратный способ (добавление фильтров R C)
  • программный способ - ожидание некоторое время для фильтрации этих аналоговых мировых эффектов (это может быть «фиктивная задержка», «использование конечных автоматов», «прерывание временного отключения»)

Fortunaly python Библиотека GPIO поддерживает реализацию программного обеспечения для debouncing.

Когда вы определяете обратный вызов для такого «прерывания», вы можете указать время, в течение которого слушатель go не будет слышать никаких изменений на указанном выводе.

На самом деле не имеет значения, используете ли вы «плохая» (шумная) кнопка или нет. Вы можете использовать эту встроенную функцию подавления для достижения того, что вам нужно:

GPIO.add_event_detect(21, GPIO.FALLING, callback=event, bouncetime=5000 )
...