2016-06-30 63 views
2

我下面的教程已经启用冲突的边缘检测发现这里: https://www.linkedin.com/pulse/prepare-your-raspberry-pi-work-aws-iot-kay-lerch树莓派RuntimeError:此GPIO通道

我还没有开始为我是有电路问题,它的网络的一部分。我使用我的覆盆子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

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