RPi.GPIO.wait_for_edge (4, GPIO.FALLING) обнаруживает как нажатие, так и отпускание кнопки - PullRequest
0 голосов
/ 05 декабря 2018

Я прочитал документацию по RPi.GPIO и искал в Google, а также в SO, но не могу найти решения, что, вероятно, является очень глупой проблемой.Я пытаюсь ТОЛЬКО обнаружить край нажатой кнопки.Но независимо от того, указываю ли я на поиск «падающего» или «нарастающего» фронта, Pi выполнит команду как при нажатии, так и при отпускании моей кнопки.Иногда он выполняет код несколько раз.Мой код:

import RPi.GPIO as GPIO

buttonPin = 4                 # this is the pin for the button
GPIO.setmode(GPIO.BCM)                 # pinmode
GPIO.setup(buttonPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)                 #setting up my pin to be input w/ pullup resistor

if __name__ == '__main__':
    while True:                 # loop
        GPIO.wait_for_edge(buttonPin,GPIO.RISING)                 # looking for a rising edge
        print('Edge detected')                 # this happens regardless of my button being pressed or released

Я уверен, что мне здесь не хватает чего-то фундаментального, любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Вы можете решить это программно с помощью параметра bouncetime, но вы должны использовать

GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback, bouncetime=200)

или

GPIO.add_event_callback(channel, my_callback, bouncetime=200)

вместо GPIO.wait_for_edge(channel,GPIO.RISING)

или с дополнительным оборудованием: добавьте конденсатор 0,1 мкФ через коммутатор,

, или вы можете использовать комбинацию обоих.

Подробнее в Документация

Мир

0 голосов
/ 05 декабря 2018

Ваш код в основном в порядке, но вам нужны некоторые аппаратные знания ...

С обычными переключателями и кнопками есть вещь, называемая джиттером.

Одним из решений является проверка состояния кнопки через короткий промежуток времени, обычно через несколько миллисекунд, и действие, основанное на задержанном результате.

...