2016-06-30 27 views
2

ich ein Tutorial folgenden wurde hier gefunden: https://www.linkedin.com/pulse/prepare-your-raspberry-pi-work-aws-iot-kay-lerchRaspberry Pi Runtime: Widersprüchliche Kantenerkennung bereits für diesen Kanal GPIO aktiviert

Ich habe nicht einmal das Internet Teil davon begonnen als ich Probleme mit der Schaltung. Ich verdrahtete meine Schaltung, wie es in diesem Diagramm unten mit meinem Raspberry Pi 3 dargestellt ist. enter image description here

Ich schrieb dann das folgende Python-Skript, wie im Tutorial gezeigt.

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

Diese drucken soll „Taste gedrückt“, wenn ich auf den Knopf drücken, aber ich erhalte die folgenden Laufzeitfehler:

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 

Ich habe RPi.GPIO Version 0.6.2, die die neueste Version ist auf die Zeit von diesem Post. Ich würde jede Hilfe schätzen, die jemand zur Verfügung stellen kann.

Antwort

2

Der Code, den Sie haben, fügt einen Ereigniserkennungsrückruf ständig hinzu (in der Schleife while(True)). Sie möchten den Ereigniserkennungsrückruf einmal hinzufügen und dann auf eine Kante warten. Diese page hat ein gutes Beispiel, das Sie vielleicht durchlaufen möchten.

Alternativ könnten Sie versuchen, so etwas wie:

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 Antwort hat das Problem, dass das Programm beendet, nachdem die erste Taste drücken. Da der Autor eine ewige Schleife erwähnt, würde Ich mag folgendes vorzuschlagen:

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

Wenn die Taste gedrückt wird und ein Ereignis erkannt wird, wird die Variable event gelöscht wird. Daher wird die add_event_detect-Funktion nicht zweimal hintereinander aufgerufen.

Zusätzlich werden zwei Dinge:

  1. auf Ihrem Setup Je würde ich einen Pull-up-Widerstand verwenden. Ein Pulldown-Setup ist anfälliger für Rauschen und eine Induktionsflanke von irgendwo kann als ein Knopfdruck interpretiert werden.
  2. Obwohl dies ist nicht Best Practice: Wenn Ihr Setup ist wirklich klein (wie in der RPi-Fall) und Sie nicht versehentlich setzen gpio.OUT und Sie haben nur einen Druckknopf, könnten Sie in Betracht ziehen, nur die Build- im Pull-up-Widerstand und schließen Sie den Druckknopf direkt an GND: GND --/ -- GPIO.IN (und dann für gpio.FALLING erkennen).