Quellcode auf GitHub: https://github.com/kaini/lcdclock im Ordner
"firmware".
Hallo,
zugegeben - nicht gerade das kreativste aller Projekte - dennoch wollte
ich eine Digitaluhr die
- bei ausrechendem Umgebungslicht lesbar ist (keine LEDs),
- von normalen Batterien betrieben werden kann,
- die Zeit von alleine einstellt und
- an einer Wand aufgehängt werden kann
selber bauen.
Als Mikrocontroller habe ich, zum ersten mal, einen STM32 gewählt.
Genauer ein STM32L073CZ der praktischerweise schon einen multiplexing
LCD-Treiber beinhaltet der in div. Sleep-Modes weiterhin läuft ohne
nennenswert Strom zu verbrauchen.
Die Firmware ist, bis auf den DCF77 Empfang, keine Hexerei: Der
Controller wacht auf, gibt die aktuelle Zeit auf das 7-Segment Display
aus und legt sich dann für eine Sekunde schlafen. Dazwischen passieren
noch ein paar Berechnungen um zwischen Sommer- und Winterzeit
umzustellen ohne eine Resynchronisierung zu brauchen.
Nachdem in Ostösterreich der DCF77-Empfang teilweise sehr abenteuerlich
ist (vielleicht auch die Schuld des DCF77-Moduls?) habe ich eine DCF77
Dekodierung à la http://www.gjlay.de/software/dcf77/konzept.html
implementiert. Diese kann in den Source-Files "dcf77_parser.cpp" und
"dcf77_parser.hpp" gefunden werden. Trotz dieser Implementierung ist das
Empfangen einer aktuellen Zeit Tagsüber oft erst nach Stunden möglich.
Um keine Batterie mit sinnlosem Zeit-Synchronisieren zu verschwenden
wird die Zeit daher nur Sonntags früh am Morgen und nach dem Einschalten
synchronisiert.
Das Gehäuse ist 3D-gedruckt (STL-Datei im Repository) und hat hinten
zwei Löcher zum Aufhängen an der Wand. Die Bauteile sind mit Heißkleber
hinengeklebt.
Das LCD-Panel hab ich mir aus China zukommen lassen und ist leider
multiplexing und transreflektiv. Um letzteres Problem zu lösen habe ich
einfach zwei Lagen weißes Papier hinter das Display geklebt. Das
Multiplexen war jedoch herausfordernder, da es leider zu sehr viel
LCD-Ghosting kam. (Die Segmente die eigentlich aus sein sollten waren
trotzdem an, weil bei einem LCD ja auch bei den aus-Segmenten Spannung
anliegt.) Das Problem konnte ich zufriedenstellend in den Griff bekommen
indem ich stundenlang mit der Konstrastspannung, der Frequenz, dem Bias
und der Dead-Time des LCD Treibers herumgespielt habe. Nächstes mal
achte ich darauf an ein statisches Display zu kommen. (Wobei das in
diesem Fall immerhin 54 Inputs wären ...)
Übrigens, angehängt ist schon eine 2. Revision der Schaltung. In der
Version die ich habe sind zwei Fehler enhalten:
- Ich habe vergessen den BOOT0 Pin zu beschalten: Das habe ich mit einer
Drahtbrücke gefixt.
- VLCD ist in meiner Version noch mit VCC Verbunden: Diese Verbindung
habe ich von der Platine gekratzt und ich verwende jetzt den internen
Spannungswandler für die LCD Spannung. Ursprünglich war geplant einfach
die Betriebsspannung als LCD-Spannung zu verwenden, aber aufgrund des
Ghosting-Problems habe ich dann doch die Flexibilität des LCD Treibers
gebraucht.
Ich habe keine Messinstrumente um den Stromverbrauch genau zu messen, er
sollte jedoch <50µA im Schnitt sein.
PS: Kann man ein PCB-Layout irgendwie schöner aus KiCad exportieren?