Blinkender Kram hat es mir angetan. Für diejenigen, die mich kennen ist das nichts Neues.
Auf dem 31c3 hat eine herumstehende LED-Fackel meine Begeisterung und den haben-wollen-Drang entfacht. Ich habe mich gleich durchgefragt und konnte den Verantwortlichen für diese optische Illumination höherer Vergnügungsordnung ausfindig machen. Er hat mich innerhalb weniger Minuten technisch auf den Stand der Dinge gebracht und mir die Funktionsweise erklärt. Klug wie ich bin konnte ich von all dem gerade mal die Internetadresse verstehen, aber darüber bin ich heute sehr froh, denn sie legte den Grundstein für die Fackel Version 2.0.
Die Fackel besteht aus einem LED-Strip vom Typ WS2812B, den man schlicht auf eine (optimalerweise leergefutterte) zylinderförmige Chipsverpackung spiralförmig aufrollt.
Man kann die Chips auch in der Packung lassen, das hat keine Auswirkungen auf die Lichtintensität, aber erhöht unnötig das Gewicht. Der „mrks“ aus Regensburg schreibt davon, ein Abflussrohr genommen zu haben. Ich habe davon abgesehen, ich finde die Fackel kommt im Bad nicht so zur Geltung. Zumal ich dafür die Fliesen von der Wand hätte klopfen müssen.
In der ursprünglichen Version von „mrks“ wird die Ansteuerung der LED’s durch einen Arduino Micro vorgenommen. D.h. der Feuereffekt wird auf einem ATmega32u4 Prozessor berechnet, der speichertechnisch mit 2.5 kb RAM schon am Limit ist.
Da ich allerdings ein Freund von über-wlan-fernsteuerbaren Dingen bin (Thema iot), war mein definiertes Ziel, die Fackel auf einem ESP8266 zum Laufen zu kriegen.
Es gab zwar Vorbehalte, dass die Berechnung auf der CPU bei eingehenden WLAN-Pakete ins Stocken geraten würde, aber diese Befürchtungen haben sich aufgrund der viel höheren Performance (und gefühlt unbegrenztem RAM) als unbegründet erwiesen.
Es hat etwas länger gedauert bis ich den Programmcode ausreichend verstanden habe um ihn entsprechend abzuändern, letztendlich ist es mir jedoch gelungen, den Algorithmus auf den ESP8266 zu portieren.
Die erste Version nach der Portierung lief also genau wie auf dem Arduino, d.h. einfach programmatisch ohne irgendwelche Features, aber durch die neuen Hardware standen ganz neue Freiheitsgrade zur Verfügung.
Das erstmal genialste an der Angelegenheit ist, dass ich nun zur Ausgabe an den LED-Strip die FastLED-Bibliothek nutzen konnte. Sie hält jede Menge Funktionen vor, um den Strip bzw. die Ausgabe anderweitig zu beeinflussen. Ich schätze beispielsweise sehr die Fähigkeit, die Stromstärke der LED’s begrenzen zu können. D.h. ich kann im Code festlegen (mittlerweile auch live), dass beim Beleuchten z.B. maximal 1 Ampère verbraucht werden darf und kann somit als Stromversorgung auch einen USB-Anschluss nutzen. Steht ein größer dimensioniertes Netzteil zu Verfügung, kann die Stromaufnahme und damit die Helligkeit auch erheblich erhöht werden. Bei 60mA mal 300 LED’s können bis zu 18 Ampère benötigt werden. Dann kann man allerdings eher von einer Sonne anstatt einer Fackel sprechen und man sollte in der Umgebung vorsichtshalber Schweißerbrillen verteilen, um Netzhautschäden zu vermeiden.
Im weiteren Verlauf konnte ich die WLAN-Fähigkeit einbinden. Das Ziel sollte sein, die Fackel um weitere Lichteffekte zu ergänzen und diese selbstverständlich per WLAN steuerbar zu machen. Dazu habe ich den Code anderer Projekte (z.B. Tweaking4all oder StefanPetrick) mit dem der Fackel ergänzt und hatte nun eine erste Möglichkeit, zwischen unterschiedlichen Effekten auszuwählen. Leider kam es in dieser Phase zu einer Unannehmlichkeit, bei der ich fast das Handtuch geworfen hätte. Es war nicht möglich, aus gewissen Effektprogrammen in Andere zu wechseln. Wieder mal nicht trivial. Gewisse Effekte, einmal gestartet, hingen fest. Das war so genannte nested loops zuzuschreiben, d.h. der Prozessor hatte sich in „Unterschleifen“ derart mit dem Licht beschäftigt, dass er nicht mehr dazu kam, nach neuen WLAN-Befehlen Ausschau zu halten. Dies ist dem Design des ESP8266 geschuldet, der üblicherweise immer wiederholend eine Grundschleife (Loop) durchläuft. In dieser Grundschleife kann er auch nach Netzverkehr schauen, aber wenn die Grundschleife nicht mehr erreicht wird, dann ist eben Essig.
Nach Lektüre diverser Seiten besteht die einzige Chance darin, den Code so umzuschreiben, dass man ein gewisses Zeitmanagement implementiert. Es führt zu einem rudimentären Multitasking. D.h. jede Unterroutine wird nur nach Verstreichen einer gewissen Laufzeit (millis) aktiviert und auch nur einmal und nicht unendlich durchlaufen. Das setzt auch wieder voraus, dass alle benutzen Variablen global weitergenutzt werden müssen. Lange Rede, kurzer Sinn, das gesamte Konzept musste umgeschrieben werden, um zukünftigen Erweiterungen durch Effekte stand zu halten. Es sind noch lange nicht alle Routinen komplett angepasst, aber es funktioniert bereits ausreichend, d.h. der Loop wird häufig genug durchlaufen, um z.B. den Netzwerkverkehr ausreichend abzuholen und auszuwerten.
Im weiteren Verlauf habe ich noch MQTT-Funktionalität implementiert. Die Effekte können also auch durch eine schicke Oberfläche wie z.B. Node-Red bedient werden. Dem Einsatz im Wohnzimmer in einem sowieso schon hochautomatisieren Heimnetz steht also nichts im Wege.
In einer der letzten Schritte habe ich eine Wifi-Manager Bibliothek eingebunden. Mit ihrer Hilfe ist es möglich, den (wlan-) unkonfigurierten ESP8266 in einer ihm unbekannten Umgebung „auszusetzen“ und dann erst das WLAN einzurichten. Dazu spannt der Chip seinen eigenen WLAN-Accesspoint auf, mit dem man sich verbinden und dann die Credentials für das lokal vorhandene WLAN eingeben kann. Befindet man sich auf „freiem Feld“, d.h. nicht in der Nähe eines nutzbaren Accesspoints, so schaltet die Fackel in den Standalone-Betrieb um und man kann die Fackel über den nun aktivieren internen Accesspoint steuern. Das macht schon Laune.
Des Weiteren ist es möglich, die Effekte auch per Button durchzuschalten. Ich habe hierfür GPIO 14 (Wemos auf D5) konfiguriert. Wird der PIN mit Ground (GND) verbunden, wird ein Interrupt ausgelöst und der Zähler um (mindestens) Eins hochgezählt. Es steht noch auf der Verbesserungsliste, den Button zu entprellen, denn ohne Kondensator können leider auch mehrere Trigger gezählt werden, und bisher bekomme ich das programmtechnisch nicht zuverlässig abgefangen. D.h. wenn man den Button drückt, kann auch mehrere Effekt vorgesprungen werden, was eher einem Effekt-Lotto gleicht. Mittlerweile ist der Taster auch entprellt, was für mich nicht trivial war, da speziell bei der Nutzung des Interrupts Einiges zu beachten ist.
Wenn man GPIO 5 (D1) auf Ground zieht, werden die WLAN-Daten gelöscht und man kann es neu konfigurieren.
Die Software
Wer sich nun durch den Text gequält hat, entweder Fragezeichen, Ausrufezeichen oder Sternchen im Hirn hat, der darf endlich zum Herzstück des Ganzen übergehen, dem Code:
https://github.com/cruisinger/FireTorchESP
Der Code ist in Github abgelegt und ich bitte um Weiterentwicklung (z.B. per Pull-Requests) durch Erweiterung oder auch gerne durch Korrektur.
Die Hardware
Was die Hardware angeht, so werden folgende paar Teile benötigt:
1 x ESP8266 , ich bevorzuge das Wemos D1 Modul.
1 x WS2812B LED Strip , hier erhältlich
1 x Pegelwandler , hier erhältlich, oder hier
1 x Protoboard , hier erhältlich
1 x JST SM Adapter (3-polig)
2-3 x Mikro Taster als Effektumschalter, etc.
1 x 220µF Elko, zur Spannungsstabilisierung am Spannungseingang
1 x 1000µF Elko, zur Spannungsstabilisierung am LED-Strip2-3 x 0,1µF Kondensator zum Entprellen der Taster
Zusammengebaut kann das Ganze dann so aussehen:
Was die Stromversorgung anbelangt, so sollte man sich ein ausreichend dimensioniertes Netzteil besorgen. Wenn man nicht den gesamten Raum zum Lesen ausleuchten will reicht für reine Effekte durchaus ein Netzteil mit 4 bis 5 Ampère aus. Die Fackel (als der Effekt/das Programm) leuchtet z.B. auch bei 1000 mA schon sehr eindrucksvoll. Für die volle Power sollten 18A ran, das wird aber auch dann entsprechend teuer. Den Stromverbrauch kann man – wie oben beschrieben – per Software ja begrenzen. Bei Unterdimensionierung sollte man noch eine Schmelzsicherung vorschalten.
Und wenn man das Ganze über Akku betreiben möchte, dann sollte man sich neben 2-4S LiPo Akku noch einen Step-Down Wandler zulegen. Ich habe gute Erfahrung mit Folgendem:
75W/5A Wandler
Bedenken sollte man auch Anschlussstecker und Zuleitung. Ich selbst nutze Deans-Stecker. Es gibt aber auch etliche andere Adapter.
Die Schaltung
Ein Bild sagt mehr als tausend Worte. Hier ist die Verschaltung:
Weitere Wünsche:
GUI mit responsive Design
Spannung der Batterie anzeigen, Unterspannungsabschaltung
Texte anzeigen
konfigurierbarer (Speech-) TimerDebouncing der Taster
OTA – Firmware über WLAN flashbar machen
MSGEQ7 Sound Equilizer optional nutzen
Links:
A beginner’s guide to the ESP8266
http://esp8266-server.de/Tipps.html
http://werner.rothschopf.net/201809_arduino_esp8266_server_client_1.htm
https://jorgen-vikinggod.github.io/LEDMatrix/