Raspberry Pi / GPIO.RISING запускает обратный вызов на .BOTH

У меня есть Raspberry Pi с Raspbian через NOOBS. У меня есть кнопка, подключенная к контактам 1 и 11. Я пытаюсь использовать GPIO .add_event_detect и RPIO.RISING для вызова функции при нажатии кнопки. (Обратный вызов включает светодиод на 2 секунды, а затем выключает его.)

Я обнаружил, что функция RPIO.RISING вызывает обратный вызов как при нажатии кнопки (контакт 11 переходит от 0 до 1), так и при отпускании кнопки (контакт 11 переходит от 1 до 0). Свет включается дважды, точно так же, как если бы я использовал RPIO.BOTH.

Я не думаю, что это проблема гистерезиса/зашумленного сигнала, потому что я могу нажать кнопку на много секунд, а затем отпустить и снова увидеть вызов обратного вызова.

Вот пример кода:

import RPi.GPIO as GPIO ## Import GPIO library
import time

#configure all of the inputs / outputs properly
def config():

 #initalize the GPIO pin numbering
 GPIO.setmode(GPIO.BOARD) ## Use board pin numbering

 #setup output pins
 GPIO.setup(8, GPIO.OUT) ## Setup GPIO Pin 7 to OUT
 GPIO.setup(10,GPIO.OUT)
 GPIO.setup(12,GPIO.OUT)

 #initialize the inputs for the button
 GPIO.setup(11, GPIO.IN)

 #create the button-watching function
 GPIO.add_event_detect(11, GPIO.RISING, callback=execute_lights, bouncetime=800)

#the light-turning-on function. One press turns yellow. Second press turns green, then off.
def execute_lights(channel):
 print "executing lights: "

 #Turn on the light we want
 GPIO.output(8,True)
 #turn green off after 2 seconds
 time.sleep(2)
 GPIO.output(8,False)

Есть ли программный обходной путь, который я могу использовать для решения этой проблемы?


person Mike Kijewski    schedule 01.07.2015    source источник


Ответы (1)


По какой-то причине реализация bounctime очень странная. Если вы удерживаете и отпускаете кнопку В ТЕЧЕНИЕ установленного времени возврата 800 мс, все должно работать нормально. Если вы держите его дольше, то иногда вы будете срабатывать при выпуске. У меня была та же проблема, я думал, что «bounctime» — это время, когда «система» игнорировала все другие входные данные… например, время «установки» для переключения. Это не. Так что, пока вы нажимаете и отпускаете кнопку В ТЕЧЕНИЕ установленного времени возврата, все должно работать нормально.

Ник

person Nick Gibson    schedule 14.12.2015