Abbruch bei Ampelschaltung via Python/GPIO

tklustig

Erfahrenes Mitglied
Hallo Leute, das Messboard ist okay, die Ports 11,13 und 15 sind jeweils ansteuerbar, aber nicht automatisiert durch dieses Script. Wo liegt der Fehler? Warum akzeptiert Python die durch die Kondition erhöhte Portnummer nicht als Parameter? Ich codiere eher mit C#(beruflich) und privat mit PHP bzw. dem Framework yii2. Insofern ist mir Python eher fremd! Ich benötige nur Hilfe für das Pythonscript!
Vorab vielen Dank
Kipp, Thomas
Python:
#Bibliotheken einbinden
import RPi.GPIO as GPIO
import time
import platform
print"Python Version %s:" % platform.python_version()

#GPIO Modus (BOARD / BCM)
GPIO.setmode(GPIO.BOARD)

#Richtung der GPIO-Pins festlegen (IN / OUT)
# 11 aktiviert die blaue Lampe
# 13 aktiviert die rote Lampe
# 15 aktiviert die gruene Lampe

GPIO.setup(11, GPIO.OUT)
y=1
#unendliche Schleife
while True:
    if y==1:
        x=11
    elif y==2:
        x=13
    elif y==3:
        x=15
    elif y==4:
        break
    print("y hat jetzt den Wert: ")+str(y)
    print("Also hat der Port jetzt den Wert:")+str(x)
    time.sleep(3)
    #Pin x HIGH Pegel
    GPIO.output(x, True)
    print("Port %s wurde aktiviert") %x
    #5 Sekunden warten
    print("Es werden 5 Sekunden gewartet")
    time.sleep(5)
    #Pin x LOW Pegel
    GPIO.output(x, False)
    print("Port %s wurde dektiviert") %x
    print("Es werden 5 Sekunden gewartet")
    time.sleep(5)
    y=y+1
    print("y wure inkremeniert")
 

Anhänge

  • error_ampel.JPG
    error_ampel.JPG
    72,6 KB · Aufrufe: 5
Zuletzt bearbeitet:
Hallo tklustig,
die Fehlermeldung sagt doch eigentlich alles:
Code:
  File "blinken.py", line 31, in <module>
    GPIO.output(x, True)
RuntimeError: The GPIO channel has not been set up as an OUTPUT

Du musst die Pins vorher auf Input- oder Output-Modus setzen. Danach kannst du erst lesen/schreiben.
 
Wenn dem so ist, warum wird dann die erste Lampe regulär aus und abgeschaltet, die zweite aber nicht mehr?
Den Screenshot des Verlaufes hatte ich bereits beigefügt. Das ergibt für mich keinen Sinn....
 
Wenn dem so ist, warum wird dann die erste Lampe regulär aus und abgeschaltet, die zweite aber nicht mehr?
Weil du die erste Lampe (an PIN 11) in Zeile 15 korrekt initialisierst. Aber in Zeile 31 willst du dann Output auf einem PIN anlegen, der nicht als Output initialisiert wurde.

Guckst du hier:
You need to set up every channel you are using as an input or an output. To configure a channel as an input:


GPIO.setup(channel, GPIO.IN)


(where channel is the channel number based on the numbering system you have specified (BOARD or BCM)).

Ich würde übrigens empfehlen, diese Bibliothek hier zu verwenden:

https://gpiozero.readthedocs.io/en/stable/index.html
Die wirkt sehr viel anständiger. (Es gibt auch ein paar Worte zur Portierung von RPi.GPIO nach gpiozero)
 
Nun gut. Danke. Folgendes Script funktioniert, alle drei Lampen leuchten. Damit ist zweifelsfrei bewiesen, dass das Messboard und die GPIOs nicht defekt sind. Entweder ist also der Sensor defekt, oder falsch verkabelt. In sofern wären alle Threads, die sich auf meinen Pi beziehen erfolgreich abgeschlossen. Vielen Dank, explizit an Techincon!
LG
Kipp, Thomas
Python:
#Bibliotheken einbinden
import RPi.GPIO as GPIO
import time
import platform
print"Python Version %s:" % platform.python_version()
 
#GPIO Modus (BOARD / BCM)
GPIO.setmode(GPIO.BOARD)
 
#Richtung der GPIO-Pins festlegen (IN / OUT)
# 11 aktiviert die blaue Lampe
# 13 aktiviert die rote Lampe
# 15 aktiviert die gruene Lampe

y=1
#unendliche Schleife
while True:
    if y==1:
        x=11
        GPIO.setup(x, GPIO.OUT)
    elif y==2:
        x=13
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(x, GPIO.OUT)
    elif y==3:
        x=15
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(x, GPIO.OUT)
    elif y==4:
        print("Ampel wird deaktiviert. Die Apllikation damit beendet")
        print("!!!Das Messboard ist nicht beschaedigt!!!!")
        break       
    print("y hat jetzt den Wert: ")+str(y)
    print("Also hat der Port jetzt den Wert:")+str(x)
    time.sleep(3)
    #Pin x HIGH Pegel
    GPIO.output(x, True)
    print("Port %s wurde aktiviert") %x
    #5 Sekunden warten
    print("Es werden 3 Sekunden gewartet")
    time.sleep(3)
    #Pin x LOW Pegel
    GPIO.output(x, False)
    print("Port %s wurde dektiviert") %x
    print("Es werden 3 Sekunden gewartet")
    time.sleep(3)   
    y=y+1
    print("y wure inkremeniert")
    GPIO.cleanup()
 
Zurück