Blinkende LED am Raspberry Pi
Abbruchfähige Endlosscheife, die LED am Raspberry Pi blinken lässt
Diese Lektion baut auf den vorausgehenden Artikel zu LED-Ansteuerung auf. Die hier hinzukommende Erweiterung beschränkt sich auf das Programm. Genauer: Es wird eine abbruchfähige Endlosschleife, in welcher die LED im Wechsel an- bzw. ausgeschaltet wird eingeführt. Auf die Hardware (LED, Widerstände und Steckbrett) wird im vorangegangenen Artikel ausführlich eingegangen und deswegen hier nur oberflächlich angerissen. Alle hier verwendeten Bauteile sind zusätzlich unten verlinkt.

Die Schaltung
Die Kathode (-) der LED ist über die Steckplatine mit einem der Massepins (hier: Pin 3 (BCM 2)) des Raspberry Pi verbunden. Die Anode (+) über den, von uns berechneten 75 Ω Widerstand mit Pin 18 (BCM 24) des GPIO verdrahtet. Weitere Informationen zum Verwenden von Steckplatinen und den Pins des Raspberry Pi (GPIO) im vorausgehenden Artikel.

Der Code
Zunächst wird der LED-Pin initialisiert (keine Veränderung zum Grundlagenartikel)
# Erforderliche Bibliotheken importieren import RPi.GPIO as GPIO import time # Konvention für Pinnummerierung festlegen (BCM bzw. Board) GPIO.setmode(GPIO.BCM) # Pin mit seiner Nummer und als Ausgang definieren GPIO.setup(24, GPIO.OUT)
Anschließend erstellen wir die Variable T
für die Periodendauer des Leuchtens in Sekunden.
T = 1
Whileschleifen in Python
Eine while
-Schleife wiederholt sich so lange, wie eine Bedingung erfüllt ist. Folgend nun ein einfaches Beispiel, bei welchem die while
-Schleife ihre Anweisung einmal ausführt. Dabei wird im Kopf der Schleife überprüft, ob die Bedingung, dass i
gleich dem booleschen WertTrue
ist. Ihre Anweisung ist es, i
auf False
zu setzen. Beim nächsten Durchlauf wird die Bedingung erneut überprüft und festgestellt, dass i
gleich dem WertFalse
ist. Daraufhin wird die Schleife abgebrochen.
i = True while i == True: i = False
In der Schreibweise dieser Endlosschleife führen wir zudem eine Abkürzung ein, die nicht unbedingt die Lesbarkeit des Codes steigert, jedoch typisch ist. In jener Abkürzung wird abgefragt, ob eine Variable (hier: i
) dem booleschen WertTrue
entspricht, ohne die Bedingung mit den obligatorischen doppelten Gleichheitszeichen zu prüfen:
i = True while i: i = False
Da es sich bei True
zudem um eine globale Variable handelt, kann auch ihr Wert abgefragt werden (welche standartmäßig den booleschen WertTrue
besitzt).
while True: # Pin auf 3,3 V schalten GPIO.output(24, GPIO.HIGH) time.sleep(T) # Pin auf 0 V schalten GPIO.output(24, GPIO.LOW) time.sleep(T)
Ausnahmebehandlung in Python
Wir werden die Ausnahmebehandlung konkret dazu verwenden, eine Endlosschleife zu unterbrechen. Dazu jedoch später mehr. Die Ausnahmebehandlung ist eigentlich als Konzept zur Behandlung von potentiellen Problemen gedacht. Ein solches Problem könnte hypothetisch sein, dass auf ein Laufwerk geschrieben werden soll, das jedoch nicht eingehängt oder voll ist. Zwar könnten diese Fälle auch ohne eine Ausnahmebehandlung abgefangen werden, was allerdings zu erhöhtem Programmieraufwand führte und der Voraussetzung unterliegt, alle potentiellen Fehler bereits im Vorfeld zu kennen.
So wird die vorgesehene Maßnahme, bspw. das Schreiben auf ein Laufwerk in einem Try
-Block eingeschlossen.
Der auszuführende Code der Ausnahme wird in einem except
-Block notiert.
Ein sehr einfaches Beispiel ist die Division von einer beliebigen Zahl (hier: 2
) durch 0
, was mathematisch nicht definiert ist und zu einem Fehler führt.
try: print(2/0) except: print("Ein Fehler ist aufgetreten")
Ausgabe:
Ein Fehler ist aufgetreten
Es ist zusätzlich auch möglich die Traceback
-Meldung auszugeben. Dies geschieht mit der Ausnahme vom Typ Exception
:
try: print(2/0) except Exception as ausnahme: print(ausnahme)
Ausgabe:
division by zero
Unsere Ausnahme soll dagegen keinen Fehler umgehen, sondern die Endlosschleife beenden. Dafür hält Python die Ausnahme vom Typ KeyboardInterrupt
parat. Diese unterbricht die Ausführung der Endlosschleife destry
-Blocks und springt in den except
-Block. Hier wird die LED ausgeschaltet und der Pin zurückgesetzt.
try: print("Blinklicht eingeschaltet") # While True - Endlosschleife while True: # Pin auf 3,3 V schalten GPIO.output(24, GPIO.HIGH) time.sleep(T) # Pin auf 0 V schalten GPIO.output(24, GPIO.LOW) time.sleep(T) # Dies passiert bei Tastenkombination [Strg] + [C] except KeyboardInterrupt: GPIO.output(24, GPIO.LOW) print("Blinklicht ausgeschaltet") # Verwendete Pins zurücksetzen und Warnmeldung beim Neustart vermeiden GPIO.cleanup()
Der Code in seiner vollen Gänze
# Erforderliche Bibliotheken importieren import RPi.GPIO as GPIO import time # Konvention für Pinnummerierung festlegen (BCM bzw. Board) GPIO.setmode(GPIO.BCM) # Warnungen, die das Ausführen des Programms verhindern, wenn # Ausgang bereits als OUT deklariert wurde ignorieren GPIO.setwarnings(False) # Pin mit seiner Nummer und als Ausgang deklarieren GPIO.setup(24, GPIO.OUT) # Blinkperiode (in Sekunden) T = 1 # try ermöglicht das Abbrechen des Programms mit der # Tastenkombination [Strg] + [C] try: print("Blinklicht eingeschaltet") # While True - Endlosschleife while True: # Pin auf 3,3 V schalten GPIO.output(24, GPIO.HIGH) time.sleep(T) # Pin auf 0 V schalten GPIO.output(24, GPIO.LOW) time.sleep(T) # Dies passiert bei Tastenkombination [Strg] + [C] except KeyboardInterrupt: GPIO.output(24, GPIO.LOW) print("Blinklicht ausgeschaltet") # Verwendete Pins zurücksetzen und Warnmeldung beim Neustart vermeiden GPIO.cleanup()
Verwendete Bauteile
Verwendete Bauteile | Empfohlene Komponenten für den Raspberry Pi | ||
---|---|---|---|
10 rote LEDs | Raspberry Pi 3 Modell B+ | ||
Jumper Kabel | 5 V / 3 A Micro USB Netzteil | ||
Steckplatine | RasPi 2/3 Gehäuse | ||
75 Ω Widerstand |