Raspberry Pi RuntimeError:此GPIO通道已启用冲突边缘检测

时间:2016-06-30 13:47:37

标签: python python-2.7 raspberry-pi gpio raspberry-pi3

我正在按照这里找到的教程: https://www.linkedin.com/pulse/prepare-your-raspberry-pi-work-aws-iot-kay-lerch

由于我遇到电路问题,我甚至没有开始上网部分。我使用我的覆盆子pi 3就像下图所示连接我的电路。 enter image description here

然后我编写了以下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()

这应打印出来"按钮按下"当我按下按钮但我得到以下运行时错误:

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,这是该帖子发布时的最新版本。我很感激任何人都可以提供帮助。

2 个答案:

答案 0 :(得分:2)

您拥有的代码是不断添加事件检测回调(在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()

答案 1 :(得分:0)

Doddie's回答问题是第一次按下按钮后程序退出。既然作者提到了一个永恒的循环,我想提出以下建议:

#!/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 - 函数不会连续两次调用。

另外两件事:

  1. 根据您的设置,我会使用上拉电阻。下拉式设置更容易产生噪音,某处的感应侧翼可能会被解释为按下按钮。
  2. 虽然不是最佳做法:如果您的设置非常小(例如在RPi内部)并且您不小心设置了gpio.OUT并且您只有一个按钮,您可以考虑只使用内置上拉电阻并将按钮直接连接到GND:GND --/ -- GPIO.IN(然后检测gpio.FALLING)。