In der letzten Zeit beschäftige ich mich mit Microcontrollern und versuche kleinere Projekte damit umzusetzen. Unter anderem wies mich meine Frau darauf hin, dass eine selbst gebaute Wort-Uhr ein solches Projekt sein könnte. In einer solchen Uhr leuchten immer die passenden Wörter und ergeben somit einen Satz, der die aktuelle Uhrzeit ungefähr ablesen lässt.
Die Entwicklung dieser Uhr betrachte ich dabei in drei Arbeitsschritten, die ich auch unabhängig voneinander entwickelte: Den Bau der Hülle mit den leuchtenden Buchstaben. Den Bau der Elektronik mit Ansteuerung der einzelnen LEDs und deren Stromversorgung und die Programmierung des Microcontrollers.
Bau der Hülle aus Plexiglas
Obwohl ich das am Anfang meines Projekts nicht so einschätzte, dauerte das Erstellen der Front am längsten. Im Gegensatz zu anderen Leuten, die dieses Projekt im Internet vorstellten, wollte ich mir keine Teile fertigen lassen und somit kam ein Auftrag zum Plotten auch Klebefolie nicht in Frage. Ich möchte nicht meine ganzen Fehlversuche auflisten, also schreibe ich bloß von meiner Lösung:
Ein nutzte eine 200x300x3 mm große transparente Kunststoffscheibe (es war nicht das echte Plexiglas). Diese behandelte ich mit Sandpapier, bis sie entsprechend milchig wurde. Nun zeichnete ich darauf mit einem Masking Marker (Kreppband in Flüssig) die Buchstaben der Wörter. Nach dem Trocknen wiederholte ich das Schreiben und hatte somit eine doppelte Schicht der Maske auf der Scheibe. Nun rollte ich 4 Schichten schwarze Acrylfarbe komplett auf die Scheibe. Jeweils mit gut 24 Stunden Trockenzeit. Um die Masken wieder abzulösen, legte dich die Scheibe für 15 Minuten in ein Wasserbad. Nun muss man ganz vorsichtig mit den Fingern die Masken wieder ablösen, ohne den restlichen Belag zu beschädigen. Nach dem Trockenen kann man dann die Reste des Belags mit dem Radiergummi entfernen.
Auf der Rückseite (in meinem Falle ein Prototyp der Frontseite) sägte ich ein Loch für einen Dual-Nummer-LED-Modul ein, welches ich noch liegen hatte. Das Loch platzierte ich genau dort, wo auf der Frontseite keine Wörter waren. Außerdem setzte ich noch zwei kleine Druckknöpfe ein.
Nun nutzte ich Styropor, um zwischen den späteren Wörtern Wände herzustellen. Dafür schnitt ich an den entsprechenden Stellen das Material weg. Außerdem musste ich noch dort Styropor entfernen, wo die elektronischen Elemente an der Rückseite angebracht waren.
Nach dem Fertigstellen der Elektronik setzte ich die Styropor-Maske mit Leim auf die Rückseite und malte diese mit schwarzer Farbe an. Dabei versuchte ich auch die Rückseite an den entsprechenden Stellen schwärzen, aber ohne die LEDs zu treffen. Auch die Vorderseite wurde dann mit Leim auf der Rückseite befestigt. Dies hat nun allerdings den Nachteil, dass ich keine Reparaturen mehr vornehmen kann, ohne die ganze Sache zu zerbrechen. Die Ränder befüllte ich vorsichtig mit Spachtelmasse und schliff dann überstehendes Material ab. Danach wurden die Seiten noch mit schwarzer Farbe verziert.
Aufbau der Elektronik
Als Microcontroller nutze ich einen Nachbau eines Arduino Nano. Somit standen mir 14 digitale und 8 analoge Ein- und Ausgänge zur Verfügung. Für die Frontseite brauchte ich 21 Ausgänge für die Wörter. Dazu kommen 9 Ausgänge für die duale 7-Sigment-Anzeige und 2 Pins für die Steuerung der I2C-Leitungen des Echtzeitmoduls. Dazu kommen 2 Pins für das Auslesen der Schalter. Insgesamt summierten sich also 34 Leitungen.
Um die vielen Ausgänge zu schalten wählte ich drei hintereinander geschaltete Schieberegister 74HC595. Diese kann ich mit nur 3 Ausgang-Pins ansteuern. Der Nachteil von Schieberegistern ist, dass man für das Ändern eines Bits immer alle 24 Bits neu auf die Register schieben musst.
Wie man einen 74HC595 an einen Arduino anschließt, ist im Netz gut dokumentiert. Auch Anleitungen für mehrere hintereinander gibt es zu lesen, weshalb ich auf diese Doku verzichte.
Die 7-Sigment-Anzeige verschaltete ich so, dass ich die beiden Ziffern mit den gleichen Ausgängen nutzen konnte. Mit einem zusätzliche Pin kann ich dann zwischen der einen und der anderen Seite hin und her schalten, um beide Seiten zu nutzen. In der Programmierung mache ich das so schnell, dass es das menschliche Auge nicht mehr sieht und man denkt, dass beide Seiten leuchten. Hinter den Ausgängen des 74HC595 schaltete ich noch einen Widerstand, wie im Schaltplan zu sehen ist.
Für die Wörter nutzte ich je Wort immer zwei weiße LEDs. Vor jede LED setzte ich einen passenden Widerstand zu der 5 Volt Betriebsspannung. Der vorgeschaltete NPN-Transistor sorgt dafür, dass die beiden LEDs ausreichend Strom zur Verfügung haben. Im folgenden Schaltplan-Auszug ist die Schaltung zu sehen.
Die beiden Schalter verband ich direkt mit dem Arduino, genauso wie alle LEDs, die nicht mehr an die 24 Ausgänge der Schieberegister passten. Die I2C-Anschlüsse wurden auch direkt verbunden. Zur Stromversorgung nutze ich ein altes USB-Kabel, welches ich mit den Volt-In des Arduino verband.
Der zusätzlich zum Arduino eingebaute IC DS1307 ist eine Real-Time-Clock (RTC, Echtzeituhr). Im Gegensatz zum Arduino hat dieser einen kleinen Quarz und eine Batterie integriert. Somit zählt dieser auch die Sekunden weiter, wenn der Arduino keinen Strom hat. Man kann also richtig mit der Uhrzeit arbeiten, wenn man eine entsprechende Bibliothek verwendet.
Aufbau der Programmierung
Ich entwickelte die Software in Visual Studio Code mit dem PlatformIO-Framework. Ich unterteilte das Programm in zwei Bibliotheken und der Hauptdatei.
Zuerst überlegte ich mir in einer Tabelle, zu welcher Minuten-Zeit welche Wörter zu sehen sein sollen. Daraus generierte ich mir dann entsprechende Funktionen für diese LEDs. Diese habe ich in der Datei clock_functions.cpp
zusammengefasst.
Für die Steuerung der Uhr fasste ich die Funktionen in der Datei ClockHandling.cpp
zusammen. Durch das Drücken des Modus-Buttons kann man zwischen den Stunden und Minuten wechseln. Nach 5 Sekunden ohne Tastendruck wechselt er wieder in den normalen Anzeigemodus. Durch Drücken des Set-Buttons wird entweder die Stunde oder die Minute erhöht, je nachdem welcher Modus aktiv ist. Die Änderung wird direkt im RTC-IC gespeichert.
In der Hauptdatei wird die Initialisierung, die Anzeige und die Abfrage der Buttons durchgeführt. Bei der Abfrage werden die Pins auf den internen PULLUP-Widerstand gelegt. Somit zieht das Drücken der Buttons den Wert gegen Ground. Um das Flackern zu verhindern, habe ich eine kleine Zeitschranke integriert, die erst nach 100 ms den Button als gedrückt ansieht.
Dann unterscheidet das Programm zwischen dem normales Modus und dem Einstellungsmodus. Im letzteren zeigt es abwechselnd für 5 ms jeweils eine Seite der Segmentanzeige an. Dafür schiebt es nur die relevanten Bits auf die Register. Alle anderen Bits bleiben auf 0 und somit die Wörter aus.
Im normalen Modus schiebt das Programm die aktuell gültigen Werte für die Wörter auf die Register. Die Werte für die Segmentanzeige bleiben auf 0. Dies passiert dann nur jede halbe Sekunde. Die Werte für die einzelnen Wörter sind als Bitmuster im Code hinterlegt und werden entsprechend kombiniert.
Fazit
Man kann ein solches Projekt weiterempfehlen. Ich habe dabei viel gelernt:
- Bearbeitung von Plexiglas
- Acrylfarbe mit Maskierungsmarkern
- Zeichnen von Schaltplänen mit KiCad
- Lesen und Verstehen von Datenblättern
- Berechnen von Widerständen und Strom
- Arbeit mit Transistoren
- Schieberegister und deren Programmierung
- Löten von SMD-Bauteilen
- PlatformIO und Arduiono-Programmierung
- C++-Verständnis weiter ausgebaut