Raspberry Pi Zero als LED Strip Controller Erweiterungen
Im Raspberry Pi Zero als LED Strip Controller Erweiterungen Artikel zeige ich euch welche Optimierungen ich an meinem Carport LED Strip den ich im zuletzt vorgestellten Artikel gemacht habe. Es macht richtig Spaß hin und wieder kleine Anpassungen und Verbesserungen am täglich laufenden LED Strip zu machen. Das perfekte Projekt für jeden Raspberry Pi Bastler.
Raspberry Pi Zero als LED Strip Controller Erweiterungen
Der LED Strip funktioniert mit einem Testskript vom Raspberry Pi Zero aus. Nun wird es Zeit die Ausgabe an die eigenen Wünsch anzupassen. In diesem Tutorial zeige ich euch:
- wie man ein Beispielskript modifiziert
- das Skript zu bestimmten Uhrzeiten startet und beendet
- ein eigenes Design erstellt
Wenn ihr mit dem Tutorial fertig seid könnt ihr die Ausgabe eures LED Strips selber anpassen und die Ausgabe automatisieren. Den Source Code für meine Beispiele findet ihr wie immer auf meiner GitHub Seite.
Simples Regenbogen Skript
Im letzten Artikel habe ich euch ja bereits einige Aufnahmen gezeigt. Das Beispielskript hat unter anderem mehrere Regenbogenfarben Ausgaben. Eine dynamisch habe ich für mein Skript genommen das nun täglich in der Früh und am Abend einige Stunden läuft. Dazu habe ich mir die Datei examples/srandtest.py in das Heimatverzeichnis /home/pi kopiert und in led-start.py umbenannt.
Die neu erstellte Datei habe ich nun soweit bearbeitet, dass nur noch der Regenbogen in einer Endlosschleife abgespielt wird. Dazu sind folgende Anpassungen nötig:
LED_COUNT = 100 # Number of LED pixels.
Wie bereits im anderen Artikel erwähnt muss man die Anzahl der LEDs vom LED Strip im Skript anpassen. Bei mir sind das 100 ICs die jeweils 3 LEDs steuern.
if len(sys.argv) != 2: print('Argument for runtime in hours needed for example: python scriptname.py 2') exit()
Zu Beginn des Programms wird geprüft ob ein Parameter angegeben wurde, falls nicht wird das Skript mit einer Fehlermeldung beendet.
loop = True starttime = datetime.datetime.now() now = datetime.datetime.now() print ('start time: '+str(now.hour)+':'+str(now.minute)) print ('end time: '+str(now.hour + int(sys.argv[1])) + ':' + str(now.minute)) while loop: rainbow(strip) now = datetime.datetime.now() if now.hour >= starttime.hour + int(sys.argv[1]): loop = False # reset LED strip (all LEDs off) colorWipe(strip, Color(0,0,0), 10)
Die Hauptschleife wurde mit der loop Variable derart modifiziert, dass man sie nun abbrechen kann. Zum Start wird mit datetime.datetime.now() der aktuelle Zeitstempel geholt. Diesen Vorgang wiederholt man in jedem Schleifendurchlauf. Sofern die Stunde größer als die zuerst gemessene Stunde plus dem übergebenen Parameter ist wird die Schleife beendet. Das heißt beim Aufruf vom Skript miss man nun eine Zahl mitgeben wie lange das Skript in Stunden läuft (2 = 2 Stunden lang). In der Schleife wird jeweils die rainbow(strip) Funktion vom Example Skript ausgegeben, welches einen sich ändernden Regenbogen zeigt. Diese Ausgabe finde ich sehr entspannend und ansprechend für mein Carport.
Zum Ende vom Programm wird mit der colorWipe Funktion und der Angabe von schwarz als Farbe der komplette LED Strip deaktiviert. Die Ausgabe sieht etwa so aus:
Crontab automatisiert den LED Strip
Es wäre etwas langweilig immer um 5 Uhr aufzustehen und das Skript zu starten oder um 10 oder 11 Uhr am Abend das Skript zu beenden. Mit dem Raspberry Pi können wir solche Task mit Crontab automatisieren. Wir melden uns deshalb beispielsweise über SSH am Raspberry Pi Zero an und geben folgendes ein:
crontab -e
dort konfigurieren wir nun nach belieben die Startzeiten der LED Strip Ausgabe und mit dem zusätzlichen Parameter geben wir gleich noch an wie lange das Skript laufen soll:
0 18 * * * sudo python led-start.py 4 >> /home/pi/led.log 2>&1 0 5 * * * sudo python led-start.py 2 >> /home/pi/led.log 2>&1 0 0 * * * sudo python led-stop.py >> /home/pi/led.log 2>&1 0 8 * * * sudo python led-stop.py >> /home/pi/led.log 2>&1
Ok, was ist da los? Ich habe für den Regenbogen (led-start.py) zwei Startzeitpunkte gewählt. Einmal in der früh um 5 Uhr und einmal am Abend um 18 Uhr. Das sind Zeiten zu denen ich oft das Haus verlasse oder nach hause komme. Am Abend leuchten die LEDs 4, am Morgen 2 Stunden. Mit „>> /home/pi/led.log 2>&1“ werden sämtliche Ausgaben vom Skript in eine Log Datei geschrieben (Ausgaben von über Crontab ausgeführen Skripten sieht man sonst nicht). Dadurch kann ich recht einfach die korrekte Ausführung verfolgen. Wenn das Skript beendet wird sollten die LEDs aus gehen. Wenn es aber einen Fehler gibt und das Skript abgebrochen wird passiert diese Deaktivierung nicht. Als Fallback habe ich deshalb zu fixen Zeiten ein weiteres Skript (led-stop.py) erstellt, welches genau diese Aufräumarbeiten durchführt. Das ist nötig um nicht Nachbarn durch das Licht in der Nacht zu stören.
Von der Idee zum Skript
Heute ist Nationalfeiertag in Österreich. Spontan habe ich mir überlegt heuer auch etwas dazu beizutragen. Recht simpel wäre die LED Beleuchtung an die Farben der Flagge anzupassen. Andere hissen am Tag die Flagge aus Respekt, ich mit meiner Lichtshow in der Nacht. Der Auftrag ist recht einfach: der LED Streifen muss 3 Balken mit den Farben Rot-Weiß-Rot ausgeben. Dazu passe ich das Regenbogen Skript wie folgt an:
# colored lines def colorlines(strip, color1, color2, lines, wait_ms=50): block = math.ceil(strip.numPixels() / lines) if lines % 2 != 0: block+=1 count = 0 """Wipe color across display a pixel at a time.""" for i in range(strip.numPixels()): count+=1 if count < block: strip.setPixelColor(i, color1) if count >= block: strip.setPixelColor(i, color2) if count == block * 2: count = 0 strip.show()
Keine der vorhandenen Funktionen ist passend, weshalb ich mir eine eigene bastel. Da ich eventuell andere Farbmuster damit ausgeben will wird die Funktion nicht auf den Fall mit Rot-Weiß-Rot und 3 Balken hard gecoded sondern man kann das über die Parameter color1, color2 und lines einstellen. In einer Schleife werden alle Pixel (LEDs) durchgegangen und je nachdem ob der mitlaufende counter kleiner oder größer als ein (in diesem Fall) Drittel der Gesamtzahl an LEDs ist wird die erste oder zweite Farbe ausgegeben. Da 100 blöderweise eine gerade Zahl ist verhindert das erste if mit dem Modulo, dass am Ende vom Streifen noch einmal ein weißes Pixel ausgegeben wird.
Aufgerufen wird die Funktion so:
# 255 0 0 blue # 0 255 0 red # 0 0 255 green colorlines(strip, Color(0, 255, 0), Color(255, 255, 255), 3)
Erfahrene Programmierer werden vermutlich die seltsame Definition der Farben kritisieren. Die Farben sind anders als beim normalen RGB wie man es von der Grafikprogrammierung unter anderem von OpenGL her kennt vertauscht. Siehe dazu meine Kommentare vor der Funktion. Ich habe das 3 Mal falsch gemacht bis ich rot „gefunden“ habe.
Mit ein paar Zeilen Code hat man eine tolle Deko für den Nationalfeiertag. Ich freu mich schon auf Halloween…
Fazit
Mit den Raspberry Pi Zero als LED Strip Controller Erweiterungen haben wir nun volle Kontrolle über jedes einzelne LED. Neben der Farbe und der Intensität der Ausgabe können wir diesen auch zeitlich steuern. Damit haben wir die Grundlagen gelernt um eigene Lichtshows abzutippen und mehr Farbe und Leben in jeden beliebigen Raum oder ins Freie zu bringen. Die Arbeit mit dem LED Streifen macht mit dem Raspberry Pi als Controller richtig Spaß und ermöglicht noch viele weitere Möglichkeiten. Nur ein paar Ideen:
- Lichtsensor
erst wenn es dunkel wird soll der Pi den LED Streifen aktivieren - Bewegungssensor
das Licht soll nur dann angehen, wenn eine Person erkannt wird (beispielsweise für den Kellerabgang oder die Garage) - Webservice
mit der Anbindung an ein Webservice könnte man den LED Strip auch von überall aus der Welt fernsteuern - Steuerungsprogramm
man könnte eine Smartphone App erstellen in der man zwischen mehreren ablaufenden Designs wählen oder alternativ jeden einzelnen Pixel selber in Farbe und Helligkeit einstellen kann.
Es gibt noch hunderte andere Möglichkeiten. Fallen euch noch interessante ein?
Hausaufgabe:
Da die meisten Leser aus der Bundesrepublik kommen: modifiziert die colorlines Funktion meines Skripts, damit beim nächsten Tag der deutschen Einheit die Farben Schwarz-Rot-Gold ausgegeben werden. Wobei schwarz eine Herausforderung wird 😉
Hallo.
Könnten Sie/Du ein Tutorial für den Webservice und evt. die Smartphone App erstellen?
Danke.