Raspberry Pi RuntimeError: Conflicting edge detection already enabled for this GPIO channel
Raspberry Pi RuntimeError: Conflicting edge detection already enabled for this GPIO channel
我正在按照此处找到的教程进行操作:
https://www.linkedin.com/pulse/prepare-your-raspberry-pi-work-aws-iot-kay-lerch
我什至还没有开始它的互联网部分,因为我的电路有问题。我使用我的 raspberry pi 3 连接我的电路,如下图所示。
然后我编写了以下 python 脚本,如教程中所示。
import RPi.GPIO as gpio
gpio.setmode(gpio.BOARD)
gpio.setup(7, gpio.IN, pull_up_down=gpio.PUD_DOWN)
def on_pushdown(channel):
print "Button Pushed."
while(True):
gpio.add_event_detect(7, gpio.RISING, callback=on_pushdown, bouncetime=200)
gpio.cleanup()
当我按下按钮时,这应该打印出 "Button Pushed",但我收到以下运行时错误:
Traceback (most recent call last):
File "button.py", line 10, in <module>
gpio.add_event_detect(7, gpio.RISING, callback=on_pushdown, bouncetime=200)
RuntimeError: Conflicting edge detection already enabled for this GPIO channel
我有 RPi.GPIO 版本 0.6.2,这是当时 post 的最新版本。如果有人能提供任何帮助,我将不胜感激。
您的代码不断添加事件检测回调(在 while(True)
循环中)。你想要的是添加一次事件检测回调,然后等待边缘。
这个 page 有一个很好的例子,你可能想看看。
或者,您可以尝试类似的操作:
import RPi.GPIO as gpio
gpio.setmode(gpio.BOARD)
gpio.setup(7, gpio.IN, pull_up_down=gpio.PUD_DOWN)
def on_pushdown(channel):
print "Button Pushed."
# only add the detection call once!
gpio.add_event_detect(7, gpio.RISING, callback=on_pushdown, bouncetime=200)
while(True):
try:
# do any other processing, while waiting for the edge detection
sleep(1) # sleep 1 sec
finally:
gpio.cleanup()
回答有第一次按下按钮后程序退出的问题。由于作者提到了一个永恒的循环,我提出以下建议:
#!/usr/bin/python3
import RPi.GPIO as gpio
import time
pin = 7
def on_pushdown(channel):
print "Button Pushed."
try:
# Setting GPIO layout
gpio.setmode(gpio.BOARD)
# Set pin as input pin pulled down to GND
gpio.setup(pin, gpio.IN, pull_up_down=gpio.PUD_DOWN)
while True:
if not 'event' in locals():
event = gpio.add_event_detect(pin, gpio.RISING, callback=on_pushdown, bouncetime=200)
else:
time.sleep(1)
finally:
gpio.cleanup()
如果按下按钮并检测到事件,则正在删除变量 event
。因此,add_event_detect
-函数不会连续调用两次。
另外两件事:
- 根据您的设置,我会使用上拉电阻。下拉设置更容易产生噪音,来自某处的感应侧面可能会被解释为按下按钮。
- 虽然这不是最佳实践:如果您的设置非常小(比如在 RPi 机箱内)并且您没有意外设置
gpio.OUT
,您只需有一个按钮,你可以考虑只带内置上拉电阻并将按钮直接连接到GND:GND --/ -- GPIO.IN
(然后检测gpio.FALLING
)。
我正在按照此处找到的教程进行操作: https://www.linkedin.com/pulse/prepare-your-raspberry-pi-work-aws-iot-kay-lerch
我什至还没有开始它的互联网部分,因为我的电路有问题。我使用我的 raspberry pi 3 连接我的电路,如下图所示。
然后我编写了以下 python 脚本,如教程中所示。
import RPi.GPIO as gpio
gpio.setmode(gpio.BOARD)
gpio.setup(7, gpio.IN, pull_up_down=gpio.PUD_DOWN)
def on_pushdown(channel):
print "Button Pushed."
while(True):
gpio.add_event_detect(7, gpio.RISING, callback=on_pushdown, bouncetime=200)
gpio.cleanup()
当我按下按钮时,这应该打印出 "Button Pushed",但我收到以下运行时错误:
Traceback (most recent call last):
File "button.py", line 10, in <module>
gpio.add_event_detect(7, gpio.RISING, callback=on_pushdown, bouncetime=200)
RuntimeError: Conflicting edge detection already enabled for this GPIO channel
我有 RPi.GPIO 版本 0.6.2,这是当时 post 的最新版本。如果有人能提供任何帮助,我将不胜感激。
您的代码不断添加事件检测回调(在 while(True)
循环中)。你想要的是添加一次事件检测回调,然后等待边缘。
这个 page 有一个很好的例子,你可能想看看。
或者,您可以尝试类似的操作:
import RPi.GPIO as gpio
gpio.setmode(gpio.BOARD)
gpio.setup(7, gpio.IN, pull_up_down=gpio.PUD_DOWN)
def on_pushdown(channel):
print "Button Pushed."
# only add the detection call once!
gpio.add_event_detect(7, gpio.RISING, callback=on_pushdown, bouncetime=200)
while(True):
try:
# do any other processing, while waiting for the edge detection
sleep(1) # sleep 1 sec
finally:
gpio.cleanup()
#!/usr/bin/python3
import RPi.GPIO as gpio
import time
pin = 7
def on_pushdown(channel):
print "Button Pushed."
try:
# Setting GPIO layout
gpio.setmode(gpio.BOARD)
# Set pin as input pin pulled down to GND
gpio.setup(pin, gpio.IN, pull_up_down=gpio.PUD_DOWN)
while True:
if not 'event' in locals():
event = gpio.add_event_detect(pin, gpio.RISING, callback=on_pushdown, bouncetime=200)
else:
time.sleep(1)
finally:
gpio.cleanup()
如果按下按钮并检测到事件,则正在删除变量 event
。因此,add_event_detect
-函数不会连续调用两次。
另外两件事:
- 根据您的设置,我会使用上拉电阻。下拉设置更容易产生噪音,来自某处的感应侧面可能会被解释为按下按钮。
- 虽然这不是最佳实践:如果您的设置非常小(比如在 RPi 机箱内)并且您没有意外设置
gpio.OUT
,您只需有一个按钮,你可以考虑只带内置上拉电阻并将按钮直接连接到GND:GND --/ -- GPIO.IN
(然后检测gpio.FALLING
)。