Raspberry Pi – DIY Adventkranz Teil 2
Im letzten Teil habe ich gezeigt wie man die Hardware für den DIY Adventkranz erstellt. Dabei werden 4 LEDs benutzt die als „Kerzen“ des Adventkranzes dienen. Über Steckdrähte sind diese am Pibrella Board oder alternativ direkt an den GPIO Pins angeschlossen. Alles sollte nun soweit funktionell sein, was jetzt noch fehlt ist die Software, das Python Script welches diese LEDs steuert.
Software
Wie im letzten Teil möchte ich den Source Code auch wieder in zwei alternativen Versionen anbieten. Die Ansteuerung der 4 Ausgabe-Pins der Pibrella Boards funktioniert mit einer eigenen Python Pibrella Bibliothek. Alternativ zeige ich dazu wie man das ohne diesem Board mit den „normalen“ GPIO Boards eines Raspberry Pis steuert und zwar so, dass der Source Code sowohl auf der den alten Raspberry Pi Versionen als auch auf den neuen Plus Modellen funktioniert.
Pibrella Variante
Das Script beginnt mit den Import der benötigten Bibliotheken. Wie bereits erwähnt verwenden wir die Pibrella eigene Bibliothek. Wie man diese installiert zeige ich in einem separaten Artikel. Zusätzlich benötigen wir für die Berechnung mit Daten die datetime Bibliothek. Diese werden wie folgt in Python importiert:
import pibrella import datetime
Im nächsten Block werden einige Daten initialisiert. Wir holen uns das aktuelle Datum und berechnen uns das jeweilige Datum der 4 Adventsonntage. Das geht wie folgt:
#aktuelle Zeit holen now = datetime.datetime.now() #Datum extrahieren jahr = now.year monat = now.month tag = now.day #Wochentag von Weihnachten bestimmen weihnachten = datetime.datetime(jahr, 12, 24, 0, 0, 0) wochentag = weihnachten.weekday() vierter_advent = weihnachten - datetime.timedelta(wochentag + 1) dritter_advent = weihnachten - datetime.timedelta(wochentag + 8) zweiter_advent = weihnachten - datetime.timedelta(wochentag + 15) erster_advent = weihnachten - datetime.timedelta(wochentag + 22)
Man beachte, dass die Daten der Adventsonntage vom 24.12. des aktuellen Jahres zurückgerechnet werden. Dadurch ist dieses Script dynamisch jedes Jahr wieder zu verwenden. Der eigentlich interessante Codeteil ist die If-Abfrage in der basierend auf der Datumsinformation die einzelnen LEDs aktiviert werden.
#LEDS aktivieren basierend auf Datum if(now <= weihnachten): if(now >= erster_advent): pibrella.output.e.on() if(now >= zweiter_advent): pibrella.output.f.on() if(now >= dritter_advent): pibrella.output.g.on() if(now >= vierter_advent): pibrella.output.h.on() input("Programm wir mit Tastendruck beendet")
Mit dem letzten Kommando bleibt das Skript am Leben. Das heißt, die LEDs leuchten so lange, bis man das Script durch einen Tastendruck beendet. Danach werden die Pibrella Board Pins wieder auf den Ursprungszustand zurückgesetzt.
Der Source Code für die Pibrella Variante kann hier heruntergeladen werden.
Standard GPIO Variante
Die Standard GPIO Variante unterscheidet sich von der Pibrella Variante nur wenig. Tatsächlich sind nur jene Codestellen anders, die sich auf die Kommunikation mit der GPIO Schnittstelle beziehen. Im Importbereich wird statt der Pibrella Bibliothek jene der GPIO Schnittstellen eingebunden. Das geht folgendermaßen:
import RPi.GPIO as GPIO
In weiterer Folge muss man die GPIO Schnittstelle initialisieren. Das geht mit einem einzigen Codezeile. Zusätzlich lege ich im Codebereich für die Initialisierung auch Variablen für die GPIO Pin Nummerierung an, damit ich im Fall des Falles die verwendeten Pins problemlos austauschen kann:
#initialisiere GPIO PIN_A = 7 PIN_B = 8 PIN_C = 10 PIN_D = 11 GPIO.setmode(GPIO.BOARD)
Die zweite Codeänderung bezieht sich auf die If-Abfrage. Dort wird auf andere Art und Weise mit den Pins kommuniziert als im Pibrella Beispiel:
#LEDS aktivieren basierend auf Datum if(now <= weihnachten): if(now >= erster_advent): GPIO.setup(PIN_A, GPIO.OUT) GPIO.output(PIN_A, True) if(now >= zweiter_advent): GPIO.setup(PIN_B, GPIO.OUT) GPIO.output(PIN_B, True) if(now >= dritter_advent): GPIO.setup(PIN_C, GPIO.OUT) GPIO.output(PIN_C, True) if(now >= vierter_advent): GPIO.setup(PIN_D, GPIO.OUT) GPIO.output(PIN_D, True) a = raw_input("Programm wir mit Tastendruck beendet")
GPIO.cleanup() Die einzelnen Pins muss man jeweils initialisieren. Man kann diese als GPIO.IN oder GPIO.OUT definieren. Da wir sie als Ausgabe-Pins nutzen setzen wir jeweils GPIO.OUT. Erst nach dem Setup kann auf die Pins geschrieben werden.
Man beachte hier auch die letzte Zeile. Anders als beim Pibrella Skript müssen wir die GPIO Schnittstelle manuell aufräumen. Ohne dem cleanup Kommando würden die LEDs weiter leuchten.
Der Source Code für die Standard GPIO Variante kann hier heruntergeladen werden.
Fazit
Mit meinem Adventkranz Beispiel habe ich euch alles nötige gezeigt wie ihr selber mit dem Pibrella Board oder direkt über die GPIO Pins LEDs ansteuern könnt. Im Hardware Teil des Artikels ebenso erklärt wie man LEDs, Steckdrähte und Widerstände mit einem Steckbrett verwenden könnt. Im Software Teil des Artikels gezeigt wie man diese Pins mit Python ansteuern und aktivieren beziehungsweise deaktivieren könnt.
Wie gefällt euch der Artikel? Habe ihr eventuell Ideen wie man den Adventkranz noch verbessern könnte?
Teil 1 | Teil 2
Hi, super Artikel.
Aber du solltest folgende zwei Programmzeilen ergänzen:
a = raw_input(„Programm wir mit Tastendruck beendet“)
Sollte wohl heißen:
a = raw_input(„Programm wird mit Tastendruck beendet“)
Ebenso: input(„Programm wir mit Tastendruck beendet“)
Ich habe das Gefühl ich bin immer der Jäger der Kleinigkeiten in deinem Blog 😉
Gruß,
BBC (Chris)