【问题标题】:Raspberry Pi RuntimeError: Conflicting edge detection already enabled for this GPIO channelRaspberry Pi RuntimeError:已为此 GPIO 通道启用冲突边缘检测
【发布时间】:2016-11-02 15:55:48
【问题描述】:

我正在关注此处找到的教程: https://www.linkedin.com/pulse/prepare-your-raspberry-pi-work-aws-iot-kay-lerch

我什至还没有开始它的互联网部分,因为我遇到了电路问题。我使用我的树莓派 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,这是本文发布时的最新版本。任何人都可以提供任何帮助,我将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    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)。

    【讨论】:

      【解决方案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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多