Programmierung der Sekundenanzeige und Fertigstellung
Für die Zeitanzeige haben wir eine Endlosschleife implementiert, in der die Sekundendarstellung der anspruchsvollste Teil ist. Zunächst laufen die vier Pixel des Sekundenwurms außen um die Uhr herum. Damit er gut sichtbar ist, führen wir ihn nicht am äußersten Rand des LED-Panels entlang, sondern rücken ihn ein bisschen nach innen.
Er folgt einem Pfad, für dessen Pixel wir ein Array definiert haben. Von diesem Array zeigen wir immer nur vier zusammenhängende Pixel in einer bestimmten Farbe an. Die restlichen Pixel werden bei jedem Initialisieren des Panels im Schleifendurchlauf geschwärzt und sind damit unsichtbar.
Den Array-Index des Führungspixels ermitteln wir aus dem Verhältnis der abgelaufenen Millisekunden zur Gesamtzahl der Millisekunden pro Umlauf (also pro Minute) und der Gesamtlänge des Pixel-Arrays. Beim Start mit dem ersten Pixel (Index = 0) und auch bei den folgenden zwei Pixeln müssen wir aufpassen, da am Pfadanfang keine vier Pixel zur Verfügung stehen. Wir nehmen also hier die jeweils fehlende Pixel-Anzahl vom Ende des Arrays hinzu.
Den laufenden Füllstand des Rhombus errechnen wir ähnlich wie den Index des Führungspixels, hier jedoch auf Basis der verstrichenen Sekunden. Nach 59 Sekunden ist die Füllhöhe von 13 Pixeln erreicht, so dass wir den Rhombus beim Vollenden der Minute wieder leeren.
Die farbigen Pixel der tröpfelnden Sekunden blenden wir in einer eigenen Schleife mit 13 Durchläufen wechselseitig ein. Die sogenannte Tropfgeschwindigkeit wird durch den Sleep-Timer am Ende der Endlosschleife bestimmt. Den Sleep-Parameter wählen wir so, dass uns die Tropfgeschwindigkeit gefällt, aber auch der Sekundenwurm läuft, ohne Sekunden zu überspringen oder auszulassen. Dies können wir allerdings nicht komplett verhindern, da die Gesamtanzahl der Pixel des Pfad-Arrays nicht ganzzahlig durch 60 teilbar ist. Am Ende ist dieser Effekt aber so gering, dass er nicht auffällt.
Bei der Gelegenheit: Die verwendeten Farben sind Konstanten, die wir in der statischen Klasse CColor definieren. Diese Klasse benutzt ihrerseits die Klasse Color, die aus der LED-Panel-Bibliothek kommt und nicht aus dem .NET-Framework System.Drawing.
Fertigstellung auf dem Raspberry
Die Skripte werden auf dem Raspberry mit folgender Anweisung in ein ausführbares Programm kompiliert. Voraussetzung hierfür ist, dass die RGBLedMatrix-Bibliothek und alle beteiligten cs-Skripte in dem Verzeichnis liegen, in dem dieser Befehl ausgeführt wird:
sudo mcs -r:RGBLedMatrix.dll -out:berlinuhr.exe programm.cs *_classes.cs
Damit die Berlin-Uhr nach dem Hochfahren des Raspberry-Computers angezeigt wird, tragen wir den Programmaufruf in die Datei /etc/rc.local ein. Unser kompiliertes Programm liegt im Verzeichnis RGBPanel des pi-Users. Wir ergänzen also in der genannten Datei vor der exit-0-Anweisung folgende Zeile:
sudo mono /home/pi/RGBPanel/berlinuhr.exe &
Das LED-Panel passt genau in einen im Einzelhandel erhältlichen 20 x 20 cm großen Bilderrahmen. Bei Verwendung des kleinen Raspberry Pi Zero kann dieser mit einer kurzen GPIO-Verkabelung an der Rückwand des Rahmens befestigt werden.
Dann bleiben nur noch das Netzteil, das irgendwo versteckt werden muss, und die Kabel für die Stromversorgung von dort zur Uhr. Damit hätten wir bei relativ wenig Aufwand eine schicke Berlin-Uhr für das Wohnzimmer fertiggestellt.
Ganz nebenbei haben wir bei diesem Projekt ein paar fortgeschrittene OOP-Konzepte verwirklicht. Diese werden wir später auch bei anderen Ausgaben auf dem LED-Panel einsetzen.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
- ohne Werbung
- mit ausgeschaltetem Javascript
- mit RSS-Volltext-Feed
C#-Klassen und cs-Skripte |
Wieso muss man dann immer wieder neue Konzepte erfinden, nur um etwas zu verkomplizieren...
Kurz nachgeschaut und ein DS3231 scheint allein schon teurer zu kommen als ein ESP-01 (z...
Statt mono könnte man auch das aktuelle dotnet (mit deutlich mehr Features) nehmen und...
Ne, die Zeiger werden per festgeklebtem Sitzstreik am weiterlaufen gehindert und dürfen...
Kommentieren