Vineet Shah
Vineet Shah

Reputation: 979

Raspberry Pi RuntimeError: Conflicting edge detection already enabled for this GPIO channel

I was following a tutorial found here: https://www.linkedin.com/pulse/prepare-your-raspberry-pi-work-aws-iot-kay-lerch

I have not even begun the internet part of it as I was having issues with the circuit. I wired my circuit just like it is shown in this diagram below using my raspberry pi 3. enter image description here

I then wrote the following python script as shown in the tutorial.

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

This should print out "Button Pushed" when I push the button but I get the following runtime error:

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

I have RPi.GPIO version 0.6.2 which is the latest version at the time o fthis post. I would appreciate any help that anyone can provide.

Upvotes: 3

Views: 17893

Answers (2)

Suuuehgi
Suuuehgi

Reputation: 4990

Doddie's answer has the problem that the program exits after the first button press. Since the author mentioned an eternal loop, I would like to propose the following:

#!/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()

If the button is pressed and an event is detected, the variable event is being deleted. Hence, the add_event_detect-function is not called twice in a row.

Additionally two things:

  1. Depending on your setup, I would use a pull-up resistor. A pull-down setup is more prone to noise and an induction flank from somewhere might be interpreted as a button press.
  2. Although this is not best practice: If your setup is really small (like inside the RPi case) and you don't accidentally set gpio.OUT and you just have a push button, you might consider to just take the build-in pull-up resistor and directly connect the push button to GND: GND --/ -- GPIO.IN (and then detect for gpio.FALLING).

Upvotes: 0

Doddie
Doddie

Reputation: 1423

The code you have is adding an event detection callback constantly (in the while(True) loop). What you want is to add the event detection callback once and then wait for an edge.

This page has a good example you might want to go through.

Alternatively, you could try something like:

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

Upvotes: 4

Related Questions