Raspberry Pi RuntimeError: La detección de bordes en conflicto ya está habilitada para este canal GPIO

Estaba siguiendo un tutorial encontrado aquí: https://www.linkedin.com/pulse/prepare-your-raspberry-pi-work-aws-iot-kay-lerch

Ni siquiera he empezado la parte de Internet porque tenía problemas con el circuito. Conecté mi circuito tal como se muestra en este diagtwig a continuación usando mi raspberry pi 3. introduzca la descripción de la imagen aquí

Luego escribí el siguiente script de Python como se muestra en el 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() 

Esto debería imprimir “Botón pulsado” cuando presiono el botón pero aparece el siguiente error de tiempo de ejecución:

 Traceback (most recent call last): File "button.py", line 10, in  gpio.add_event_detect(7, gpio.RISING, callback=on_pushdown, bouncetime=200) RuntimeError: Conflicting edge detection already enabled for this GPIO channel 

Tengo la versión 0.6.2 de RPi.GPIO, que es la última versión en el momento de esta publicación. Agradecería cualquier ayuda que alguien pueda proporcionar.

    El código que tiene es agregar una callback de detección de eventos constantemente (en el ciclo while(True) ). Lo que desea es agregar la callback de detección de eventos una vez y luego esperar un borde.

    Esta página tiene un buen ejemplo por el que deberías pasar.

    Alternativamente, puedes probar algo como:

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

    La respuesta de Doddie tiene el problema de que el progtwig sale después de presionar el primer botón. Como el autor mencionó un bucle eterno, me gustaría proponer lo siguiente:

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

    Si se presiona el botón y se detecta un evento, el event variable se está eliminando. Por lo tanto, add_event_detect -function no se llama dos veces seguidas.

    Además dos cosas:

    1. Dependiendo de su configuración, usaría una resistencia pull-up. Una configuración desplegable es más propensa al ruido y un flanco de inducción de algún lugar puede interpretarse como una pulsación de un botón.
    2. Aunque esta no es la mejor práctica : si la configuración es realmente pequeña (como dentro del estuche RPi) y no configura accidentalmente gpio.OUT y solo tiene un botón, puede considerar simplemente tomar el gpio.OUT arriba la resistencia y conecte directamente el botón pulsador a GND: GND --/ -- GPIO.IN (y luego detecte gpio.FALLING ).