Um sich mit Threading in Python einzuarbeiten ist es am einfachsten wenn man sich eine konkrete Aufgabe stellt, die zu implementieren ist. Was lag es da näher als an einer Raspberry PI mal eben 6 LEDs anzuschliessen und per GPIO zu steuern. Auf den folgenden Seiten beschreibe ich kurz wie das Programm funktioniert bzw was man anpassen muss, damit man es auf seiner eigenen Raspi laufen lassen kann. Weiterhin findet sich ein Video welches das Programm in Aktion zeigt sowie ein Link zum Download des Python Codes.

 

Anbei ein Photo (Klick das Photo um ein Video zu sehen) des Breadboardaufbaues mit einem T-Cobbler, jeweils drei LEDs und zugehörigen Widerständen links und rechts, die zwei im rechten Winkel zueinander stehende Ampeln darstellen sollen.

raspiTrafficLight

 

Im Programm sind drei verschiedene Ampelprogramme implementiert, die die LEDs unterschiedlich ansteuern. Zu Anfang werden alle LEDs ein paar Mal angesteuert um alle LEDs zu testen. Danach starten die Ampelprogramme die jeweils durch das Ampelnotprogramm - da blinken nur die gelben LEDs auf allen Seiten - unterbrochen werden. Dieses wird in einer Endlosschleife fortgeführt. Ein Video der Ampeln in ihrer Aktion ist hier zu finden. Das Pythonprgramm steht hier zum Download zur Verfügung.

Auf dem RaspberryPi Forum gibt es zu dem Pythonprogram und der Handhabung von Threads auch einen interessanten Thread. 

Um das Programm benutzen zu können müssen die folgenden Zeilen die die GPIO Pins definieren, an denen die LEDs angeschlossen sind, entsprechend angepasst werden.

GPIO.setmode(GPIO.BOARD)
# GPIO pins for red yellow green
trafficLight1=[18,22,7]         # <=== Adapt to local environment
trafficLight2=[13,15,16]        # <=== Adapt to local environment

Die erste Pin in der Liste ist die rote LED und die letzte Pin ist die grüne LED.

Folgender Code definiert eine normale Ampelschaltung wo immer rot/gruen, rot-gelb/gelb und gruen/rot bei beiden Ampeln gleichzeitig leuchtet und kann als Vorlage genommen werden um eigene AmpelProgramme zu erstellen:

NORMAL_PROGRAM[0]=[
        [[1,0,0],SLEEP_MAIN],        # red
        [[1,1,0],SLEEP_TRANSITION],  # red yellow
        [[0,0,1],SLEEP_MAIN],        # green
        [[0,1,0],SLEEP_TRANSITION]   # yellow
    ]
NORMAL_PROGRAM_PHASE_RED[0]=0
NORMAL_PROGRAM_PHASE_GREEN[0]=len(NORMAL_PROGRAM[0])/2

Die Bedeutung ist wie folgt:

Pro Ampelprogramm sind 3 Variablen zu definieren, die jeweils in einer Liste stehen.

Das erste Element pro Zeile des Ampelprogrammes NORMAL_PROGRAM (z.B. [1,0,0]) definiert welche LEDs in diesem Zustand leuchten sollten. [1,0,0] lässt z.B. nur die rote LED leuchten. SLEEP_... ist eine Konstante, die definiert, wie lange diese LED leuchten soll. Es sind Vielfache des zentralen Steuerungstaktes CONDUCTOR_TICK_TIME. Das gesamte Ampelprogramm besteht dann aus einer Reihenfolge von diesen Zuständen. NORMAL_PROGRAM_PHASE_RED und NORMAL_PROGRAM_PHASE_GREEN definieren den Index in der Programmliste, der den roten Ampelphasenzustand bzw den grünen Ampelphasenzustand definiert. z.B. ist NORMAL_PROGRAM_PHASE_RED=0 da die erste Zeile im Programm der Rotzustand der Ampel ist während NORMAL_PROGRAM_PHASE_GREEN[0]=len(NORMAL_PROGRAM[0])/2, was genau 3 ist, den Grünzustand der Ampel definiert.

Die Variablen

DEBUG=False                        # threading debug
Thread_CTORDTOR=False

können auf True gesetzt werden und man erhält damit Debugausgaben die helfen den Codeflow sowie die Threadingfunktionen zu verstehen

Das Beispielprogramm wurde unter die GPL gestellt und das git Repository ist hier verfügbar.

Kommentar schreiben

Spam Kommentare sind sinnlos !
Vor der Publizierung wird jeder Beitrag auf Spam geprüft. Leider dauert es deswegen bis ein Kommentar sichtbar wird. Dafür erhält aber kein Subscriber Spam eMails.
Die eMail ist optional und nicht öffentlich sichtbar. Sie ist notwendig um eMail Benachrichtigungen zu Antworten auf Kommentare zu erhalten und wird u.U. genutzt um offline zu kommunizieren.

Spam comments are useless !
Any comment will be reviewed first and checked for spam. Unfortunately this delays the publishing of comments but will protect subscribers from spam.
eMail is optional and hidden and is required get update notifications for any comments and may be used to contact you offline