Leben/Meinung / Binary Clock (µC controlled addressable LED)


Viele Jahre lang wollte ich immer eine Binäruhr haben!
Früher war ich immer auf der Suche nach passenden Kits, die ich nur noch hätte zusammensetzen müssen. Aber irgendwie war nie so das dabei, was ich mir gewünscht hätte.

Nach zig Aufbauten auf Breadboards in den letzten Jahren, die aber nie irgendeinen finalen Status erreichten, habe ich Ende August 2022 endlich angefangen ein lange gewolltes Projekt in die Tat umzusetzen.

Die Hardware selbst war an einem Abend schon aufgebaut. Da mich die ganze Steampunk- und Cyberpunk-Scene schon immer fasziniert hat, habe ich für das Design eine Mischung aus beidem gewählt.
Ein Holzrahmen, sechs mit Kupfer ummantelte Stahlstäbe, Verbindungen aus gedrilltem Kupferdraht und viele Lötstellen halten den Controller und die LEDs in ihren Positionen.

Als Controller kommt bei mir ein ESP8266-µC zum Einsatz, in der Software ist aber auch der leistungsstärkere ESP32-µC als Option vorgesehen. Als LEDs nutze ich adressierbare WS2812B-LEDs, aber alle anderen RGB-LEDs die von der Neopixel-Library unterstützt werden sind auch möglich.


Die Verdrahtung zwischen LEDs und Controller ist realtiv einfach.
Am Controller selbst werden nur die Pins 5V, GND und ein GPIO genutzt. Letzterer ist in meinem Fall GPIO4. Die zwei weiteren Verbindungen sind lediglich zum Festhalten des Controllers nötig, und verbinden nur ungenutze GPIOs mit GND.

Auch an den LEDs muss jeweils Vcc mit 5V und GND mit GND verbunden werden. Din der ersten LED ist mit GPIO4 vom Controller verbinden, und von Dout besteht eine Verbindung zu Din der nächsten LEDs. So führen sich diese Verbindungen auch weiter bis zur elften LED, deren Dout dann unbelegt bleibt.
Die Kette der LEDs beginnt in der linken Spalte unten, oben führt eine Brücke in die rechte Spalte, und von dort geht es dann wieder bis nach unten.


Viele von euch werden sich fragen, wie so eine Uhr denn überhaupt gelesen wird. Wer mit dem binären Zahlensytem nicht vertraut ist, sieht erst einmal nur viele bunte Farben.

Wie in jedem Zahlensystem werden die Stellen von hinten nach vorne beziehzungsweise von unten nach oben von Null ausgehend mit StellePosition gerechnet, sprich Stelle0, Stelle1, Stelle2 und so weiter.
Im Binärsystem ergibt das dann 20, 21, 22, 23, 24 und 25, und damit 1, 2, 4, 8, 16 und 32. All diese Stellen werden dann zusammengerechnet. Im unteren Photo etwa leuchtet auf der linken und damit auf der Stunden-Seite nur die LED für 4 blau, und auf der rechten und damit Minuten-Seite die LEDs für 4, 8 und 16. Die Uhr zeigt also 4:28 an.


In meiner Software leuchten immer alle LEDs. Das macht die Uhr auch im Dunkeln lesbar, weil ich so erkennen kann, an welcher Position es gerade leuchtet. Realisiert ist das durch die Standby-Farbe, welche immer dann erscheint, wenn eine LED bei der Berechnung nicht angesprochen wird.
Neben der Zeit gibt es auch die Möglichkeit den Wochentag und das Datum anzuzeigen. Entweder über einen Command, oder automatisch zu jeder vollen Stunde. Die Software schaltet immer zur vollen Stunde bei fünfzehn Sekunden auf den Wochentag, bei dreißig Sekunden aufs Datum und bei fünfundvierzig Sekunden zurück auf die Zeit.
Für Standby, Zeit, Wochentag und Datum können die Werte in der Software über HEX-Farbcodes angepasst werden. Voreingestellt sind Rot für Standby, Blau für die Zeit, Cyan für den Wochentag und Magenta für das Datum.
Das Datum kann in zwei verschiedenen Varianten angezeigt werden. Möglichkeit No.1 zeigt den Monat links und den Tag rechts, Möglichkeit No.2 tut es vice versa. Auch das lässt sich in der Software einstellen, indem eine Variable auf den passenden Wert gesetzt wird.

Neben den Funktionen für Zeit, Wochentag und Datum stehen noch weitere Dinge zur Verfügung:
- Mode 1: Zeit
- Mode 2: Wochentag
- Mode 3: Datum
- Mode 4: Alarm mit Anzeige von Zahlen
- Mode 5: Alarm mit rotierender Anzeige
- Mode 6: Tag-Modus
- Mode 7: Nacht-Modus
- Mode 8: automatischer wiederkehrender Alarm
- Mode 9: automatischer einmaliger Alarm
- Mode 10: Dark-Mode deaktivieren
- Mode 11: Dark-Mode aktivieren

Fast alle dieser Modi nehmen Variablen an. Diese werden über den Aufruf einer URL per GET-Request an die Uhr übertragen. Als Beispiel aus meiner eigenen Uhr nehme ich Modus 8:

http://172.16.2.7/change?mode=8&color=00FF00&hour=7&minute=30&week=1100100&time=150&alarm=2

Ihr müsst statt 172.16.2.7 natürlich die IP eurer eigenen Uhr nutzen, aber die Parameter bleiben die gleichen.

- mode wählt den jeweiligen Modus
- color wählt die Farbe zum Ausführen des Modus, der Farbwert wird in HEX übergeben (verfügbar in Modus 4, 5, 8 und 9)
- hour: wählt die Stunde und damit auch die Anzeige auf der linken Seite (verfügbar in Modus 4, 8 und 9)
- minute wählt die Minute und damit auch die Anzeige auf der rechten Seite (verfügbar in Modus 4, 8 und 9)
- week wählt die Wochentage, an denen der Alarm ausgeführt werden soll (verfügbar in Modus 8 und 9)
- time wählt die Dauer der Funktion (verfügbar in Modus 2, 3, 4, 5, 8 und 9)
- alarm wählt die Art des Alarm für die automatischen Alarme (verfügbar in Modus 8 und 9)

Modus 1, 6, 7, 10 und 11 haben tatsächlich keine weiteren Parameter. Modus 1 muss auch prinzipiell nie ausgewählt werden, weil die Software nach dem Ausführen eines anderen Modus wieder dort hin wechselt.

Modus 6 und 7 wechseln zwischen Tag- und Nacht-Modus. Angedacht ist das, um getrennte Helligkeiten oder Farben für Tag und Nacht einstellen zu können. Auch die Parameter dafür finden sich in der Software.
Modus 10 und 11 deaktivieren beziehungsweise aktivieren den Dark Mode, in dem die LEDs der Uhr ausgeschaltet sind.
Die Umschaltung zwischen Tag und Nacht und der Dark Mode arbeiten unabhängig voneinander, können also zu jeder Zeit ausgewählt werden ohne sich gegenseitig zu beeinflussen. Wechselt etwa die Uhr während aktiviertem Dark Mode von Nacht zu Tag, so bleiben die LEDs trotzdem weiterhin ausgeschaltet.
In der Software lässt sich eine Variable für die automatische Deaktivierung des Dark Mode auf true oder false setzen. Ist diese aktiviert, dann deaktiviert die Uhr den Dark Mode nach dem Ausführen eines Alarms von Modus 4, 5, 8 oder 9, und zeigt danach wieder die Zeit an.

Modus 2 und 3 können über den Parameter time in ihrer Dauer verändert werden. Das Minumum sind fünf Sekunden, Werte darunter oder ein nicht angegebener Parameter werden auf fünf Sekunden angepasst.

Modus 4 zeigt bei die bei hour und minute angebenen Werte in der bei color gewählten Farbe für die mit time gewählte Dauer an. Für hour und minute können hier Werte bis 31 beziehungsweise 63 angegeben werden, weil die Anzahl der LEDs die Möglichkeit dafür bietet.
Sollte der Parameter für color fehlen, wird die Farbe auf Schwarz angepasst. Fehlen Werte bei hour oder minute, so ändert die Software diese auf 0. Bei time verhält es sich bei bei Modus 2 und 3 auch schon, auch mit einem Minuimum von fünf Sekunden.

Modus 5 lässt die über color ausgewählte Farbe im Kreis rotieren, und zeigt sie am Ende für fünf Sekunden auf allen LEDs an. Für die Werte von time gilt dieses Mal auf ein Minimum von sieben Sekunden, die statische Anzeige an Ende schon mit eingerechnet. Da ein Durchlauf zwei und die End-Szene fünf Sekunden dauert, werden alle gerade Zahlenwerte um eine Sekunde erhöht.

Modus 8 ist ein wiederkehrender Alarm, zu dem wir uns unser Beispiel von weiter oben nehmen. Dort wurde die Farbe auf ein helles Grün gesetzt, die Zeit auf 7:30, der Alarm wird montags, dienstags und freitags ausgeführt und zeigt für zweieinhalb Minuten die Farbe rotierend an. Die meisten Parameter sind ja schon bekannt, deswegen gehe ich jetzt nur noch auf week und alarm ein.
Die Woche wird in week in einzelnen Tagen dargestellt, deswegen hat der Parameter auch sieben Stellen. Jede davon stellt einen Wochentag von Montag bis Sonntag dar. Wird die Stelle auf 0 gesetzt, so findet an diesem Tag kein Alarm statt. Steht sie aber auf irgendeinem Wert über 0 (hier sind alle Ziffern von 1 bis 9 möglich), dann wird ein Alarm ausgelöst. Somit ist es möglich, den Alarm auf einzelne Wochentage einzustellen und etwa das Wochenende oder andere Tage auszulassen.
Mit alarm wird eingestellt, ob der Alarm über 1 die Zeit in der gewählten Farbe darstellt oder über 2 in dieser Farbe rotiert. Um den Alarm zu deaktivieren, kann dieser Parameter auch auf 0 gesetzt werden. So können alle anderen Einstellungen unverändert bleiben.

Modus 9 verhält sich fast wie Modus 8, mit der Ausnahme dass hier nur ein einmaliger Alarm stattfindet. Demnach kann im Paramter week auch nur ein Wochentag gesetzt werden. Nach dem Ausführen setzt dieser Modus den Parameter alarm selbstständig auf 0 zurück.



Alle wichtigen Paramter, die in der Software gesetzt werden müssen, sind mit Angabe der Zeile oben im Code dokumentiert und beschrieben. Ebenso müsst ihr in einer Header-Datei die Daten eures WiFis und den gewünschten NTP-Server eintragen.
Die Umstellung zwischen Sommer- und Winterzeit erfolgt automatisch. Außerdem gibt es auch passende Parameter um die Zeitverschiebung entsprechend einzustellen. In den hier herunterladbaren Versionen ist alles bereits auf den letzten Sonntag im März und Oktober so wie auf eine Zeitverschiebung von einer Stunde eingestellt. Menschen, die in der selben Zeitzone wie ich leben, müssen dort also nichts mehr verändern.



Von der Software gibt es zwei verschiedene Varianten.
Die eine beinhaltet lediglich den Code für die Uhr, und gibt alle Antworten als Plain Text über HTTP aus. Eine Ausgabe der Abfrage aus unserem Beispiel weiter oben würde folgendermaßen aussehen:

valid,r,2,0x00ff00,07:30,1100100,150

Sie sagt aus, dass die Eingabe valide war. r steht in dem Fall für repeated, weil es sich um den wiederkehrenden Alarm handelt (s bei einmaligem Alarm). Danach folgen die Angaben für die verschiedenen Parameter wie Alarm-Modus, Farbe, Uhrzeit, Wochentage und Ausführungszeit.
Diese Variante ist für all die Menschen gedacht, die ihr eignes Interface für die Uhr entwickeln oder sie einfach über die URL bedienen wollen.

Die zweite Variante beinhaltet bereits ein Interface, das auf dem Controller selbst läuft. Sie gibt alle Werte über die HTML-Header zurück.

Die ausführliche Angabe aller Parameter findet nur in Modus 8 und 9 statt. Alle anderen verfügen lediglich über die Angaben zu validen Eingaben und über den HTML-Header auch zum ausgewählten Modus.

BinaryClock(plaintext-output).zip ⇐ Software mit Plain Text-Output

BinaryClock(interface-output).zip ⇐ Software mit Interface und Header-Output