Projekt: Matrixuhr

Matrixuhr-Bild Diese Uhr verwendet ein aus 2048 RGB-LEDs bestehendes Matrix-Panel als Anzeige. Hier werden neben der Uhrzeit in großen Ziffern auch verschiedene andere Daten angezeigt: Datum, Wochentag, Sensordaten und Alarme vom Temperatur-Messsystem, Geburtstage, Wetterinformationen sowie eine Textnachricht als Laufschrift. Welche Daten verfügbar sind, hängt vom gewählten Betriebsmodus ab. Beim autonomen Betrieb erscheinen nur Zeit, Datum und Wochentag, die Synchronisierung erfolgt über einen DCF77-Empfänger. Mehr Möglichkeiten bietet eine Verbindung mit dem Temperatur-Messsystem: Hier arbeitet die Uhr als Anzeigemodul und kann praktisch alle verfügbaren Sensordaten und Alarme anzeigen. Noch mehr Komfort ermöglicht die Verbindung der Uhr mit dem Web-Modul des Temperatur-Messsystems oder mit einem zusätzlichen Raspberry Pi: In diesen Modi können zusätzlich Geburtstage verwaltet und weitere 4 Alarme (z.B. für Temperaturüberwachungen) definiert werden. Außerdem besteht die Möglichkeit, Wetterdaten und Kraftstoffpreise anzuzeigen. Die Uhr benötigt hier keinen DCF77-Empfänger und kann über Zeitserver synchronisiert werden. Außerdem ist es möglich, eine Textnachricht in einem Web-Formular zu hinterlassen, die dann als Laufschrift auf der Uhr erscheint.

Symbol Status
Statusaktiv
Letzte Bearbeitung21.02.2024
Aktueller Softwarestand Mikrocontrollerv2.20 vom 16.02.2024
Aktueller Softwarestand Raspberry Piv4.30 vom 16.02.2024
SymbolDownloads
Schaltplan
Stückliste mit Empfehlungen zur Bauteilbestellung
Software v2.20 für ATmega1284P mit komplettem Quelltext in C vom 16.02.2024matrixuhr-atmega1284p-v220.zip
Sound-Paket mit 6 Klängen für den MP3-Player der Matrixuhrmatrixuhr-sounds.zip
Platinen-Layout (Eagle und PDF) vom 06.04.2019 von Thomas Zetschematrixuhr-layout.zip
Software-Paket v4.30 für Raspberry Pi vom 16.02.2024matrixuhr-files-v430.tar.gz
Raspberry Pi Homepage - Raspberry Pi OS (32-bit) Lite (Betriebssystem für Raspberry Pi) https://www.raspberrypi.org/software/operating-systems/
Raspberry Pi Homepage - Raspberry Pi Imager (microSD-Karte für Raspberry Pi erstellen) https://www.raspberrypi.org/software/
Homepage von Win32 Disk Imager (Images auf Speicherkarten schreiben oder von Speicherkarten lesen) https://sourceforge.net/projects/win32diskimager/
Homepage von PuTTY (SSH-Client)http://www.putty.org/
Homepage von Angry IP Scanner (Netzwerk durchsuchen)https://angryip.org/
Homepage von FileZilla Client (Datenaustausch zwischen PC und Raspberry Pi) https://filezilla-project.org/
Symbol Inhaltsverzeichnis
BeschreibungAllgemeine Informationen über die Matrixuhr
SchaltungBeschreibung der Schaltung
HardwareBilder und Hinweise zum Aufbau der Uhr
SoftwareBeschreibung der Software der Uhr
InbetriebnahmeInbetriebnahme der Uhr
UpdateUpdate von einer früheren Programmversion
BedienungBedienungsanleitung und komplette Beschreibung aller Funktionen
Weitere InformationenInformationen über die Anzeige von Daten und Alarmen
SonstigesEinige Hintergrundinformationen zur Entwicklung der Uhr
Symbol Beschreibung

In meinem Haus haben sich inzwischen viele verschiedene Uhren angesammelt. Die meisten davon arbeiten eigenständig und haben keine Verbindung zu anderen Geräten. Die hier vorgestellte Matrixuhr kann natürlich ebenfalls so betrieben werden, aber sie bietet zusätzlich die Möglichkeit, über eine Verbindung zum Temperatur-Messsystem zusätzliche Informationen anzuzeigen. Dazu wird die Uhr wie ein Modul des Temperatur-Messsystems über eine einfache RS-232-Verbindung mit 9600 Baud ins System eingebunden und empfängt dann alle Daten des Sensormoduls. Und es geht noch mehr: Die Matrixuhr kann über eine Datenleitung mit dem Web-Modul verbunden oder mit einem Raspberry Pi Zero WH bestückt werden. Damit sind weitere Informationen wie z.B. Geburtstage, Wetterdaten und Kraftstoffpreise darstellbar und alle für die Matrixuhr bestimmten Daten lassen sich dann komfortabel mit einem Web-Browser konfigurieren. Die folgende Übersicht zeigt die 4 möglichen Betriebsarten der Matrixuhr:

  1. Autonomer Betrieb
    Die Uhr arbeitet eigenständig ohne eine Datenverbindung. Die Synchronisierung der Uhr erfolgt über einen DCF77-Empfänger. Angezeigt werden neben der Uhrzeit das Datum und der Wochentag.
  2. Sensormodul-Betrieb (RS-232-Verbindung zum Sensormodul)
    Die Uhr wird auch in dieser Betriebsart mit einem DCF77-Empfänger synchronisiert. Neben Uhrzeit, Datum und Wochentag lassen sich hier alle 31 Sensoren und 4 Alarme des Temperatur-Messsystems anzeigen. Es besteht außerdem die Möglichkeit, ein Filter zu aktivieren und bis zu 8 Sensoren für die Anzeige zu selektieren. Hier kann dann auch ein Name mit einer Länge von maximal 5 Zeichen vergeben werden. Auch für die Alarme können Namen definiert werden, die bis zu 12 Zeichen lang sein können. Alle Einstellungen werden hier direkt an der Uhr durchgeführt.
  3. Web-Modul-Betrieb (RS-232-Verbindung zum Web-Modul)
    Diese Betriebsart bietet mehr Komfort. Hier sind an der Uhr nur Grundeinstellungen notwendig, alle anzuzeigenden Daten werden über ein Formular im Web-Modul konfiguriert. Dabei können neben den 31 Sensoren und 4 Alarmen des Temperatur-Messsystems auch Geburtstage, Wetterinformationen und Kraftstoffpreise angezeigt werden. Weitere 4 Alarme stehen zur Verfügung, um Sensorwerte zu überwachen oder Alarme zu bestimmten Zeiten auszulösen. Außerdem ist es möglich, eine Nachricht von bis zu 100 Zeichen einzugeben, die dann als Laufschrift auf der Uhr erscheint. Ein DCF77-Empfänger ist bei dieser Betriebsart nicht erforderlich, die Uhr kann direkt vom Web-Modul synchronisiert werden.
  4. Raspberry-Pi-Betrieb (Raspberry Pi in der Matrixuhr)
    Dies ist die komfortabelste Betriebsart. Die Funktionalität ist hier weitgehend identisch zum Web-Modul-Betrieb. Technisch unterscheidet sich diese Betriebsart durch den festen Einbau eines Raspberry Pi Zero WH in der Matrixuhr. Dieser bietet die Möglichkeit, alle notwendigen Daten über WLAN zu empfangen, somit ist keine Kabelverbindung für die Datenkommunikation notwendig. Weiterhin kann ein 1-Wire-Temperatursensor angeschlossen werden.

Die folgende Tabelle vermittelt einen Überblick über die 4 Betriebsarten und die damit möglichen Zusatzfunktionen:

BetriebsartSensordatenAlarmeGeburtstageWetterdatenKraftstoffpreiseTextnachricht1-Wire-Sensor
Autonomer Betrieb
Sensormodul-Betrieb
Web-Modul-Betrieb
Raspberry-Pi-Betrieb

Das auffälligste und namensgebende Merkmal der Uhr ist das Matrix-Display. Dieses besteht aus 2048 RGB-LEDs, die in einer Matrix von 64 Spalten und 32 Reihen angeordnet sind. Auf dem Panel sind bereits LED-Treiber und mehrere Schieberegisterketten integriert, so dass eine relativ einfache Ansteuerung über einen Mikrocontroller (hier ein ATmega1284P mit 20MHz) möglich ist. Die LEDs können unter optimalen Bedingungen den gesamten Farbraum abdecken, in der Matrixuhr werden jedoch nur 16 Farben verwendet. Diese sind allerdings in einem weiten Bereich in der Helligkeit steuerbar und das wird mithilfe eines Fototransistors zur Helligkeitsregelung genutzt. Im normalen Betrieb verwendet die Uhr nur 3 Farben: eine für die Uhrzeit, eine für Zusatzinformationen wie Datum, Wochentag, Sensorwerte, Geburtstage und Wetterinformationen sowie eine weitere für Alarmmeldungen. Jede dieser 3 Farben kann manuell festgelegt oder per Zufall bestimmt werden. Im Zufallsmodus erfolgt die Farbänderung zu jeder vollen Stunde. Bei den Farben gibt es allerdings eine Ausnahme: Die Uhr kann verschiedene Symbole darstellen und diese haben feste Farben, die nicht geändert werden können.

Die Anzeige der Uhrzeit und der Zusatzinformationen erfolgt im normalen Betrieb der Uhr so wie es im Titelbild dargestellt ist. Die Uhrzeit wird mit 18 Pixel hohen Ziffern angezeigt und die Zusatzinformationen darunter mit einer 11 Pixel hohen Schrift, die auch Umlaute und Unterlängen darstellen kann. Treten Alarmmeldungen auf, dann schaltet die Uhr in einen 3-zeiligen Modus um. Die Ziffernhöhe der Uhrzeit wird dabei auf 8 Pixel verringert und die beiden Zeilen darunter zeigen dann Zusatzinformationen und Alarme jeweils mit einer 11 Pixel hohen Schrift an. So gehen keine Informationen verloren - bis auf eine Ausnahme: Wird eine Textnachricht zur Uhr gesendet, dann überdeckt diese eventuell anstehende Alarmmeldungen.

Zur Signalisierung von Alarmen kann die Matrixuhr insgesamt 6 verschiedene Klänge erzeugen. Diese sind auf einer microSD-Karte gespeichert und werden über ein MP3-Player-Modul abgespielt, welches als Bausatz bei ELV erhältlich ist. Dieses Modul hat bereits einen NF-Verstärker an Bord, so dass direkt ein kleiner Lautsprecher angeschlossen werden kann. 4 Klänge sind für die Alarme vorgesehen, einer für den Stundengong und ein weiterer für die bereits erwähnte Laufschrift-Nachricht.

Zur Bedienung der Matrixuhr sind insgesamt 3 Taster vorgesehen. Über 2 Taster lässt sich ein Menü aufrufen, in dem verschiedene Einstellungen vorgenommen werden können. Ein weiterer Taster dient zum Quittieren von Alarmmeldungen, die vom Sensor- oder Web-Modul empfangen wurden. Diesen Taster habe ich als Berührungssensor realisiert. Eine Sensorfläche innerhalb der Gehäuse-Unterseite erkennt gemeinsam mit einem speziellen IC eine Berührung des Gehäuses und löst dann die Tasterfunktion aus.

Beim Sensormodul-Betrieb und Web-Modul-Betrieb ist für die Verbindung zum Sensor- bzw. Web-Modul eine unidirektionale RS-232-Verbindung notwendig. Hier arbeitet das Sensor- bzw. das Web-Modul als Datensender und die Matrixuhr empfängt Daten. Hierfür kann entweder ein geschirmtes Kabel (Mikrofonkabel) oder z.B. auch eine Doppelader in einem vorhandenen LAN-Kabel verwendet werden. Eine RS-232-Verbindung über Funk ist möglich, erfordert aber relativ teure Module (z.B. XBee). Hier ist der Raspberry-Pi-Betrieb die bessere Alternative: Es wird kein Datenkabel benötigt und man hat zudem den Komfort, dass viele Einstellungen über eine Web-Seite durchgeführt werden können.

Die Matrix-Displays gibt es übrigens in mehreren Baugrößen mit LED-Abständen von 2.5, 3, 4, 5 und 6mm, viele Händler verwenden dabei die Größenangaben P2.5, P3, P4, P5 und P6. Damit lässt sich die Matrixuhr in Größen von 160mm x 80mm bis 384mm x 192mm aufbauen. In dem hier beschriebenen Projekt habe ich die 5mm-Version (P5) verwendet. Leider ist das Matrix-Display in Deutschland nicht immer erhältlich und auch relativ teuer. Man kann bei Alternativen wie z.B. AliExpress oder ebay bestellen, sollte dabei aber einige Dinge beachten: Das Display muss einen HUB75-Anschluss haben und mit 1/16 Scan oder 1/8 Scan arbeiten. Der Scan-Wert bestimmt das verwendete Multiplexverfahren. Ein weiteres Detail ist die Größe der LEDs. Viele Hersteller verwenden sehr kleine LEDs und das sieht bei den größeren Display-Varianten ab P4 nicht sehr schön aus. Hier sollte man sich die Produktbilder genau anschauen.

Leider gibt es bei den Matrix-Displays einen Kritikpunkt: Bei niedrigen Helligkeiten in dunkler Umgebung fallen (abhängig vom Bildinhalt) schwach leuchtende Pixel auf, die eigentlich gar nicht angesteuert werden. Wenn man ganz nah an das Display herangeht, dann sieht das sogar recht schlimm aus. In einem Abstand von 2m betrachtet fällt es allerdings weniger auf. Dieser Effekt lässt sich leider auch nicht mit einer anderen Ansteuerung beseitigen. Allerdings werden die Displays immer besser und bei aktuellen Versionen sind kaum noch solche Fehlerpixel zu sehen.

Symbol Schaltung

Schaltung

Alle Funktionen der Matrixuhr werden vom Mikrocontroller IC1 (ATmega1284P) gesteuert. Dieser arbeitet mit der maximalen Taktfrequenz von 20MHz, um das Display schnell genug mit Daten versorgen zu können. Dieses hat trotz integrierter Treiber, Schieberegister und Latches keinerlei Intelligenz und muss ständig im Multiplexbetrieb aufgefrischt werden. Je nach Display-Typ bilden jeweils 16 LED-Zeilen (1/16 Scan) oder 8 LED-Zeilenpaare (1/8 Scan) eine Multiplexeinheit, somit sind bei diesem 32-zeiligen Display zwei solche Einheiten für die obere und untere Bildhälfte vorhanden. Diese werden immer gemeinsam angesteuert, nur die Farbwerte werden getrennt zugeführt. Wie das genau funktioniert, ist im Abschnitt Software beschrieben. Der Anschluss des Displays erfolgt über den 16-poligen Pfostenstecker J3, von dem 13 Leitungen mit dem Controller IC1 verbunden sind. Die Ports PC2-PC4 geben die RGB-Farbdaten an die obere Bildhälfte aus, die Ports PC5-PC7 an die untere Bildhälfte. Die Ports PA0-PA3 selektieren eine der 16 Bildzeilen für die Multiplexausgabe, bei 1/8 Scan werden nur die Ports PA0-PA2 verwendet. Über die verbleibenden 3 Leitungen erfolgt die Steuerung der Datenausgabe: PB0 bestimmt den Takt für die Ausgabe einer Bildzeile, PA4 gibt das Signal zum Speichern einer gesendeten Bildzeile und über PA5 können die LED-Ausgänge ein- und ausgeschaltet werden. R2 sorgt für einen High-Pegel an PA5 während des Systemstarts sowie während der Programmierung des Controllers und verhindert damit ein Flackern des Displays.
Die Kondensatoren C4 und C5 am Quarz sind hier absichtlich so dimensioniert worden. Das Datenblatt empfiehlt maximal 22p und damit lief die Uhr etwas zu schnell (ging mehrere Sekunden pro Tag vor). Mit den hier verwendeten Werten läuft meine Uhr nun relativ genau. Die Werte sind allerdings abhängig vom Quarz und es kann durchaus sein, dass beim Nachbau die Bedingungen anders sind. Bei Problemen sollte am besten für beide Kondensatoren 22p verwendet werden.

Für die Soundausgabe kommt hier ein MP3-Modul von ELV (MSM2) zum Einsatz. Dieses wird auf die 26-polige Buchsenleiste J4 aufgesteckt und enthält bereits alle wichtigen Komponenten: Mikrocontroller, Steckplatz für eine microSD-Karte mit den Klängen, MP3-Player und Mono-NF-Verstärker. Leider sind die Steuereingänge intern als 4x3-Matrix geschaltet und können nur durch potentialfreie Schaltkontakte ausgelöst werden. Aus diesem Grund ist die Ansteuerung etwas aufwändiger und erfordert die Bauteile T1-T6 und R3-R8. Alternativ kann auch das MP3-Modul MSM4 verwendet werden. Dieses ist weitgehend kompatibel zum MSM2, hat aber direkte Steuereingänge für jeden Klang. Hier sorgen die Bauteile T1-T6 und R3-R8 für eine Anpassung an die 3,3V-Logik des MSM4. Angesteuert werden die Transistorschalter über die Controllerausgänge PB1-PB6, jeder Ausgang aktiviert jeweils einen von 6 Sounds. Zusätzlich wird noch PD1 verwendet, um das MP3-Modul nach einem Systemstart etwas verzögert über einen Low-Pegel einzuschalten. Das ist notwendig, weil die Anschlüsse PB5 und PB6 mit der ISP-Funktion belegt sind und somit bei einem Programmiervorgang von IC1 ungewollt Sounds ausgelöst werden könnten. Um die Sounds hörbar zu machen, ist noch ein 8Ω-Lautsprecher notwendig, dieser wird an den Steckverbinder J5 angeschlossen. Leider hat das Modul einen kleinen Schönheitsfehler: die Klänge werden etwas verzögert abgespielt. So ertönt der Stundengong ungefähr eine Sekunde später, aber damit kann man leben. Die MP3-Module MSM2 und MSM4 kann man übrigens als Fertiggerät und als Bausatz kaufen. Der Bausatz ist etwas günstiger und relativ schnell zusammengesetzt, da nur Steckverbinder aufgelötet werden müssen.

Je nach Betriebsart der Uhr wird ein DCF77-Empfänger benötigt. Ich habe in meiner Schaltung einen Empfänger von Pollin verwendet, der über den Steckverbinder J6 angeschlossen wird. Es kann grundsätzlich jeder DCF77-Empfänger verwendet werden, der die Sekundenimpulse direkt an einem Ausgang liefert. Dieses Signal wird am Anschluss PA6 vom Mikrocontroller gelesen und verarbeitet. Beim Pollin-Empfänger muss man beachten, das die Betriebsspannung nicht höher als 3,3V sein darf. Die Bauelemente R9, D1 und C6 sorgen hier für die richtigen Spannungswerte und reduzieren außerdem Störungen auf der Betriebsspannung. Wird ein anderer Empfänger verwendet, dann kann D1 weggelassen werden.
Leider enthält die Uhr 2 Komponenten, die einen sicheren DCF77-Empfang verhindern: das Matrix-Display und das Schaltnetzteil. Das Display lässt sich zwar zu einer einstellbaren Zeit abschalten, das Netzteil jedoch nicht. Vielleicht gelingt die Synchronisierung, wenn man Netzteil und Empfänger mit größtmöglichem Abstand montiert. Höchstwahrscheinlich wird man den Empfänger außerhalb der Uhr betreiben müssen.

Für die Helligkeitssteuerung ist der Fototransistor T7 vorgesehen, der über den Steckverbinder J7 angeschlossen wird. Dessen Kollektor liegt an +5V und der Emitter ist mit R10/R11 als Last gegen Masse beschaltet. So entsteht am Emitter eine Spannung, die dem Helligkeitswert entspricht. Diese wird mit C7 etwas gefiltert und über den Anschluss PA7 vom Mikrocontroller gemessen. Mit R11 lässt sich die Empfindlichkeit anpassen. Aus dem Helligkeitswert wird ein PWM-Wert ermittelt und über den Anschluss PA5 erfolgt dann die Helligkeitssteuerung des Displays.

Die Bauteile J8, R12, D2 und T8 sind optional und für die Datenübertragung zuständig. Diese bilden einen einfachen RS-232-Empfänger, der beim Sensormodul-Betrieb und Web-Modul-Betrieb für die Übertragung der Sensordaten und Alarminformationen benötigt wird. Der vom Hohlsteckverbinder J8 kommende RS-232-Pegel von bis zu ±12V wird auf 5V-Pegel umgesetzt und das Signal außerdem invertiert. Der Controller liest dann die seriellen Daten über den Anschluss PD2 (RXD1) ein. Grundsätzlich besteht die Möglichkeit, die RS-232-Verbindung über Funk zu realisieren. Es gibt Funkmodule im Frequenzbereich 433MHz, 868MHz und 2,4GHz, die hier verwendet werden können, siehe dazu auch das Kapitel Datenkommunikation vom Temperatur-Messsystem.

Die beiden Bauelemente D3 und R13 waren eigentlich nur für Testzwecke gedacht. Über die LED kann wahlweise das DCF77-Signal oder der RS-232-Datenempfang beobachtet werden. Die Auswahl der gewünschten Funktion erfolgt über das Einstellungs-Menü der Uhr.

Ein weiterer Schaltungsteil ist für die Eingabefunktionen der Uhr zuständig. Dafür sind 3 Taster vorgesehen: Taster 1 ruft das Einstellungs-Menü auf und schaltet zur nächsten Einstellung weiter. Taster 2 ändert die gerade ausgewählte Einstellung und schaltet im Normalbetrieb der Uhr die Mute-Funktion (Stummschaltung) ein oder aus. Taster 3 wird nur benötigt, wenn die Uhr Daten vom Temperatur-Messsystem oder einem Raspberry Pi empfängt und dient zum Quittieren von Alarmmeldungen. Für diese Funktion habe ich anstatt eines mechanischen Tasters ein Sensorelement verwendet. Dieses besteht aus einem Streifen Aluminiumblech, der im Inneren des Holzgehäuses untergebracht ist und über J9 mit der Schaltung verbunden wird. Berührt man das Gehäuse an der entsprechenden Stelle, dann wird das von IC3 erkannt und ein Schaltimpuls ausgegeben, der über T9 vom Mikrocontroller wie ein Tastendruck ausgewertet wird. Leider wird IC3 nicht mehr produziert und für den Nachbau muss man entweder auf einen normalen Taster (S3) ausweichen oder ein alternatives Sensorelement (siehe Stückliste) verwenden.

Der restliche Schaltungsteil ist wieder optional und wird nur beim Raspberry-Pi-Betrieb benötigt. Hier hat die Buchsenleiste J10 die Funktion, einen Raspberry Pi Zero WH aufzunehmen und einige Datenverbindungen zu diesem herzustellen. Alternativ kann auch ein Raspberry Pi Zero W verwendet werden, hier muss dann aber noch die notwendige 40-polige Stiftleiste beschafft und aufgelötet werden. Ebenso ist auch die Verwendung des neueren Raspberry Pi Zero 2 W möglich. Über Pin8 (TXD) von J10 sendet der Raspberry Pi Zero WH Daten zum Anschluss PD2 (RXD1) des Mikrocontrollers IC1. Umgekehrt kann der Raspberry Pi über Pin10 (RXD) Daten vom Mikrocontroller über dessen Anschluss PD3 (TXD1) empfangen. Hier müssen allerdings die Widerstände R17 und R18 zur Pegelanpassung an die 3,3V-Logik des Raspberry Pi eingefügt werden. Bei Bedarf kann ein 1-Wire-Temperatursensor IC4, z.B. DS18B20 an den Raspberry Pi angeschlossen werden und dessen Wert wird dann ebenfalls zur Matrixuhr übermittelt. Die 1-Wire-Datenleitung wird über Pin7 von J10 an den Raspberry Pi angeschlossen, der erforderliche Pull-Up-Widerstand R19 ist mit 3,3V verbunden. Im Gegensatz zu den Sensoren des Temperatur-Messsystems muss dieser Sensor über 3 Leitungen angeschlossen werden. Der Taster 4 am Anschluss 11 des Raspberry Pi wird normalerweise nicht benötigt. Über diesen kann der Raspberry Pi heruntergefahren werden, falls dies über die Matrixuhr-Taster nicht möglich ist. Die Stromversorgung des Raspberry Pi erfolgt über die 5V der Matrixuhr. Weitere Anschlüsse des Raspberry Pi (Kamera, USB und HDMI) werden nicht verwendet.

Die Stromversorgung der Uhr besteht aus einem leistungsstarken Schaltnetzteil, welches an die Schraubklemmen J1 angeschlossen wird und 5V mit bis zu 5A liefert. Der größte Verbraucher ist das Matrix-Display, welches bis zu 4A aufnimmt, wenn man die Uhr über das Einstellungs-Menü in den Matrix-Test schaltet. In der Praxis liegt der Strombedarf meist unter 1A, da immer nur ein Teil der LEDs für die Darstellung der Informationen aktiv ist. Ein weiterer nicht zu unterschätzender Verbraucher ist das MP3-Modul. Im Ruhezustand verbraucht es nur wenige mA, während des Abspielens können jedoch je nach eingestellter Lautstärke bis zu 500mA fließen. Auch der Raspberry Pi benötigt bis zu 300mA Strom, insgesamt ist das Netzteil also nicht überdimensioniert.

Der Verkabelungsplan im nächsten Bild zeigt alle Komponenten der Matrixuhr und die notwendigen Verbindungen. Flachbandkabel und Stromkabel für das Matrix-Display liegen übrigens dem Display bei. Am Stromkabel sind bereits Kabelschuhe angebracht, die an das Netzteil passen, wenn man sie ein wenig zusammenbiegt.

Verkabelungsplan

Wichtiger Hinweis: Normalerweise verwende ich Netzteile, bei denen man nicht mit der Netzspannung in Berührung kommt. Bei diesem Projekt habe ich ein preisgünstiges Industrienetzteil gewählt, bei dem die Netzspannung mit Schraubklemmen angeschlossen werden muss. Hier muss sehr sorgfältig gearbeitet werden und selbstverständlich nur im spannungsfreien Zustand! Eigentlich darf das nur ein Fachmann tun und wer sich das nicht zutraut, sollte besser auf ein Netzteil mit einem steckbaren Netzanschluss zurückgreifen. In der Stückliste habe ich eine passende Alternative angegeben. Hier lassen sich allerdings die Kabel zum Display und zur Controllerplatine nicht direkt anschließen. Entweder muss ein passender Adapter gebastelt werden oder man schneidet den Stecker an der 5V-Seite ab und schließt das Kabel direkt an die Schraubklemmen der Controllerplatine an. Die Kabelschuhe des Displaykabels kann man ebenfalls hier anklemmen (eine Seite des Kabelschuhs direkt in die Klemme stecken).

Übrigens, die Taster T1 und T2, das Potentiometer R11, die LED D3 und den ISP-Anschluss J2 habe ich so auf der Controllerplatine untergebracht, dass sie später durch die rechte Gehäuse-Seitenwand zugänglich sind.

Symbol Hardware

Platine1 Auch für dieses Projekt wurde wieder eine Lochrasterplatine verwendet. Diese hat das Euroformat (160mm x 100mm) und ist eigentlich etwas zu groß für die relativ wenigen Bauteile. Zufällig stimmt aber die Platinenlänge mit der Displayhöhe überein und so passt die Platine hochkant genau hinter das Display. Die Oberseite auf dem Bild mit den Bedienelementen befindet sich dann an der rechten Gehäusewand. Meine Matrixuhr läuft übrigens im Web-Modul-Betrieb, verwendet also die RS-232-Option und ist über ein Kabel mit dem Web-Modul meines Temperatur-Messsystems verbunden.

Die Unterseite auf dem Bild liegt später im Innenraum des Uhrengehäuses und hier sind bis auf eine Ausnahme alle Anschlüsse untergebracht. Das sind von links nach rechts: J8 (RS-232-Datenleitung), J6 (DCF77-Empfänger), J3 (Matrix-Display), J1 (Stromversorgung), J9 (Quittierungssensor), J7 (Helligkeitssensor) und J5 (Lautsprecher). Die Anordnung muss man übrigens nicht so übernehmen, nur J3 sollte ungefähr in der Mitte sitzen, damit das Flachbandkabel gerade zum Display geführt werden kann.

Im Mittelfeld befindet sich der Mikrocontroller IC1, rechts daneben das Sensor-IC IC3 auf einer SMD-Adapterplatine und die notwendige Außenbeschaltung. Rechts oben ist das MP3-Modul und die Bauteile für die Ansteuerung der Sounds zu sehen. Die Bedienelemente T1, T2, J2, R11 und D3 auf der oberen linken Seite befinden sich (wie schon erwähnt) nach dem Einbau der Platine an der rechten Gehäusewand und sind dann von außen zugänglich.

Auf diesem Bild fehlen noch die 3mm-Löcher für die Befestigung im Gehäuse. Diese habe ich erst nach Fertigstellung des Gehäuserahmens gebohrt. Auch der Widerstand R15 fehlt noch und der Kondensator C11 besteht hier aus 5 parallel geschalteten 100n Kondensatoren. Ursprünglich waren 470n vorgesehen (aber leider gerade nicht vorhanden), später wurde C11 auf 1µ vergrößert. Der Jumper J12 fehlt hier ebenfalls.

Platine2 Die Platinenunterseite besteht aus einigen dicken Drähten (0,5mm) für Masse und Stromleitungen sowie aus jeder Menge Kupferlackdrähten (0,3mm) für die Signalleitungen. Zu beachten ist, dass die Kondensatoren C2 und C3 über möglichst kurze Verbindungen mit IC1 verbunden werden. Das gleiche gilt auch für den Quarz X1 mit den beiden Kondensatoren C4 und C5. Außerdem empfiehlt es sich, die Schaltung für den Quittierungssensor möglichst nah um IC3 zu platzieren.

Die hier verwendete Platine hat am Rand zwei Leiterstreifen, die man gut für Masseverbindungen verwenden kann. Ich weiß allerdings nicht mehr, wo ich diese Platine herbekommen habe. Bei Reichelt konnte ich diese Variante leider nicht finden. Jede andere Lochrasterplatine im Euroformat erfüllt an dieser Stelle aber auch ihren Zweck.

Gehäuse1 Das Gehäuse besteht im Prinzip nur aus einem 8mm dicken Rahmen aus Sperrholz mit den Innenmaßen 320mm x 160mm, was genau der Displaygröße entspricht. Die Vorderseite (hier im Bild) wird später mit dem Display ausgefüllt und die zur Wand zeigende Rückseite bleibt einfach offen. Die inneren Holzelemente bestehen aus massivem Buchenholz mit einer Dicke von 10mm. Hier liegt dann das Display auf und wird von hinten festgeschraubt. Dafür dienen die 4 Löcher in den Ecken sowie 2 weitere Löcher in der Mitte der Längsseite. Rechts oben und links unten ist nochmals ein größeres Loch zu sehen, hier kommen die beiden Plastikzapfen auf der Unterseite des Displays hinein.

Auf der rechten Seite ist der Helligkeitssensor T7 untergebracht. Der Einbau ist etwas knifflig: Zunächst wird vom Sensor der Kragen abgeschliffen, so dass der Sensor an keiner Stelle dicker als 5mm ist. Dann wird das Anschlusskabel angelötet, wobei die Enden vorerst noch nicht mit einem Steckverbinder versehen werden. Dann wird vorsichtig ein 5mm Loch in die Seitenwand gebohrt (Tiefe ungefähr 30mm), wobei man das Rahmenteil unbedingt fest einspannen sollte, damit die Lochränder nicht ausbrechen. Von der Innenseite bohrt man ebenfalls ein Loch und wenn man es richtig macht, treffen sich die beiden Löcher. Jetzt kann man den Sensor von oben in das Loch stecken und das Kabel an der Innenseite herausführen. Ist man mit dem Ergebnis zufrieden, dann wird von innen etwas Zweikomponentenkleber in das Loch gegossen und der Sensor damit verklebt. Das alles sollte unbedingt vor der Lackierung erledigt werden, um Beschädigungen an der Oberfläche zu vermeiden. Der Sensor wird dann einfach mit lackiert, das schadet nicht.

Grundsätzlich bin ich beim Gehäusebau folgendermaßen vorgegangen: Nach dem Zuschnitt und dem Verkleben der Teile wurden alle Löcher gebohrt und die Komponenten der Uhr komplett eingebaut. Als alles passte, wurde alles wieder demontiert und das Gehäuse nochmals geschliffen. Anschließend habe ich mehrere Schichten farblosen Sprühlack aufgebracht und mehrere Tage lang trocknen lassen.

Gehäuse2 Für den Gehäuserahmen habe ich 50mm breite Sperrholzstreifen mit einer Dicke von 4mm verwendet. Davon werden jeweils 2 Stück übereinander geklebt, wodurch sich eine Wandstärke von 8mm ergibt. Der Grund für die 2 Teile ist die Sensorfläche für den Quittierungssensor. Diese Detailaufnahme zeigt die Gehäuseunterseite mit der Sensorfläche, welche nicht komplett aus 2 Sperrholzschichten besteht. Ich war mir nicht sicher, ob der Sensor hinter 8mm Holz noch zuverlässig funktioniert und habe die Holzschicht im Bereich des Sensors auf 4mm reduziert. Die innere Schicht enthält dafür eine Aussparung in der Größe der Sensorfläche von 160mm x 30mm. Der Sensor selbst besteht aus 2mm starkem Aluminiumblech. Vor dem Verkleben aller Teile habe ich noch eine M3-Senkkopfschraube hinter dem Sensor untergebracht. Hier kommt dann später das Kabel zur Controllerplatine dran.

Gehäuse3 Dieses Bild zeigt die Rückseite der Uhr und hier wurde bereits das Display und das Netzteil eingebaut. Letzteres ist an der Gehäuseoberseite angeschraubt und liegt später mit der jetzt sichtbaren Rückseite direkt an der Wand. Zur Sicherheit habe ich einen Aufkleber mit der Anschlussbelegung am Netzteil angebracht, weil man in dieser Einbaulage die Originalbeschriftung kaum noch lesen kann.

Hinweis: Auf der Display-Rückseite sind 2 Pfeile aufgedruckt, einer davon ist hier neben dem roten Aufkleber zu sehen. Diese zeigen zur Oberseite des Displays. Weiterhin kann man an der Ober- und Unterseite des Gehäuses jeweils 5 große Löcher mit einem Durchmesser von 12mm erkennen. Diese sollen für eine gute Luftzirkulation sorgen, obwohl sich eigentlich kein Bauteil der Uhr im normalen Betrieb nennenswert erwärmt.

Gehäuse4 Hier sind jetzt alle Komponenten eingebaut und verkabelt, nur 230V-Anschluss und Datenleitung fehlen noch. Der DCF77-Empfänger wurde hier bewusst weggelassen, da meine Uhr mit dem Web-Modul verbunden ist und hier auch die Zeit übermittelt wird. Die Controllerplatine ist mit 4 Schrauben befestigt, wobei die beiden linken auch das Display halten. Die Bedienelemente auf der linken Seite sind durch entsprechende Löcher geführt und von außen erreichbar. Ursprünglich sollte auch die microSD-Karte des MP3-Moduls von außen zugänglich sein. Ich habe das aber wieder verworfen, da die nötige Aussparung im Gehäuse recht groß ausgefallen wäre und man trotzdem Hilfsmittel benutzen müsste, um die Karte zu entnehmen. Falls es erforderlich ist, neue Sounds auf die Karte zu speichern, dann kann man die Uhr von der Wand abhängen und einfach das MP3-Modul von der Controllerplatine abziehen. Auch für die Einstellung der Lautstärke muss man so vorgehen, da das Potentiometer auf der Unterseite des MP3-Moduls untergebracht ist.

Der Lautsprecher und die Halterung stammen aus einem alten PC. Wenn der verwendete Lautsprecher nicht über eine geeignete Befestigungsmöglichkeit verfügt, dann kann man z.B. Lochbandmaterial aus dem Baumarkt dafür verwenden. Auch wichtig: Über 2 Aluminiumwinkel mit einem großen Loch wird die Uhr später an die Wand gehängt. Auch diese sind, ebenso wie das Netzteil, an der Oberseite angeschraubt. Die Schraubenköpfe sind versenkt und normalerweise nicht sichtbar.

Gehäuse5 Dieses Detailbild zeigt noch einmal die Sensorfläche und die über einen Kabelschuh angeschlossene Verbindung zur Controllerplatine. Hier wurde geschirmtes Mikrofonkabel verwendet, wobei der Schirm nur an der Controllerplatine angeschlossen wird. An dem hier sichtbaren Ende wird er einfach abgeschnitten und isoliert.

Nachtrag: In der Praxis hat sich gezeigt, dass eine Sensorfläche in dieser Größe nicht dauerhaft zuverlässig funktioniert. Bei meiner Uhr kam es gelegentlich vor, dass die Berührung der Sensorfläche nicht erkannt wurde. Außerdem kam es gelegentlich zu Fehlauslösungen, wenn ein elektrisches Gerät in der Nähe geschaltet wurde. Um das Problem zu lösen, habe ich nachträglich eine kleinere Sensorfläche mit einer Größe von 20mm x 20mm aus Aluminium-Blech von innen auf die rechte Seitenwand geklebt. Damit funktioniert der Sensor zuverlässig - auch durch 8mm Sperrholz hindurch.

Gehäuse6 Hier ist die Stromversorgung für das Display zu sehen. Das mitgelieferte Kabel ist sehr reichlich bemessen und da ich es nicht kürzen wollte, liegt es einfach in Schleifen hinter dem Display. Das Kabel ist übrigens 4-adrig, es enden jedoch immer 2 Adern gemeinsam in einem Kabelschuh. Somit müssen insgesamt nur jeweils 2 Kabelschuhe an den Plus- und Minus-Anschluss des Netzteils geklemmt werden - einer für das Displaykabel und einer für das Kabel zur Controllerplatine (leider nicht sehr gut zu sehen).

Gehäuse7 Hier noch ein Blick auf die rechte Seitenwand. Die Bedienelemente haben folgende Funktion (von links nach rechts bzw. von unten nach oben): Taster 2, Taster 1, ISP-Anschluss, Empfindlichkeit des Helligkeitssensors und Test-LED.

Gehäuse8 So sieht dann die Matrixuhr in Funktion aus. Beim Erstellen des Fotos habe ich leider feststellen müssen, dass es offensichtlich eine hohe Kunst ist, LED-Displays zu fotografieren. Ich habe viele Bilder aufgenommen und mit verschiedenen Kameraeinstellungen experimentiert.

Matrixuhr2Pla1 Inzwischen ist noch eine weitere Matrixuhr entstanden und das nebenstehende Bild zeigt die Platine dieser Uhrenvariante. Auffällig ist hier der zusätzliche Raspberry Pi Zero WH. Außerdem wurde das neuere MP3-Soundmodul MSM4 verwendet. Dafür wurde an anderer Stelle gespart und die Sensorfläche sowie die dazugehörige Elektronik um IC3 weggelassen. Die Quittierungsfunktion übernimmt hier der dritte Taster. Weiterhin fehlt der DCF77-Empfänger, da die Zeitsynchronisierung über den Raspberry Pi erfolgt. Auch Test-LED und RS-232-Option wird bei dieser Uhr nicht benötigt. Einige Zeit nach dem Foto wurde noch der Jumper J12 ergänzt.

Matrixuhr2Pla2 Dieses Bild zeigt die gleiche Platine von unten. Hier kommen wieder viele dickere Drähte (0,5mm) für die stromführenden Leitungen und Kupferlackdraht (0,3mm) für alle anderen Verbindungen zum Einsatz. Bei dieser Uhr wurde übrigens ein kleineres Display mit 4mm Pixelabstand verwendet (Displaygröße P4), aus diesem Grund ist die Platine etwas kleiner als die der ersten Matrixuhr (128mm x 100mm).

Weitere Bilder von der zweiten Uhr gibt es hier nicht. Die Uhr ist zwar etwas kleiner, hat aber ansonsten den gleichen Aufbau wie die erste Uhr.

Symbol Software

Dieses Kapitel beschreibt die komplette Software der Matrixuhr. Die Beschreibung ist in 2 Abschnitte unterteilt. Der erste Teil erklärt die Software im Mikrocontroller IC1, der zweite Teil beschreibt die Software der Raspberry-Pi-Option. Das ist sehr trocken und wer sich nicht für die Details interessiert, darf das Kapitel gern überspringen. Für den Nachbau und den Betrieb der Uhr sind die folgenden Informationen nicht notwendig.

Symbol Teil 1 - Software für den Mikrocontroller

Die Software des Mikrocontrollers IC1 steuert die Hauptfunktionen der Matrixuhr. Bis auf einen kleinen Assembler-Teil, der für die Display-Ansteuerung zuständig ist, wurde die Software in C geschrieben. Der Quelltext besteht aus folgenden Dateien:

Matrix-Uhr.centhält das Hauptprogramm
Matrix-Uhr_asm.senthält den Assembler-Teil für die Ansteuerung des Matrix-Displays
charset.henthält Zeichensätze für Ziffern und Textelemente in mehreren Größen sowie verschiedene Symbole
functions.henthält zahlreiche Funktionen, die vom Hauptprogramm benötigt werden
interrupt.henthält 5 Interrupt-Funktionen, die zeitgenaue Vorgänge steuern und für den Datenempfang zuständig sind
strings.henthält eine Stringliste in deutscher und englischer Sprache
tables.henthält diverse Tabellen und Listen

Der Quelltext in der Datei Matrix-Uhr.c beginnt zunächst mit einer Liste von Bibliotheken, die vom Programm verwendet werden. Anschließend werden diverse Konstanten definiert, die auch modifiziert werden können. Auch die Belegung des EEPROM-Speichers wird mit Konstanten realisiert, die man aber nicht ändern sollte. Danach folgt ein großer Definitionsblock für Variablen mit viel Kommentartext und es werden 5 Programmteile eingefügt, die in separaten Dateien abgelegt sind. Erst jetzt beginnt der eigentliche Programmteil. Dieser besteht grundsätzlich aus den beiden Blöcken Initialisierung und Hauptprogrammschleife.

Initialisierung: Diese wird bei jedem Systemstart oder Reset einmal ausgeführt und stellt zunächst alle I/O-Ports ein, konfiguriert die 4 Timer für die benötigte Funktion, aktiviert außerdem den Analog-Digital-Konverter (ADC) sowie Sender und Empfänger der RS-232-Schnittstelle (RXD1). Der nachfolgende Block liest alle Einstellungen aus dem EEPROM-Speicher und prüft die Werte auf Plausibilität. Nicht zulässige Werte werden dabei auf eine Standard-Einstellung gesetzt. Somit ergibt sich bei der Verwendung eines fabrik-neuen Mikrocontrollers automatisch eine sinnvolle Grundeinstellung der Uhr. Im nächsten Schritt wird ein Anschluss des Matrix-Displays ausgelesen. Damit lässt sich feststellen, ob ein Display mit 1/16 Scan oder 1/8 Scan angeschlossen ist (mehr Informationen folgen in der Beschreibung der Interrupt-Funktionen). Nach dem Setzen einiger Variablen wird noch eine Initialisierung an das Matrix-Display gesendet, die für bestimmte Treiber-ICs erforderlich ist. Schließlich geht das Programm nach der Freigabe der Interrupts in die Hauptprogrammschleife über.

Hauptprogrammschleife: Dieser Programmteil erledigt alle Aufgaben der Matrixuhr und läuft in einer endlosen Schleife. Den Anfang macht ein recht großer Block, der für die Ausgabe der Uhrzeit und weiterer Informationen auf das Matrix-Display zuständig ist. Hier sind viele Verzweigungen enthalten, da die verschiedenen Anzeige-Modi berücksichtigt werden müssen. Grundsätzlich wird bei jeder Ausgabe die darzustellende Information in Pixel zerlegt und als Farbwert in einen Matrix-Puffer geschrieben. Es werden hier keine Daten an das Display gesendet, dies erledigt später eine Interrupt-Routine, die sich die aufbereiteten Farbwerte direkt aus dem Matrix-Puffer holt.

An dieser Stelle muss ich einige Worte über den Matrix-Puffer loswerden: Dieser besteht aus 2 identischen Einheiten mit einer Größe von jeweils 2048 Bytes. Durch die Doppelung ist es möglich, ein komplettes Bild in der inaktiven Einheit aufzubauen, während in der Zwischenzeit der Inhalt der aktiven Matrix zum Display gesendet wird. Nach dem Aufbau des neuen Bildes im Hintergrund werden die Einheiten umgeschaltet und der Vorgang beginnt von vorn. Die Verwendung einer einzelnen Einheit führte immer wieder zu sichtbaren Störungen.
Jede Matrix-Einheit besteht wiederum aus 2 Teilen mit einer Größe von jeweils 1024 Bytes. Ein Teil speichert die RGB-Farbwerte für 2 Pixel (1 Pixel in der oberen Displayhälfte und 1 Pixel in der unteren) mit jeweils einem Bit pro Farbe. Das würde grundsätzlich ausreichen, um 8 Farben darzustellen. Mit dem zweiten Teil sind nochmals 8 Farbwerte möglich und durch die abwechselnde Multiplexausgabe der beiden Teile entstehen weitere Mischfarben.

Der nächste Abschnitt prüft, ob ein vollständiger DCF77-Datensatz vorliegt, welcher von einer der Interrupt-Routinen im Hintergrund empfangen wurde. Der Datensatz wird dekodiert und ein Plausibilitätstest durchgeführt. Anschließend erfolgt ein Vergleich der Zeitinformation mit den beiden vorherigen Datensätzen und wenn alles stimmt, wird die Zeit übernommen.

Im weiteren Programmverlauf wird der Zustand des Tasters 1 ausgewertet. Im Falle eines kurzen Tastendrucks wird entweder das Display wieder eingeschaltet (weil es gerade zwecks Synchronisierung ausgeschaltet war), ins Einstellungs-Menü gewechselt, zum nächsten Einstellungs-Menü gesprungen oder das Einstellungs-Menü wieder verlassen. Im letzten Fall erfolgt außerdem die Speicherung aller geänderten Einstellungen im EEPROM. Wird ein langer Tastendruck erkannt und ist gerade ein Einstellungs-Menü aktiv, dann wird das Menü vorzeitig verlassen und ebenfalls eine Datenspeicherung ausgeführt.

Im nächsten Abschnitt kommt die Abfrage des Tasters 2 an die Reihe. Auch hier wird bei einem kurzen Tastendruck das Display wieder eingeschaltet, falls es ausgeschaltet war. Ansonsten wird, wenn sich die Uhr im normalen Modus befindet, die Stummschaltung (Mute) aktiviert oder wieder deaktiviert. Befindet sich die Uhr im Einstellungs-Menü, dann wird der gerade angezeigte Parameter um 1 erhöht bzw. zwischen „aus“ und „ein“ umgeschaltet. Ein langer Tastendruck wird nur im Einstellungs-Menü ausgewertet und führt bei einigen Parametern zu einer schnellen Erhöhung des Wertes, z.B. bei der Eingabe von Zahlenwerten oder Buchstaben.

Weiter geht es mit der Abfrage von Taster 3. Hier wird nicht zwischen kurzem und langen Tastendruck unterschieden, jede Betätigung wird gleich behandelt. Zunächst wird auch hier das Display wieder eingeschaltet, falls es abgeschaltet war. Ansonsten wird eine gerade laufende Textnachricht oder Alarmmeldung gelöscht. Im letzten Fall verschwinden nur inaktive Alarme (unterstrichen dargestellt) von der Bildfläche.

Der nächste Programmteil prüft, ob neue Daten im RS-232-Empfangspuffer liegen. Eine Interrupt-Routine wird bei jedem über RS-232 empfangenen Zeichen aktiv und legt das Zeichen im RS-232-Puffer ab. Werden neue Zeichen vorgefunden, dann kopiert eine kleine Programmschleife diese zunächst in einen weiteren Datenpuffer. Ist hier ein Zeilenendezeichen (CR oder LF) dabei, dann wird der Inhalt des Datenpuffers nach typischen Merkmalen von Datenpaketen durchsucht und eine entsprechende Funktion zur Verarbeitung der Daten aufgerufen. Im Anschluss daran wird der Inhalt des Datenpuffers wieder gelöscht.

Der letzte Abschnitt prüft diverse Timeout-Zähler und steuert einige Vorgänge in Abhängigkeit von der Uhrzeit oder anderen Ereignissen. Den Anfang macht der Zähler für den Anzeige-Timeout. Ist dieser abgelaufen, dann wird das Einstellungs-Menü verlassen, die Einstellungen gespeichert und die normale Anzeige wieder aktiviert. Ein weiterer Timeout-Zähler sorgt dafür, dass das Display bei einer Synchronisierung wieder eingeschaltet wird, falls diese fehlgeschlagen ist. Der folgende Programmteil schaltet das Display aus, wenn die spezielle Synchronisierungsfunktion aktiv ist und die Zeiten erreicht sind. Ein weiterer Timeout-Zähler ändert einen Status, wenn die Uhr in einem bestimmten Zeitraum nicht synchronisiert wurde. Auch die Stummschaltungsfunktion wird durch einen Timeout-Zähler überwacht und nach einer bestimmten Zeit wieder abgeschaltet. Der nächste Teil steuert zum einen den stündlichen Farbwechsel und zum anderen den Anzeigemodus des Displays. Es folgt nun noch die Steuerung für den Tag/Nacht-Modus und für den Stunden-Gong, sowie die Umrechnung des Helligkeitswertes in einen PWM-Wert für die Displayhelligkeit. Den Abschluss bildet ein Programmblock zur Speicherung aller Daten im EEPROM.

functions.h: In der Hauptprogrammschleife werden viele Funktionen verwendet, die wegen der besseren Übersicht in eine separate Datei ausgelagert wurden. Den Anfang machen einige Steuerfunktionen für das Matrix-Display: Matrix-Bank umschalten, Display ein- und ausschalten, inaktive Matrix löschen, aktuelle Farbe setzen, Pixel als Farbwert in inaktiver Matrix setzen und Schreiben eines FM6126A-Registers. Letztere Funktion wird für die Initialisierung bestimmter Matrix-Displays benötigt. Der nächste Block dient zur Farbsteuerung: Farbe für Uhrzeit, Datum und Alarm einstellen sowie neue Farben per Pseudozufall erzeugen. Es folgen 2 kleine Funktionen für den Zugriff auf das EEPROM (Lesen und Schreiben eines Bytes).

Der nächste größere Block enthält Funktionen zur Ausgabe von Informationen auf das Display: Ausgabe einer normalen Ziffer für die Uhrzeit, Ausgabe einer verkleinerten Ziffer für die Uhrzeit und Ausgabe eines kleinen Zeichens für Sekunde, Wochentag und Kalendertag. Alle Funktionen holen zeilenweise Bytes aus der Datei charset.h und speichern diese Bit für Bit als Farbwert im Matrix-Puffer. Weitere Funktionen ermitteln die Pixelbreite eines Zeichens oder einer Zeichenkette für die korrekte Anzeige von zentrierten oder rechtsbündigen Informationen. Die folgende Funktion für die Ausgabe eines ASCII-Zeichens ist etwas aufwändiger, da neben der Zerlegung in Bits auch die Zeichenbreite und die Möglichkeit der Unterstreichung berücksichtigt werden muss. Für die Ausgabe der verschiedenen Wettersymbole und eines speziellen Symbols für Sonnenaufgang und Sonnenuntergang sind die folgenden Funktionen zuständig. Weitere Funktionen geben komplette Zeichenketten aus und nutzen dafür wiederum die Funktion für die Ausgabe eines ASCII-Zeichens.

Weiter geht es mit einer „Wochentagsformel“, die aus einem beliebigen Datum den Wochentag berechnet, einer Funktion für die Sommerzeitumstellung und einer Funktion, die falsche Tage korrigiert (z.B. 31.04. → 30.04.). Eine weitere Funktion ermittelt das nächste Zeichen aus der Zeichenliste und wird bei Texteingaben benötigt.

Die verbleibenden Funktionen sind ausschließlich für die Auswertung der empfangenen Daten vom Sensor- oder Web-Modul zuständig. Den Anfang macht eine kleine Funktion zur Konvertierung von UTF-8-Zeichen. Diese wird benötigt, um spezielle Zeichen vom Web-Modul oder einem Raspberry Pi (welche mit UTF-8 arbeiten) in den Zeichensatz der Uhr umzuwandeln. Die nächste Funktion wird aufgerufen, wenn ein Sensorwert vom Sensormodul empfangen wurde. Dazu wird der Datenpuffer gelesen, der Sensorwert mit einem Namen und der passenden Einheit ergänzt und in einem Sensorfeld gespeichert. Das Sensorfeld hält für jeden der 31 möglichen Sensoren einen Speicherplatz mit 12 Zeichen bereit.
Da sich die Datensätze von Sensor- und Web-Modul unterscheiden, wird beim Empfang eines Sensorwertes vom Web-Modul oder einem Raspberry Pi eine separate Funktion benötigt. Diese folgt als nächstes im Quelltext und kopiert einfach die Informationen vom Datenpuffer in das Sensorfeld, da die darzustellenden Informationen bereits im Web-Modul aufbereitet worden sind. Das ermöglicht dann auch die Anzeige von Geburtstagen und Wetterinformationen, diese werden einfach wie Sensorwerte übertragen und ebenfalls im Sensorfeld gespeichert.

Die nächsten beiden Funktionen sind für den Empfang von Alarmmeldungen zuständig, auch hier ist wegen der unterschiedlichen Datensätze eine Funktion für das Sensormodul und eine für das Web-Modul zuständig. Wird eine aktive Alarmmeldung empfangen, dann wird ein vorbereiteter Alarmtext in das Alarmfeld übertragen und der entsprechende Klang (1-4) abgespielt. Verschwindet ein Alarm wieder, dann wird der Eintrag im Alarmfeld auf Inaktiv gesetzt. Bei der späteren Ausgabe auf dem Display erscheint der Alarmtext dann unterstrichen. Eine Besonderheit bei den Alarmen vom Sensormodul ist, dass der Ruhezustand der Alarme zu berücksichtigen ist. Dieser muss einmalig über das Einstellungs-Menü angelernt werden. Ebenfalls über die Einstellungen kann man einen Namen für jeden Alarm mit bis zu 12 Zeichen festlegen.
Beim Empfang einer Alarmmeldung vom Web-Modul oder einem Raspberry Pi wird der anzuzeigende Text mitgeliefert und somit einfach vom Datenpuffer in das Alarmfeld übertragen. Außerdem sind noch 2 Parameter enthalten: die Nummer des Klangs, der abgespielt werden soll und der Haltemodus. Letzterer bestimmt, ob der Alarm nach Rückstellung automatisch vom Display wieder verschwindet oder manuell quittiert werden muss. Das Alarmfeld hat übrigens 8 Plätze. Beim Datenempfang vom Sensormodul werden nur die Plätze 1-4 genutzt, beim Web-Modul können noch 4 weitere Alarme auf den Plätzen 5-8 verwendet werden.
Es folgen noch 2 Funktionen: Die erste wird beim Empfang eines Zeitdatensatzes aktiv, startet einen umfangreichen Plausibilitätstest und setzt dann alle Zeitzähler der Uhr entsprechend den empfangenen Daten. Die Zeitinformation wird mit einer Genauigkeit von 10ms übertragen und da die Uhr in Zeiteinheiten von 20ms zählt, werden die Hundertstel halbiert und damit der Zähler gesetzt. Die letzte Funktion wird aufgerufen, wenn eine Textnachricht vom Web-Modul empfangen wurde. Hier wird jedes Zeichen des gesamten Textes in Pixelspalten zerlegt und in einem speziellen Pixelpuffer abgelegt. Das ermöglicht später eine relativ einfache Ausgabe als Laufschrift. Weiterhin wird der fest zugeordnete Klang 5 abgespielt.

interrupt.h: In dieser Datei sind insgesamt 5 Interrupt-Routinen abgelegt. Den Anfang macht ein Interrupt, der vom Timer0 alle 1,6ms (Frequenz 625Hz) ausgelöst wird. Dieser steuert zunächst die Laufschrift, indem ein Zähler erhöht, auf einen bestimmten Stand geprüft und dann gegebenenfalls der Zeiger für den Pixelpuffer erhöht wird. Später wird diese Zeigerposition zur Ausgabe der Laufschrift verwendet und die Steuerung über den Interrupt sorgt für einen gleichmäßigen Lauf.
Über einen Zähler wird der Zeittakt für die weiteren Programmteile der Routine auf 40ms herabgesetzt. Oder anders ausgedrückt: nur bei jedem 25. Interrupt werden die nachfolgenden Programmteile ausgeführt. Es folgt nacheinander die Status-Abfrage der 3 Taster und der Vergleich mit dem Status bei der vorherigen Abfrage. Nur wenn 2 aufeinander folgende Abfragen den gleichen Status aufweisen, wird der Zustand als stabil betrachtet und eine Aktion ausgelöst (Entprellung). Bei Erkennung des gedrückten Zustandes von Taster 1 und 2 wird zusätzlich noch ein Zähler erhöht, der später im Hauptprogramm die Erkennung eines langen Tastendrucks ermöglicht.
Ein größerer Programmteil steuert die Soundausgabe. Nach Auslösung eines Sounds sorgt ein Zähler dafür, dass der entsprechende Portausgang für eine gewisse Zeit aktiv bleibt und anschließend nochmals eine gewisse Zeit vergehen muss, bevor ein weiterer Sound gestartet werden kann.
Nach einer weiteren Taktteilung durch 25 werden folgende Programmteile nur einmal pro Sekunde abgearbeitet. Das betrifft hier den Zähler für die verzögerte Einschaltung des MP3-Moduls. Die nächste Taktteilung durch 60 bewirkt die weitere Bearbeitung einmal pro Minute. Hier wird der Zähler für die Display-Abschaltung zur Synchronisierung gesteuert. Und eine letzte Taktteilung durch 60 sorgt für eine weitere Bearbeitung einmal pro Stunde. Hier werden 2 Timeout-Zähler bedient: einer für die Synchronisierungsüberwachung und einer für das Rückstellen der Stummschaltung.

Die nächste Interrupt-Routine wird zyklisch vom Timer1 ausgelöst und sieht mit nur 2 Zeilen wenig komplex aus. Aber das täuscht, denn hier wird eine in Assembler geschriebene Funktion aufgerufen, welche in der Datei Matrix-Uhr_asm.s gespeichert ist. Diese dient ausschließlich zum Senden der Daten aus dem aktiven Matrix-Puffer und zur Helligkeitssteuerung (gemeinsam mit dem Timer2). Die Assembler-Funktion bekommt vom C-Programm 4 Parameter übergeben: die Speicheradresse des Matrix-Puffers, einen Multiplexzähler, einen PWM-Wert für die Helligkeit und eine Information über den verwendeten Scan-Modus des Displays (1/16 oder 1/8). Die Speicheradresse zeigt immer auf die gerade aktive Matrix und dort holt sich die Funktion die zu sendenden Daten. Der Multiplexzähler legt fest, welche Displayzeile ausgegeben werden soll und welcher der beiden Farbwerte. Im Scan-Modus 1/16 wird die Displayzeile aus den Bits 1-4 des Multiplexzählers (4 Bit = 16 Zeilen) gewonnen und über Bit 0 der Farbwert. Mit diesen Daten wird dann genau eine Pixelzeile zum Matrix-Display gesendet, genauer: eine Zeile in der oberen und eine in der unteren Bildhälfte. Im Scan-Modus 1/8 werden immer 2 Zeilen ausgegeben, deren Nummern aus den Bits 1-3 (3 Bit) gewonnen werden. In diesem Modus wird die Zeile n+8 und die Zeile n in einem Durchgang zum Matrix-Display gesendet. Auch hier werden die obere und untere Bildhälfte gleichzeitig bearbeitet.

Die Ausgabe-Funktion beginnt mit dem Abschalten der LED-Matrix durch Setzen des Ports PA5 auf High, setzt sich fort mit der Prüfung von Bit 0 des Multiplexzählers und gegebenenfalls der Addition von 1024 zur Matrix-Puffer-Adresse. Somit wird bei geradzahligen Interrupts der eine RGB-Farbwert und bei ungeradzahligen der andere RGB-Farbwert ausgegeben. Der weitere Ablauf ist abhängig vom angeschlossenen Display-Typ (1/16 Scan oder 1/8 Scan).

Beim 1/16 Scan werden die Bits 1-4 des Multiplexzählers zunächst an die Bit-Positionen 0-3 geschoben und dann direkt an die Ports PA0-PA3 zur Auswahl der Pixelzeile weitergereicht. Außerdem wird der Zählerwert (0-15) mit 64 multipliziert und das Ergebnis zur Matrix-Puffer-Adresse addiert. Das ergibt die Position im Puffer, wo die Daten der auszugebenden Zeile gespeichert sind. Jetzt beginnt das eigentliche Senden der Farbdaten über eine Schleife, die zunächst 61 mal durchlaufen wird: Ein Byte wird aus dem Matrix-Puffer geholt, komplett an PortC ausgegeben, PB0 kurz auf High gesetzt und dabei ein Taktimpuls erzeugt. Nach der Ausgabe von 61 Bytes ist es erforderlich, die Einstellung des Jumper J12 zu prüfen. Bei offenem Jumper wird jetzt PA4 auf High gesetzt und die restlichen 3 Bytes ausgegeben. Dieses spezielle Timing ist für die Treiber-ICs FM6126A erforderlich, die auf vielen neueren Displays verbaut werden. Bei gestecktem Jumper erfolgt zuerst die Ausgabe der restlichen 3 Bytes und erst dann wird PA4 auf High gesetzt. Dies ist das klassische Timing für ältere Displays. Anschließend wird PA4 wieder auf Low gesetzt und damit die Übernahme der Daten in den Speicher (Latch) des Displays ausgelöst. Nach Abschluss der Datenausgabe werden über ein Low an PA5 die LED-Ausgänge eingeschaltet und die neue Zeile wird sichtbar.

Beim 1/8 Scan läuft die Ausgabe ein wenig anders ab. Hier werden nur die Bits 1-3 des Multiplexzählers an die Bit-Positionen 0-2 geschoben und an die Ports PA0-PA2 zur Auswahl eines Pixelzeilenpaars weitergereicht. Über eine Multiplikation des Zählerwertes (0-7) mit 64 wird die Position der auszugebenden Daten im Puffer ermittelt und zwischengespeichert. Eine Besonderheit der Displays mit 1/8 Scan ist, dass das auszugebende Zeilenpaar n+8 und n ist, d.h. es wird Zeile 9 zusammen mit Zeile 1, im nächsten Zyklus Zeile 10 zusammen mit Zeile 2 ausgegeben usw. Aus diesem Grund wird zur ermittelten Puffer-Position 512 addiert, um die Adresse der Zeile n+8 zu ermitteln. Nun beginnt das Senden der Farbdaten in 2 Schritten: Zunächst werden über eine Schleife die 64 Bytes der Zeile n+8 aus dem Matrixpuffer geholt und an PortC ausgegeben. Auch hier wird nach jedem Byte über einen High-Impuls an PB0 ein Taktsignal erzeugt. Im zweiten Schritt wird die zuvor ermittelte Adresse der Zeile n wiederhergestellt und weitere 61 Bytes mit jeweils einem Taktimpuls an das Display gesendet. Auch hier ist es erforderlich, die Einstellung des Jumper J12 zu prüfen. Bei offenem Jumper wird PA4 auf High gesetzt und die restlichen 3 Bytes ausgegeben (Timing für FM6126A). Bei gestecktem Jumper erfolgt zuerst die Ausgabe der restlichen 3 Bytes und erst dann wird PA4 auf High gesetzt (klassisches Timing). Anschließend wird PA4 wieder auf Low gesetzt und damit die Übernahme der Daten in den Speicher (Latch) des Displays ausgelöst. Nach Ausgabe aller Bytes werden schließlich über ein Low an PA5 alle LED-Ausgänge eingeschaltet.

Der folgende Teil prüft den übermittelten PWM-Wert auf bestimmte Wertebereiche und stellt dann über Zähler und Vorteiler von Timer2 eine entsprechende Wartezeit ein. Bei kleinen PWM-Werten wird über Warteschleifen Zeit „verbraucht” und dann durch Setzen von PA5 die Matrix wieder abgeschaltet. Bei größeren PWM-Werten wird der Timer2 aktiviert und dieser wird dann zur entsprechenden Zeit aktiv und schaltet durch Setzen von PA5 die LED-Ausgänge der Matrix ab. So kann in der Zwischenzeit das Hauptprogramm weiterarbeiten.

Abhängig vom Scan-Modus erfolgen die Ausgaben an das Matrix-Display in einem festen Zeitraster. Bei 1/16 Scan wird die Interrupt-Routine alle 156,25µs aufgerufen, also mit einer Frequenz von 6400Hz. Um ein vollständiges Bild auszugeben sind 32 Ausgaben erforderlich, somit ergibt sich eine Frequenz von 200Hz für ein vollständiges Bild. Ungefähr 33µs dauert dabei die Ausgabe einer Pixelzeile und die restliche Zeit von ca. 123µs wird zur Steuerung der Display-Helligkeit genutzt. Bei 1/8 Scan wird die Interrupt-Routine alle 188,25µs aufgerufen (Frequenz 5312Hz). Hier sind für ein vollständiges Bild nur 16 Ausgaben erforderlich, was einer Bild-Frequenz von 322Hz entspricht. Hier dauert die Ausgabe von 2 Pixelzeilen ungefähr 65µs und die restliche Zeit beträgt auch hier 123µs zur Steuerung der Display-Helligkeit.

Die nächste Interrupt-Routine wird vom bereits erwähnten Timer2 ausgelöst und schaltet durch Setzen von PA5 die LED-Ausgänge des Matrix-Display wieder ab. Das ergibt gemeinsam mit Timer1 eine Helligkeitssteuerung des Matrix-Displays: Timer1 gibt eine Pixelzeile aus, schaltet das Display ein und setzt den Timer2 auf eine Zeit, die vom übergebenen PWM-Wert abgeleitet wird. Timer2 wird nach Ablauf der Zeit aktiv und schaltet das Display wieder aus. Je größer der Wert in Timer2, um so länger bleibt das Display eingeschaltet und um so heller erscheint das Display.

Eine weitere Interrupt-Routine wird vom Timer3 ausgelöst. Das passiert regelmäßig alle 20ms bzw. mit einer Frequenz von 50Hz. In dieser Routine erfolgt der Empfang des DCF77-Signals und die gesamte Zeitzählung der Uhr. Zunächst wird das DCF-Signal am Eingang PA6 gelesen und gegebenenfalls invertiert. Dieses Signal wird sofort an die Test-LED an Port PD4 weitergegeben, falls dies in den Einstellungen so festgelegt wurde. Durch Vergleich mit dem Signalstatus beim vorherigen Interrupt werden Impulse erkannt und über mitlaufende Zähler kann die Impulslänge in Schritten von 20ms ermittelt werden. Impulslängen zwischen 60ms und 140ms wertet die Routine als 0-Bit und Längen über 140ms bis 260ms als 1-Bit. Alle erkannten Bits werden in einem FIFO-Puffer mit 42 Plätzen gespeichert. Bei Erkennung der Minutenpause wird ein Flag für das Hauptprogramm gesetzt und dieses dekodiert dann die empfangenen Datenbits.
Der nächste Abschnitt wird nur einmal pro Sekunde abgearbeitet und beginnt mit der Sekundenzählung und dem Bearbeiten des Display-Timeout-Zählers, der für die automatische Rückkehr in den normalen Anzeigemodus zuständig ist. Im nächsten Teil erfolgt die Steuerung der Wechselanzeige für Datum und Sensorwerte sowie für die Alarme. Es wird nach dem nächsten aktiven Wert im Sensor- und Alarmfeld gesucht und ein Zähler auf diese Position gesetzt. Im gleichen Zeitraster werden auch die zum Sensor- und Alarmfeld gehörenden Timeout-Zähler bearbeitet, die dafür sorgen, dass inaktive Felder nach einer gewissen Zeit von der Anzeige gelöscht werden.
Im letzten Teil werden alle weiteren Zeitzähler bearbeitet: Minuten, Stunden, Wochentag, Kalendertag, Monat und Jahr.

Die letzte Interrupt-Routine wird immer dann aktiv, wenn ein Zeichen an RX von USART1 (RS-232) empfangen wurde. Dieses Zeichen wird in einem 256 Byte großen Empfangspuffer abgelegt und anschließend der Schreibzeiger erhöht. Über den Vergleich des Schreibzeigers mit einem Lesezeiger kann das Hauptprogramm später feststellen, dass neue Zeichen im Puffer liegen und verarbeitet werden müssen.

Symbol Teil 2 - Software für den Raspberry Pi

Wird die Matrixuhr mit einem Web-Modul verbunden (Web-Modul-Betrieb) oder mit einem Raspberry Pi ausgestattet (Raspberry-Pi-Betrieb), dann müssen auf dem Raspberry Pi des Web-Moduls bzw. auf dem Raspberry Pi der Matrixuhr ebenfalls einige Software-Komponenten installiert werden. Neben dem Web-Server lighttpd, der als Komplettpaket installiert wird, sind einige spezielle Programme erforderlich, die in Perl geschrieben wurden:

matrixuhr.plVerwaltet alle Daten und Alarme, steuert die MQTT-Kommunikation und sendet die aufbereiteten Informationen zyklisch über die serielle Schnittstelle zum Mikrocontroller der Matrixuhr.
matrixctl.plStartet das Programm matrixuhr.pl neu, wenn Konfigurationsänderungen über den Web-Server vorgenommen wurden; verwaltet außerdem den 1-Wire-Sensor und kommuniziert mit dem Wetterdienst.
matrixrcv.plEmpfängt Daten über die serielle Schnittstelle vom Mikrocontroller und fährt beim Empfang eines entsprechenden Kommandos den Raspberry Pi herunter. Dieses Programm wird nur im Raspberry-Pi-Betrieb installiert.
matrixres.shÜberwacht einen Taster an einem GPIO-Anschluss des Raspberry Pi und fährt bei Tastendruck den Raspberry Pi herunter. Dieses Programm wird nur unter bestimmten Bedingungen im Raspberry-Pi-Betrieb installiert.

matrixuhr.pl: Dieses Programm leistet hier die Hauptarbeit. Es liest nach dem Start zunächst alle Konfigurationsdaten ein und läuft dann in einer Endlosschleife. Es empfängt ständig Daten von Sensoren, Alarmen und weiteren Informationen über MQTT vom Web-Modul, verwaltet eine Geburtstagsliste und übernimmt die vom Programm matrixctl.pl bereitgestellten Wetterdaten (bei internem Wetterdatenempfang) sowie den Wert des 1-Wire-Sensors. Alle Daten werden dann aufbereitet und im Abstand von einer Sekunde zyklisch nach einem mehr oder weniger festen Muster zum Mikrocontroller der Matrixuhr gesendet.

Das vorgegebene Muster ist ein Kompromiss zwischen möglichst schnellen Reaktionen auf Werteänderungen auf der einen Seite und einer möglichst niedrigen Systemlast auf der anderen. Die Dauer eines Schleifendurchlaufs beträgt mindestens 4 Sekunden und jeder weitere anzuzeigende Sensorwert erhöht die Zyklusdauer um eine weitere Sekunde. Änderungen von Sensorwerten und auch Textnachrichten kommen also mit einer leichten Verzögerung an der Matrixuhr an. Eine Ausnahme bilden die 4 Alarme des Temperatur-Messsystems, diese werden als einzige Ausnahme immer sofort nach dem Empfang weitergegeben.

Die auszugebenden Daten können relativ frei definiert und mit zusätzlichen Texten oder Einheiten kombiniert werden. Auch ist es möglich, mehrere Informationen auf einer Zeile darzustellen. Weiterhin lassen sich neben den 4 Alarmen des Temperatur-Messsystems 4 weitere Alarme definieren, mit denen man Sensorwerte überwachen kann. Dabei ist ein Vergleich mit einem definierten Festwert möglich oder auch ein Vergleich zwischen 2 Sensorwerten. Die 4 weiteren Alarme können auch als Timer verwendet werden. So lassen sich tägliche Alarme, wöchentliche Alarme oder auch ein Geburtstagsalarm zu einer bestimmten Zeit auslösen.

matrixctl.pl: Dieses Programm hat zwei Funktionen. Es steuert das bereits beschriebene Programm matrixuhr.pl und sorgt für einen Neustart, wenn Änderungen an der Konfiguration durchgeführt werden. Der Grund dafür liegt in der Arbeitsweise von matrixuhr.pl: Um die Systemlast niedrig zu halten, wird die gesamte Konfiguration nur einmal beim Start eingelesen und die Programmschleife arbeitet dann weitgehend mit den Daten im RAM. Ändert sich die Konfiguration, dann ist ein Neustart notwendig, um die Konfigurationsdaten neu einzulesen. Die zweite Funktion ist die Kommunikation mit dem Wetterdienst und dem 1-Wire-Sensor. Diese beiden Prozesse mussten aus der matrixuhr.pl ausgelagert werden, da hier Wartezeiten auftraten und dabei die MQTT-Funktion gestört wurde.

matrixrcv.pl: Dieses Programm hat nur eine Funktion. Es ermöglicht das Herunterfahren des Raspberry Pi zu Wartungszwecken von der Matrixuhr aus. Durch langes Drücken (mindestens 4 Sekunden) des Tasters 2 der Matrixuhr wird das Kommando poweroff über die serielle Schnittstelle zum Raspberry Pi gesendet und daraufhin der Raspberry Pi heruntergefahren. Dieses Programm wird nur beim Raspberry-Pi-Betrieb installiert.

matrixres.sh: Dieses Programm dient ebenfalls nur zum Herunterfahren des Raspberry Pi und kann als Alternative zum Programm matrixrcv.pl verwendet werden. Das ist dann erforderlich, wenn ein Sensormodul am Raspberry Pi angeschlossen ist und somit die serielle Schnittstelle nicht zur Verfügung steht. In diesem Fall wird ein an GPIO17 angeschlossener Taster ausgewertet und bei einem Tastendruck über 2 Sekunden der Raspberry Pi heruntergefahren.

Zum Abschluss dieses Abschnitts folgt noch eine Übersicht über die Dateien auf dem Raspberry Pi, die von der Matrixuhr verwendet werden und deren Funktion:

/srv/sensor/almu1 - almu8Konfiguration der Alarme 1-8
/srv/sensor/bdaymuListe mit den Geburtstagsdaten
/srv/sensor/bdaysmuSortierungsmodus der Geburtstagsdaten
/srv/sensor/messagemuzu sendende Textnachricht
/srv/sensor/messagemu.sgesendete Textnachricht
/srv/sensor/mqttmuMQTT-Konfiguration
/srv/sensor/senlmuMQTT-Topics der Sensorliste
/srv/sensor/senmuSensordatenzeilen für die Matrixuhr
/srv/sensor/timemuZeitsynchronisierungs-Konfiguration
/srv/sensor/iconmuListe der Wettersymbol-Kodes
/srv/sensor/wcdemuWetterlagentexte in Deutsch
/srv/sensor/wcenmuWetterlagentexte in Englisch
/srv/sensor/weatmuWetterdaten-Konfiguration
/srv/sensor/sdatmuMQTT-Topics für spezielle Daten (Wetter, Kraftstoffpreise, Nachricht)
/srv/sensor/changemuNachricht vom Web-Server an matrixctl.pl zum Neustart von matrixuhr.pl
/srv/sensor/s32muKorrekturwert des 1-Wire-Sensors
/srv/sensor/s32Wert des 1-Wire-Sensors (beim Web-Modul-Betrieb wird /mnt/ram/s32 verwendet)
/srv/sensor/weather.jsonempfangene Wetterdaten im JSON-Format (beim Web-Modul-Betrieb wird /mnt/ram/weather.json verwendet, nur bei direkter Abfrage)
 
/var/www/html/index.phpPHP-Programm zum Start der matrix.php (nur beim Raspberry-Pi-Betrieb)
/var/www/html/matrix.phpMatrixuhr-Konfigurationsseite
/var/www/html/title.phpSeiten-Titel (wird von matrix.php aufgerufen)
/var/www/html/server.datgespeicherter Servername („Matrixuhr“)
/var/www/html/style.cssSchriftgrößen, Farben, Parameter für Rahmen und Tabellen usw.
/var/www/html/favicon-matrix.pngMini-Bild für Browser
/var/www/html/icon-matrix.pnggrößeres Bild für Mobilgeräte (Start-Icon)
Symbol Inbetriebnahme

Die Inbetriebnahme der Matrixuhr erfolgt in mehreren Schritten. Die folgende Tabelle zeigt eine Übersicht über die 4 Betriebsarten und die dafür notwendigen Installationsschritte:

InstallationsschrittAutonomer BetriebSensormodul-BetriebWeb-Modul-Betrieb Raspberry-Pi-Betrieb
Schritt 1Matrixuhr-Basis in Betrieb nehmen
Schritt 2MP3-Modul in Betrieb nehmenOOOO
Schritt 3Raspberry Pi in Betrieb nehmen---
Schritt 4Datei-Archiv matrixuhr-files-v430.tar.gz auf den Raspberry Pi laden und entpacken- --
Schritt 5Systemdienste für die Kommunikation einrichten---
Schritt 6Web-Server installieren---
Schritt 7Passwortschutz für den Web-Server einrichten--- O
Schritt 8SSL-Verschlüsselung für den Web-Server einrichten (https)--- O
Schritt 9Zugriff aus dem Internet für den Web-Server einrichten--- O
Schritt 10Alternativen Dienst zum Herunterfahren des Raspberry Pi einrichten-- -O
Schritt 11Matrixuhr-Dienste auf dem Web-Modul einrichten-- -

Schritt ist erforderlich
OSchritt ist optional
-Schritt ist nicht erforderlich

Symbol Schritt 1 - Matrixuhr-Basis in Betrieb nehmen (alle Betriebsarten)

Bei der Inbetriebnahme der Matrixuhr sollte der Jumper J12 zunächst nicht gesteckt werden. In den meisten Fällen wird das Display mit dieser Einstellung funktionieren. Weiterhin wird die aktuelle Software matrixuhr-atmega1284p-v220.zip für den ATmega1284P benötigt. In diesem Paket befinden sich alle Projekt-Dateien vom Atmel Studio, insbesondere der komplette kommentierte Quelltext in C und Assembler sowie die fertig kompilierte HEX-Datei. Letztere ist im Verzeichnis Matrix-Uhr\Matrix-Uhr\Release\Matrix-Uhr.hex abgelegt und muss über ein Programmiergerät, welches an den Steckverbinder J2 angeschlossen wird, in den Mikrocontroller IC1 übertragen werden. Eine Anleitung dafür findet man auf der Seite AVR-Programmierung. Ich habe für die Erstellung der Software und auch für die Übertragung in den Mikrocontroller das Atmel Studio 7 verwendet. Als Programmiergerät kam ein AVR Dragon zum Einsatz.

Fuse-Bits Weiterhin müssen im Mikrocontroller einige Einstellungen vorgenommen werden. Das wird über die Fuse-Bits realisiert und bei Verwendung des Atmel Studios sieht die Einstellung so aus wie im nebenstehenden Bild.

Andere Programmiersoftware bietet oft nicht so einen übersichtlichen Dialog an. Hier müssen die Werte für die 3 Fuse-Bit-Register meist direkt übergeben werden (z.B. bei AVRDUDE oder myAVR ProgTool). In diesem Fall kann man die 3 benötigten Werte aus dem unteren Teil des Bildes entnehmen:

EXTENDED = 0xFC
HIGH = 0xD1
LOW = 0xF7

Anzeige 1 Nach der Übertragung der HEX-Datei und der richtigen Einstellung der Fuse-Bits sollte die Anzeige wie im nebenstehenden Bild aussehen. Die Farben werden durch einen Zufallsgenerator bestimmt und können deshalb von diesem Bild abweichen. Sollte kein Bild zu sehen sein, dann kann man versuchen, durch Stecken des Jumpers J12 das Timing umzuschalten. Dazu muss die Matrixuhr nicht ausgeschaltet werden, das Ergebnis ist sofort zu sehen.

Anzeige 2 10 Sekunden später wechselt die Anzeige in den normalen Modus. Die Zeit muss im Sekundentakt zählen und der Doppelpunkt zwischen den Stunden und den Minuten im Sekunden-Rhythmus blinken. Da jetzt noch keine Zeitinformationen vorliegen, wird anstelle des Datums ein Platzhalter angezeigt.

Anzeige 3 Auch der Wochentag ist noch nicht bekannt. Die beiden Texte in der unteren Zeile wechseln übrigens alle 4 Sekunden.

Symbol Schritt 2 - MP3-Modul in Betrieb nehmen (alle Betriebsarten)

Für das MP3-Modul benötigt man eine microSD-Karte mit den gewünschten Klang-Dateien im MP3- oder WAV-Format. Diese Karte muss weder viel Speicherplatz haben, noch besonders schnell sein. Zunächst wird eine Formatierung mit FAT oder FAT32 empfohlen. Anschließend kopiert man bis zu 6 Dateien in das Hauptverzeichnis der Karte, wobei man bei den Namen beachten muss, dass dieser für den ersten Klang mit 001 beginnen muss, beim zweiten Klang mit 002 usw. Dahinter kann ein beschreibender Text folgen und den Abschluss bildet die Dateikennung .mp3 oder .wav. Ein möglicher Dateiname ist beispielsweise 006-Stunden-Gong.mp3 für den Stunden-Gong, der vom Modul dann als Klang 6 abgespielt werden kann. Im Beispiel-Sound-Paket matrixuhr-sounds.zip habe ich 6 Klänge zusammengestellt, die man direkt verwenden kann.

MP3-Modul In der Schaltungsbeschreibung hatte ich bereits erwähnt, dass das MP3-Modul die Klänge etwas verzögert abspielt. Man kann die Verzögerung ein wenig verringern, indem man das Modul in einen anderen Betriebsmodus versetzt. In der Werkseinstellung läuft das Modul im Tiefschlaf und schaut nur in größeren Zeitabständen auf die Steuereingänge. Es gibt aber auch einen Idle-Modus, der zwar einige mA mehr Strom benötigt, dafür aber die Eingänge ständig überwacht und schneller reagiert. Zum Aktivieren des Idle-Modus müssen die Tastereingänge 1 und 7 gleichzeitig für mindestens 10 Sekunden geschlossen werden. Da wir keine Taster am Modul haben, kann man für diese einmalige Prozedur auch zwei Schraubendreher nehmen und damit die entsprechenden Kontakte auf der Platinenrückseite des Moduls kurzschließen. Da alles im laufenden Betrieb erfolgen muss, ist vorsichtiges Arbeiten angesagt! Man überbrückt gleichzeitig mit dem einen Schraubendreher die Pins 3+4 und mit dem anderen die Pins 15+16 und wartet mindestens 10 Sekunden (siehe rote Verbindungen im Bild). Stellt man vorher das Potentiometer für die Lautstärke (welches sich leider auf der Unterseite befindet) in Mittelstellung und schließt den Lautsprecher an, dann bekommt man die Ansage Stand by on als Bestätigung. Die neue Einstellung wird dauerhaft im Controller des MP3-Moduls gespeichert und das langsame Blinken einer blauen LED zeigt den aktiven Idle-Modus an.

Diese Prozedur ist übrigens beim MSM2 und MSM4 identisch.

Symbol Schritt 3 - Raspberry Pi in Betrieb nehmen (nur bei Raspberry-Pi-Betrieb)

Da die grundsätzliche Inbetriebnahme eines neuen Raspberry Pi immer nach dem gleichen Muster abläuft, habe ich diese Prozedur auf einer eigenen Seite beschrieben. Hier wird auch etwas Basis-Wissen vermittelt und die Arbeit mit dem SSH-Terminal PuTTY beschrieben.

Raspberry Pi - Inbetriebnahme ← Bitte dieser Anleitung folgen und den Raspberry Pi mit Raspberry Pi OS Lite auf Basis der aktuellen OS-Version Debian 12 (Bookworm) vorbereiten. Ist für die Matrixuhr der Raspberry Pi Zero WH vorgesehen, dann muss zwingend die 32-bit-Version verwendet werden. Bei neueren Modellen wie Raspberry Pi 3, 4, 400, 5 oder Zero 2 W kann man auch die 64-bit-Version verwenden. Wenn alles erledigt ist, geht es an dieser Stelle weiter.

Zusätzlich zu den Grundeinstellungen sind bei der Matrixuhr noch 2 weitere Einstellungen erforderlich. Dafür wird ein Kommando verwendet, welches bereits bei der grundsätzlichen Inbetriebnahme zum Einsatz kam:

sudo raspi-config

Hier ist jetzt die folgende Einstellung vorzunehmen:

Falls ein 1-Wire-Sensor an den Raspberry Pi angeschlossen werden soll, dann muss noch die nachfolgende Einstellung vorgenommen werden:

Damit sind alle für die Matrixuhr notwendigen Systemeinstellungen erledigt. Wir wechseln nun mit der Tab-Taste auf Finish und drücken Enter. Es wird nun wieder ein Reboot angeboten und das bestätigen wir mit Ja und Enter. Der Raspberry Pi startet neu und trennt dabei die SSH-Verbindung. Nach dem Reboot stellen wir die SSH-Verbindung wieder her.

Symbol Schritt 4 Datei-Archiv matrixuhr-files-v430.tar.gz auf den Raspberry Pi laden und entpacken (nur bei Raspberry-Pi-Betrieb)

Das Archiv matrixuhr-files-v430.tar.gz enthält alle Dateien für den Raspberry Pi der Matrixuhr in komprimierter Form. Ich habe hier absichtlich das Linux-Programm tar verwendet, da neben der Verzeichnisstruktur auch die Zugriffsrechte archiviert werden. Das Archiv kann mit folgendem Kommando direkt in den Raspberry Pi geladen werden:

wget https://s-huehn.de/elektronik/matrixuhr/matrixuhr-files-v430.tar.gz

Jetzt packen wir das Archiv auf dem Raspberry Pi aus:

tar -xf matrixuhr-files-v430.tar.gz

Nach Ausführung dieses Kommandos finden wir im Home-Verzeichnis /home/pi einige neue Verzeichnisse, deren Inhalt wir mit dem folgenden Kommando anzeigen können:

ls matrixuhr-files/*

Die aufgelisteten 4 Unterverzeichnisse haben folgenden Inhalt:

matrixuhr-files/confenthält einige Konfigurationsdateien für die Matrixuhr
matrixuhr-files/infoenthält die Versions-Historie
matrixuhr-files/progenthält Perl- und Shell-Programme für verschiedene Aufgaben
matrixuhr-files/wwwenthält alle Dateien für die Web-Seite

Diese Struktur wird übrigens während der gesamten Inbetriebnahme nicht verändert - von allen benötigten Dateien werden grundsätzlich Kopien in den entsprechenden Systemverzeichnissen erstellt und alle persönlichen Anpassungen an den Kopien durchgeführt. So kann man bei Bedarf jederzeit auf diese Originaldateien zurückgreifen. Auch hat dieses Vorgehen den Vorteil, dass nach dem Auspacken einer neuen Archiv-Version keine Systemdateien überschrieben werden und nur dieses Archiv erneuert wird.

Symbol Schritt 5 - Systemdienste für die Kommunikation einrichten (nur bei Raspberry-Pi-Betrieb)

Die Kommunikation zwischen dem Raspberry Pi und dem Mikrocontroller der Matrixuhr erfolgt über eine serielle Schnittstelle mit 9600 Bit/s. Diese Schnittstelle wird in beiden Richtungen benutzt: Das Programm matrixuhr.pl bereitet die anzuzeigenden Daten auf und sendet sie zum Mikrocontroller der Matrixuhr. Vom Mikrocontroller der Matrixuhr gesendete Informationen werden vom Raspberry Pi empfangen und über das Programm matrixrcv.pl verarbeitet. Ein weiteres Programm matrixuhr.ctl sorgt für einen Neustart von matrixuhr.pl, wenn Änderungen an der Konfiguration durchgeführt werden. Alle 3 genannten Programme werden als Systemdienste installiert und später automatisch beim Booten des Raspberry Pi gestartet.

Weiterhin wird noch ein Verzeichnis benötigt, in dem die Konfigurationsdaten abgelegt werden. Dieses wollen wir nun anlegen und dem Benutzer www-data sowie der Benutzergruppe www-data übergeben. Damit bekommt der Web-Server, der im nächsten Schritt eingerichtet wird, den vollen Zugriff auf diese Konfigurationsdateien. Mit dem letzten Kommando wird der Benutzer pi der Benutzergruppe www-data zugeordnet und das ermöglicht uns später den problemlosen Zugriff auf die Konfigurationsdateien in diesem Verzeichnis.

sudo mkdir /srv/sensor
sudo chown www-data:www-data /srv/sensor
sudo chmod 775 /srv/sensor
sudo usermod -a -G www-data pi

An dieser Stelle müssen wir uns aus- und wieder einloggen, damit die geänderten Rechte wirksam werden:

exit

Nach einem Neustart von PuTTY loggen wir uns wieder ein und kopieren einige Konfigurationsdateien in ein Systemverzeichnis:

sudo cp matrixuhr-files/conf/*.service /usr/lib/systemd/system

Als nächstes kopieren wir die 3 oben genannten Perl-Programme an eine Position im System, die für ausführbare Dateien vorgesehen ist:

sudo cp matrixuhr-files/prog/* /usr/local/bin

Für die verschlüsselte Abfrage der Wetterdaten werden nun noch einige Perl-Bibliotheken benötigt:

sudo apt install libio-socket-ssl-perl
sudo apt install libwww-perl

Mit dem nächsten Kommando wird das Programm cpanminus installiert. Dieses ist notwendig, um weitere Perl-Module zu installieren:

sudo apt install cpanminus

Wichtig für die Wetterdaten-Abfrage und die MQTT-Funktion sind noch 4 Zusatzmodule, welche nacheinander mit den folgenden Kommandos installiert werden:

cpanm -S Net::MQTT::Simple
cpanm -S Net::MQTT::Constants
cpanm -S LWP::Simple
cpanm -S JSON::XS

Hinweis: Diese Installationen dauern teilweise etwas länger und man hat manchmal den Eindruck, das System ist stehen geblieben.

Für die Wetterdatenfunktion müssen nun noch 3 Konfigurationsdateien kopiert werden:

cp matrixuhr-files/conf/iconmu /srv/sensor
cp matrixuhr-files/conf/wcdemu /srv/sensor
cp matrixuhr-files/conf/wcenmu /srv/sensor

Jetzt sind alle Voraussetzungen für einen ersten Testlauf erfüllt. Mit dem folgenden Kommando wird nun das Programm matrixuhr.pl in einem speziellen Test-Modus gestartet:

sudo matrixuhr.pl t

Hier sollten jetzt mehrere Textzeilen erscheinen, die verschiedene Einstellungen anzeigen. Anschließend geht das Programm in eine Endlosschleife über und wiederholt die letzten 4 Zeilen immer wieder. Sinnvolle Informationen erscheinen nicht, da noch keine Konfiguration vorhanden ist. Wichtig ist jedoch, dass keine Fehlermeldungen angezeigt werden. Das Programm kann nun mit Strg-C wieder beendet werden.

Jetzt werden 3 Programme für die Matrixuhr-Funktion als Systemdienst installiert:

sudo systemctl enable matrixuhr
sudo systemctl enable matrixctl
sudo systemctl enable matrixrcv

Damit ist der automatische Start der Systemdienste eingerichtet und beim nächsten Systemstart brauchen wir uns nicht mehr darum zu kümmern. Im Moment sind die Dienste allerdings noch nicht aktiv und mit folgenden Kommandos werden diese manuell gestartet:

sudo systemctl start matrixuhr
sudo systemctl start matrixctl
sudo systemctl start matrixrcv

Symbol Schritt 6 - Web-Server installieren (nur bei Raspberry-Pi-Betrieb)

Zur komfortablen Konfiguration der Matrixuhr benötigen wir einen Web-Server. Dieser ist kein fester Bestandteil des Raspberry Pi OS und muss zunächst installiert werden. Dies erfolgt über die folgenden beiden Kommandos, das erste installiert die Basis-Software, das zweite weitere Zusatzmodule:

sudo apt install lighttpd
sudo apt install php8.2-common php8.2-cgi php8.2

Nun sind einige Änderungen in der Rechteverwaltung erforderlich.

sudo chown www-data:www-data /var/www
sudo chown www-data:www-data /var/www/html
sudo chmod 775 /var/www
sudo chmod 775 /var/www/html

Die ersten beiden Kommandos übergeben die Verzeichnisse /var/www und /var/www/html, welche für die Dateien der Web-Seite vorgesehen sind, an den Benutzer www-data und die Gruppe www-data. Anschließend wird das Schreibrecht auf diese Verzeichnisse für alle Mitglieder der Gruppe www-data erteilt. Zu dieser Gruppe gehört auch der Benutzer pi, den wir im Schritt 5 hinzugefügt haben. Der Web-Server ist bereits aktiv, allerdings muss noch ein Zusatzmodul eingeschaltet werden und dafür dienen die beiden folgenden Kommandos. Das erste Kommando aktiviert zunächst das FastCGI-Modul, welches wir für PHP benötigen. Mit dem zweiten Kommando starten wir den Web-Server neu, damit die Änderungen an der Konfiguration wirksam werden:

sudo lighty-enable-mod fastcgi-php
sudo systemctl restart lighttpd

Damit ist der Web-Server funktionsbereit und das können wir gleich mal testen. Dazu kopieren wir die Dateien für eine vorbereitete Web-Seite an die richtige Stelle:

cp matrixuhr-files/www/* /var/www/html

Wichtig: Für die nächste Aktion benötigen wir den Web-Browser auf dem PC. Hier öffnen wir ein neues Fenster oder ein neues Browser-Tab und geben dort die IP-Adresse des Raspberry Pi als Ziel ein, z.B. http://192.168.1.223 und es sollte jetzt ein Bild wie dieses erscheinen:

Matrixuhr Web-Seite

Die Seite ist noch etwas länger, auf dem Bild ist nur der obere Teil zu sehen.

Symbol Schritt 7 - Passwortschutz für den Web-Server einrichten (nur bei Raspberry-Pi-Betrieb)

Dieser Schritt ist optional, aber unbedingt notwendig, wenn der Web-Server der Matrixuhr später für das Internet freigegeben werden soll. Für den Web-Server sollte man nicht den Namen und das Passwort des SSH-Zugangs verwenden, sondern separate Zugangsdaten wählen. Als Beispiel für die folgende Beschreibung verwende ich hier den Namen meinName und das Passwort meinPasswort. Zuerst wird im Konfigurationsverzeichnis des Webservers eine Datei mit den Benutzerdaten angelegt. Dazu verwenden wir den Editor nano, der relativ einfach zu bedienen ist:

sudo nano /etc/lighttpd/lighttpd.user

Hier schreiben wir den Namen und das Passwort durch einen Doppelpunkt getrennt in eine Zeile. Das würde mit unseren Beispieldaten so aussehen:

meinName:meinPasswort

Mit der Tastenkombinationen Strg-S wird nun die Datei gespeichert und der Editor mit Strg-X wieder verlassen. Der Web-Server benötigt außerdem eine zusätzliche Konfigurationsdatei mit den Einstellungen für den Passwortschutz. In der Web-Server-Konfiguration liegt bereits eine Musterdatei bei, diese werden wir aber nicht verwenden und deshalb umbenennen und durch eine vorkonfigurierte Datei ersetzen:

sudo mv /etc/lighttpd/conf-available/05-auth.conf /etc/lighttpd/conf-available/05-auth.conf.org
sudo cp matrixuhr-files/conf/05-auth.conf /etc/lighttpd/conf-available

Jetzt muss noch das Authentication-Modul des Web-Servers eingeschaltet werden und nach einem Neustart des Web-Servers ist dann auch der Passwortschutz aktiv:

sudo lighty-enable-mod auth
sudo systemctl restart lighttpd

Wenn alles geklappt hat, dann werden jetzt beim Aufruf unserer Web-Seite im Browser der Benutzername und das Passwort abgefragt. Falls später der Wunsch besteht, Benutzername und Passwort zu ändern, dann muss nur die Benutzerdatei des Web-Servers erneut bearbeitet werden. Nach dem Speichern der Datei werden die neuen Benutzerdaten sofort wirksam.

Symbol Schritt 8 - SSL-Verschlüsselung für den Web-Server einrichten (https) (nur bei Raspberry-Pi-Betrieb)

Auch dieser Schritt ist optional und nicht notwendig, wenn der Web-Server nur im lokalen Netz zu erreichen ist. Anderenfalls sollte man nicht auf eine Verschlüsselung verzichten, denn die im Schritt 7 festgelegten Zugangsdaten werden sonst im Klartext übertragen und alle anderen Daten ebenfalls. Allerdings muss ich darauf hinweisen, dass die hier gezeigte Lösung nicht optimal ist. Normalerweise ist die SSL-Verschlüsselung mit einem Zertifikat verknüpft, welches von einer autorisierten Stelle generiert und registriert wird. Somit kann ein Browser beim Aufruf einer verschlüsselten Seite nachprüfen, ob die Verbindung vertrauenswürdig ist. Für unseren Web-Server erstellen wir das Zertifikat selbst und das hat zur Folge, dass die meisten Web-Browser die Gültigkeit des Zertifikats anzweifeln, da es nirgendwo registriert ist. Die Verschlüsselung wird aber trotzdem aktiviert, was man über die Verbindungseigenschaften des Browsers leicht nachprüfen kann. Auch lässt sich hier das Zertifikat anzeigen und da wir dessen Inhalt kennen, können wir gegebenenfalls selbst die Echtheit prüfen. Zuerst wollen wir ein Zertifikat erstellen:

openssl req -new -x509 -keyout server.pem -out server.pem -days 3650 -nodes

Anschließend werden einige Daten abgefragt. Hier kann man persönliche Daten eingeben, aber das ist nicht zwingend notwendig. Man sollte allerdings auf Umlaute und Sonderzeichen verzichten. Als Ergebnis erhalten wir eine Datei mit dem Namen server.pem. Diese muss ins Konfigurations-Verzeichnis des Web-Servers verschoben werden:

sudo mv server.pem /etc/lighttpd/

Jetzt ist es noch erforderlich, das SSL-Modul des Web-Servers zu aktivieren und den Web-Server neu zu starten:

sudo lighty-enable-mod ssl
sudo systemctl restart lighttpd

Nun versuchen wir unsere Seite über https aufzurufen, z.B.: https://192.168.1.223. Jeder ordentliche Browser wird jetzt eine Warnung ausgeben, so sagt z.B. Firefox: Warnung: Mögliches Sicherheitsrisiko erkannt. Je nach Browser muss man die Warnung bestätigen und gegebenenfalls eine Ausnahmeregel erstellen. Danach wird die Seite angezeigt und auch die Verschlüsselung aktiviert. Irgendwo im Browser lässt sich der Verschlüsselungsstatus anzeigen (z.B. bei Firefox über das Schlosssymbol links neben der Adresszeile). Hier lässt sich auch unser Zertifikat einsehen, welches übrigens 10 Jahre gültig ist.

Symbol Schritt 9 - Zugriff aus dem Internet für den Web-Server einrichten (nur bei Raspberry-Pi-Betrieb)

Ein wichtiger Hinweis vorweg: Man sollte sich diesen Schritt gut überlegen, denn man öffnet hier eine Tür, die auch ungebetene Gäste anlockt. Praktisch jeder Internet-Nutzer hat dann die Möglichkeit, eine Verbindung zu unserer Matrixuhr aufzubauen.

Für diesen Schritt ist eine Konfiguration am Router notwendig und er setzt auch die Schritte 7 (Passwort) und 8 (Verschlüsselung) voraus. Grundsätzlich ist der typische Router im Heimnetzwerk so eingestellt, dass Anfragen aus dem Internet abgeblockt werden. Wir wollen nun erreichen, dass ganz bestimmte Anfragen aus dem Internet zu unserer Matrixuhr weitergeleitet werden. Das Schlüsselwort für die Suche nach dem richtigen Konfigurationsmenü im Router ist hier: Portweiterleitung, Portumleitung oder Port Forwarding. Hier sind folgende Informationen wichtig:

Protokoll: TCP
Eingehender Port (öffentlich, extern): 443 (oder andere Nummer, siehe Text weiter unten)
Ausgehender Port (privat, intern): 443
IP-Adresse: Adresse der Matrixuhr, z.B. 192.168.1.223

Nach dem Speichern der Daten ist es möglich, unsere Matrixuhr aus dem Internet anzusprechen. Allerdings brauchen wir dafür die öffentliche IP-Adresse, die uns der Internet-Provider zugewiesen hat und genau hier gibt es ein Problem: Die IP-Adresse wird beim Aufbau einer DSL-, Kabel oder Mobilfunkverbindung meist dynamisch vergeben und ist nicht vorhersehbar. Zum Glück gibt es das so genannte dynamische DNS, welches dieses Problem löst. Damit das funktioniert, müssen 2 Bedingungen erfüllt sein: Man muss sich zunächst bei einem solchen Dienst anmelden (hier ist eine kleine Auswahl, möglicherweise etwas veraltet: http://www.pcwelt.de/ratgeber/DynDNS-Alternativen-kostenlos-5680355.html) und der Router muss für diesen Dienst konfiguriert werden. Hat man diese Hürden genommen, dann wird künftig jede Änderung der IP-Adresse automatisch vom Router an den DNS-Dienstleister gemeldet. Dieser wiederum stellt uns einen festen Namen zur Verfügung und sorgt dafür, dass unsere IP-Adresse unter diesem Namen im DNS-System hinterlegt wird. Übrigens, Benutzer einer Fritz!Box können hier den kostenlosen dynamischen DNS-Dienst von AVM verwenden.

Und hier noch ein Tipp: Ich habe die Erfahrung gemacht, dass gelegentlich Zugriffe auf die Matrixuhr stattfinden. Dies kann man weitgehend unterbinden, indem man für den externen Zugang einen vom Standard abweichenden Port verwendet. Es empfiehlt sich also, bei der Router-Konfiguration für den eingehenden Port nicht die 443 (Standard für https), sondern eine Zahl zwischen 10000 und 65535 zu wählen. Unser Zugang funktioniert trotzdem, wir müssen nur beim Aufruf aus dem Internet die gewählte Portnummer angeben, z.B.: https://mein-server.dyn-service.com:34567. Das alles gilt nur für den Aufruf der Matrixuhr über das Internet, im Heimnetz ändert sich dadurch nichts.

Damit ist die Inbetriebnahme der Matrixuhr im Raspberry-Pi-Betrieb abgeschlossen.

Symbol Schritt 10 - Alternativen Dienst zum Herunterfahren des Raspberry Pi einrichten (nur bei Raspberry-Pi-Betrieb)

Dieser Schritt wird normalerweise nicht benötigt. Wenn allerdings am seriellen Eingang des Raspberry Pi (RX, Pin 10) ein Sensormodul oder ein anderes Gerät angeschlossen ist, dann funktioniert das Herunterfahren des Raspberry Pi über den Taster S2 der Matrixuhr nicht. Falls man dennoch diese Funktionalität benötigt, dann kann man mit diesem Schritt einen alternativen Dienst installieren, der das Herunterfahren über einen direkt am Raspberry Pi angeschlossenen Taster (S4) auslöst. Dafür wird ein Dienst konfiguriert und aktiviert, welcher den einfachen Zugriff auf die GPIO-Anschlüsse des Raspberry Pi ermöglicht:

sudo nano /usr/lib/systemd/system/pigpiod.service

Nun suchen wir die folgende Zeile:

ExecStart=/usr/bin/pigpiod -l

Hier ergänzen wir am Zeilenende einige Parameter, so dass die Zeile dann so aussieht:

ExecStart=/usr/bin/pigpiod -l -m -s 10

Mit den Tastenkombinationen Strg-S und Strg-X wird die Datei gespeichert und der Editor wieder beendet. Nun können wir den Dienst aktivieren und starten:

sudo systemctl enable pigpiod
sudo systemctl start pigpiod

Zum Abschluss wird der neue Dienst zum Herunterfahren des Raspberry Pi aktiviert und gestartet:

sudo systemctl enable matrixres
sudo systemctl start matrixres

Jetzt kann der Raspberry Pi durch einen längeren Druck (2 Sekunden) auf den Taster S4 heruntergefahren werden.

Symbol Schritt 11 - Matrixuhr-Dienste auf dem Web-Modul einrichten (nur bei Web-Modul-Betrieb)

Dieser Schritt ist nur beim Web-Modul-Betrieb der Matrixuhr erforderlich. In dieser Betriebsart wird der Raspberry Pi des Web-Moduls auch für die Matrixuhr genutzt und die Uhr über ein RS-232-Kabel mit dem Web-Modul verbunden. Folgende Voraussetzungen müssen dabei erfüllt sein:

Nach dem Login auf dem Web-Modul muss zuerst das aktuelle Software-Paket für die Matrixuhr geladen und anschließend entpackt werden:

wget https://s-huehn.de/elektronik/matrixuhr/matrixuhr-files-v430.tar.gz
tar -xf matrixuhr-files-v430.tar.gz

Zunächst werden noch einige Perl-Bibliotheken benötigt:

sudo apt install libio-socket-ssl-perl
sudo apt install libwww-perl

Wichtig für die Funktion sind noch 2 Zusatzmodule, welche folgendermaßen installiert werden:

cpanm -S LWP::Simple
cpanm -S JSON::XS

Für die Wetterdatenfunktion müssen 3 Konfigurationsdateien kopiert werden:

cp matrixuhr-files/conf/iconmu /srv/sensor
cp matrixuhr-files/conf/wcdemu /srv/sensor
cp matrixuhr-files/conf/wcenmu /srv/sensor

Nun werden Programme und Einstellungsdateien an die richtige Stelle kopiert und Systemdienste gestartet:

sudo cp matrixuhr-files/prog/*.pl /usr/local/bin
sudo cp matrixuhr-files/conf/*.service /usr/lib/systemd/system
sudo systemctl enable matrixuhr
sudo systemctl enable matrixctl
sudo systemctl start matrixuhr
sudo systemctl start matrixctl

Zum Schluss müssen noch einige Dateien für die Web-Seite kopiert werden:

cp matrixuhr-files/www/matrix.php /var/www/html
cp matrixuhr-files/www/style.css /var/www/html
cp matrixuhr-files/www/favicon-matrix.png /var/www/html
cp matrixuhr-files/www/icon-matrix.png /var/www/html

Die Matrixuhr-Seite fügt sich automatisch in die Menü-Struktur des Web-Moduls ein. Ruft man jetzt mit einem Browser die Seite des Web-Moduls auf, dann sollte jetzt zusätzlich die Menü-Option  Matrixuhr  erscheinen.

SymbolUpdate

Die nachfolgende Anleitung gilt gleichermaßen für den Web-Modul-Betrieb und den Raspberry-Pi-Betrieb. Begonnen wird das Update mit der Installation der aktuellen Software v2.20 für den Mikrocontroller der Matrixuhr (siehe Schritt 1). Hier muss nur die neue Hex-Datei in den Mikrocontroller übertragen werden, eine erneute Programmierung der Fuse-Bits ist nicht erforderlich. Anschließend wird das aktuelle Software-Paket für den Raspberry Pi matrixuhr-files-v430.tar.gz geladen und entpackt:

wget https://s-huehn.de/elektronik/matrixuhr/matrixuhr-files-v430.tar.gz
tar -xf matrixuhr-files-v430.tar.gz

Die aktuelle Software benötigt ein Zusatzmodul, welches wahrscheinlich im Rahmen eines vorherigen Updates bereits installiert wurde. Trotzdem sollte das folgende Kommando ausgeführt werden:

cpanm -S JSON::XS

Nun werden einige Dateien kopiert:

cp matrixuhr-files/conf/wcdemu /srv/sensor
cp matrixuhr-files/conf/wcenmu /srv/sensor
sudo cp matrixuhr-files/prog/matrixuhr.pl /usr/local/bin
sudo cp matrixuhr-files/prog/matrixctl.pl /usr/local/bin
sudo cp matrixuhr-files/conf/matrixuhr.service /usr/lib/systemd/system
sudo cp matrixuhr-files/conf/matrixctl.service /usr/lib/systemd/system
cp matrixuhr-files/www/matrix.php /var/www/html
cp matrixuhr-files/www/style.css /var/www/html
cp matrixuhr-files/www/favicon-matrix.png /var/www/html
cp matrixuhr-files/www/icon-matrix.png /var/www/html

Nun ist noch ein Neustart der Matrixuhr-Dienste erforderlich:

sudo systemctl daemon-reload
sudo systemctl restart matrixuhr
sudo systemctl restart matrixctl

Damit ist das Update abgeschlossen. Es bleiben übrigens alle Einstellungen erhalten, sowohl an der Matrixuhr als auch am Raspberry Pi. Es empfiehlt sich trotzdem, alle Einstellungen an der Matrixuhr und auf der Matrixuhr-Seite zu prüfen und zu schauen, was es neues gibt.

Symbol Bedienung

Dieser Abschnitt gliedert sich in 2 Teile. Im ersten Teil werden alle Funktionen und Einstellmöglichkeiten der Matrixuhr-Basis beschrieben und dieser Teil gilt für alle Betriebsarten der Matrixuhr. Der zweite Teil gilt nur für den Web-Modul-Betrieb und den Raspberry-Pi-Betrieb. Hier werden alle Möglichkeiten des Web-Formulars beschrieben.

Symbol Teil 1 - Bedienung der Matrixuhr-Basis

Zunächst einige Informationen über die Anzeige der Matrixuhr. Diese kennt mehrere Anzeige-Modi, die insbesondere bei der Kopplung mit dem Temperatur-Messsystem verschiedene Informationen darstellen können:

Anzeige 4 Die Uhr verwendet (wie mehrfach schon erwähnt) ein RGB-LED-Matrix-Panel mit 32 Pixelzeilen, die jeweils 64 Pixel breit sind. Damit steht ausreichend Platz für eine große Zeitanzeige zur Verfügung (48x18 Pixel). Der Platz neben der Uhrzeit (16x18 Pixel) wird für die Anzeige der Sekunden und des Kalendertages bzw. Wochentages genutzt. Darunter passt eine Textzeile, in der weitere Informationen dargestellt werden können. Hier wird eine Proportionalschrift mit einer Höhe von 11 Pixel verwendet, welche Platz für ungefähr 12 Zeichen bietet.

Anzeige 5 Auf der unteren Zeile werden im normalen Betrieb das Datum und die Uhrzeit im Wechsel angezeigt. Die Wechselzeit lässt sich auf 2, 3 oder 4 Sekunden einstellen. Im gleichen Rhythmus kann auch die Anzeige neben der Uhrzeit zwischen Kalendertag und Wochentag wechseln. Hier ist es möglich, nur den Kalendertag, nur den Wochentag oder beides im Wechsel anzuzeigen.

Anzeige 6 Ist die Matrixuhr mit dem Sensor- oder Web-Modul verbunden oder mit einem internen Raspberry Pi ausgestattet, dann lassen sich auch die Sensorwerte des Temperatur-Messsystems darstellen. Diese Werte erscheinen ebenfalls im eingestellten Wechsel-Rhythmus und teilen sich die Zeile mit dem Datum und dem Wochentag.

Anzeige 7 Mit einer Datenverbindung zum Web-Modul oder einem internen Raspberry Pi lassen sich auch Geburtstage anzeigen. Diese fügen sich ebenfalls in den Wechsel-Rhythmus ein und erscheinen nach dem letzten Sensorwert. Nach der Anzeige aller Geburtstage kehrt die Anzeige dann wieder zum Datum zurück und der Zyklus beginnt von vorn. Übrigens, alle Informationen in der unteren Zeile werden grundsätzlich zentriert dargestellt.

Anzeige 8 Weiterhin ermöglicht eine Datenverbindung zum Web-Modul oder ein interner Raspberry Pi die Verbindung zu einem MQTT-Server. Damit lassen sich praktisch alle Daten anzeigen, die auf dem MQTT-Server als Wert im Klartext verfügbar sind, z.B. Werte von Sensoren im Haus. Hat man auf dem Server zusätzlich Node-RED und die Module für OpenWeatherMap und Tankerkönig installiert, dann lassen sich auch Wetterdaten und ausgewählte Kraftstoffpreise anzeigen. Diese Daten erscheinen ebenfalls im eingestellten Wechsel-Rhythmus auf der unteren Zeile.

Anzeige 9 Die Matrixuhr kann unter bestimmten Voraussetzungen auch Alarme des Temperatur-Messsystems anzeigen. Damit man während der Anzeige des Alarms nicht auf die anderen Informationen verzichten muss, schaltet die Uhr in einen 3-zeiligen Modus um. Die Uhrzeit wird dafür in einem anderen Zeichensatz mit nur 8 Pixel Höhe angezeigt und das schafft Platz für 2 Textzeilen mit jeweils 11 Pixel Höhe. Dabei rücken die Informationen wie Datum, Wochentag, Sensorwerte und Geburtstage um eine Zeile nach oben und ganz unten erscheint die Alarmmeldung, die ebenfalls immer zentriert angezeigt wird. Abhängig von der Konfiguration und der Tageszeit kann gleichzeitig ein akustischer Alarm ausgelöst werden.

Anzeige 10 Geht ein Alarm wieder in den inaktiven Zustand über, dann wird der Alarmtext unterstrichen dargestellt. Die Unterstreichung erfolgt in einer anderen Farbe, um den Zustand etwas auffälliger zu gestalten. Im nebenstehenden Bild wurde beispielsweise die Klappe des Briefkastens wieder geschlossen. Treten mehrere Alarme gleichzeitig auf, dann werden diese im gleichen Wechsel-Rhythmus wie die anderen Informationen angezeigt. Mit der Quittierungsfunktion, deren Beschreibung weiter unten folgt, lassen sich inaktive Alarme wieder löschen.

Anzeige 11 Bei der Kopplung der Matrixuhr mit dem Web-Modul oder einem internen Raspberry Pi steht eine besondere Funktion zur Verfügung: Über die Web-Seite lässt sich eine Nachricht eingeben und diese erscheint dann auf der Uhr als Laufschrift. Gleichzeitig wird auch hier ein akustisches Signal abgespielt. Die Nachricht wird fortlaufend wiederholt, bis man sie über die Quittierungsfunktion wieder löscht. Gleichzeitig auftretende Alarme erzeugen einen akustischen Alarm, erscheinen aber erst in der Anzeige, wenn die Textnachricht quittiert wurde.

Anzeige 12 Viele Einstellungen werden direkt an der Matrixuhr durchgeführt. Dafür wird eine 3-zeilige Anzeige verwendet, um möglichst viele Informationen darstellen zu können. Während die erste Zeile weiterhin die Uhrzeit anzeigt, erscheint auf der zweiten Zeile linksbündig die ausgewählte Einstellung und auf der dritten Zeile rechtsbündig der gerade eingestellte Wert.

Die Matrixuhr verwendet grundsätzlich 3 Farben. Eine Farbe ist für die Uhrzeit (Stunden, Minuten und Sekunden) bestimmt, eine weitere Farbe für die Informationen (Datum, Wochentag, Sensorwerte, Geburtstage) und die dritte Farbe für Alarme und Textnachricht. In allen Beispielbildern und in der folgenden Beschreibung verwende ich einheitlich folgende Farben und Bezeichnungen:

Zeit-Farbe (Hellblau) für Stunden, Minuten und Sekunden
Datum-Farbe (Hellgrün) für Datum, Wochentag, Sensorwerte, Geburtstage (außerdem die gewählte Einstellung im Einstellungs-Menü)
Alarm-Farbe (Rot) für Alarme und Textnachricht (außerdem der aktuelle Wert im Einstellungs-Menü)

In der Grundeinstellung der Matrixuhr bestimmt ein Zufallsgenerator diese 3 Farben und zu jeder vollen Stunde werden neue Farben ermittelt. Der Zufallsgenerator sorgt dafür, das sich die Farbe für jeden Anzeigebereich (Zeit, Datum, Alarm) ändert und immer 3 unterschiedliche Farben gewählt werden. Es ist aber auch möglich, die Farben unabhängig voneinander fest zuzuweisen. Meine Uhr ist beispielsweise so eingestellt, dass Zeit und Datum eine Zufallsfarbe verwenden, während die Alarme fest auf Rot eingestellt sind. Der Zufallsgenerator verhindert auch hier, dass gleiche Farben erzeugt werden und wird der Zeit und dem Datum niemals Rot zuweisen. Ausnahme: Die Uhr verwendet einige Symbole, die unabhängig von diesem System mit fest definierten Farben angezeigt werden.

Die Bedienung und Einstellung der Matrixuhr erfolgt über 3 Taster. Ein Überblick über die grundsätzliche Funktion dieser Taster enthält die folgende Tabelle:

TasterNameFunktion im NormalbetriebFunktion im Einstellungs-Menü (kurzer Tastendruck)Funktion im Einstellungs-Menü (langer Tastendruck) Sonderfunktion (Tastendruck > 4s)
1MenüAufruf des Einstellungs-MenüsZur nächsten Einstellung wechselnEinstellungs-Menü vorzeitig beenden-
2ÄndernMute-Funktion ein-/ausschaltenWert schrittweise ändernWert schnell ändern Raspberry Pi herunterfahren
3QuittierenInaktive Alarme löschen---

Nach der Inbetriebnahme der Matrixuhr sollte zunächst eine Grundeinstellung erfolgen. Diese wird über das Einstellungs-Menü vorgenommen, welches nach einem kurzen Druck auf den Taster Menü (Taster 1) auf dem Display erscheint. Dabei gelangt man direkt zur ersten Einstellung. Alle Einstellungen sind grundsätzlich gleich aufgebaut: In der oberen Zeile läuft (dargestellt in Zeit-Farbe) die Uhrzeit in verkleinerter Form weiter. In der mittleren Zeile (dargestellt in Datum-Farbe) steht im Klartext, welche Einstellung gerade durchgeführt wird. Die untere Zeile zeigt (dargestellt in Alarm-Farbe) den gerade eingestellten Wert an. Dieser Wert kann unterschiedliche Formen annehmen: Zahlen, Texte oder auch farbige Symbole.

Der folgende Abschnitt beschreibt alle Einstellungen in der Reihenfolge, wie sie nach dem Druck auf den Taster Menü erscheinen.

Anzeige 13 Einstellung Zeit-Farbe: Mit dieser Einstellung lässt sich die Farbe der Stunden, Minuten und Sekunden festlegen. Die untere Zeile besteht aus einer Reihe von ausgefüllten Farbfeldern und einem leeren Farbrahmen. Das Pfeilsymbol in der Zeilenmitte unter den Farbfeldern zeigt dabei auf das gerade ausgewählte Element. Die ausgefüllten Farbfelder stehen hier für eine feste Farbeinstellung, der leere Farbrahmen symbolisiert die Zufallsfunktion. Letztere steht über dem Pfeilsymbol und ist somit aktuell eingestellt. Die Farbe des Rahmens entspricht dabei der aktuellen Zufallsfarbe.

Anzeige 14 Um die Farbeinstellung zu ändern, drückt man auf den Taster Ändern (Taster 2). Dabei wandern die Farbfelder um eine Position nach links und das Pfeilsymbol zeigt nun auf das nächste Farbfeld. Damit ist die Zeit-Farbe jetzt fest auf Blau eingestellt und die Uhrzeit in der oberen Zeile übernimmt diese Farbe sofort. Jeder weitere Druck auf den Taster Ändern schaltet zur nächsten Farbe weiter (16 stehen zur Verfügung) bis man irgendwann wieder beim Zufallssymbol ankommt. Ist man mit der Einstellung zufrieden, dann kann man durch einen kurzen Druck auf den Taster Menü zur nächsten Einstellung gehen.

Anzeige 15 Einstellung Datum-Farbe: Über den Taster Ändern kann die Farbe von Datum, Wochentag, Sensorwerten, Geburtstagen sowie der kleinen Tag-Anzeige unter den Sekunden geändert werden. Auch hier zeigt das Pfeilsymbol auf die Voreinstellung „Zufall“. Die Änderung der Einstellung erfolgt in der gleichen Art und Weise wie bei der Zeit-Farbe. Eine Farbänderung ist hier jedoch nicht bei der Uhrzeit, sondern beim Text „Datum-Farbe“ zu sehen. Ein kurzer Druck auf den Taster Menü springt zur nächsten Einstellung. Das gilt übrigens für alle weiteren Einstellungen ebenso und wird deshalb nicht mehr erwähnt.

Anzeige 16 Einstellung Alarm-Farbe: Diese Einstellung beeinflusst die Farbe von Alarmmeldungen und der Textnachricht. Die Voreinstellung ist auch hier der „Zufall“.

Anzeige 17 Einstellung Farbe meiden: Mit dieser Einstellung hat man die Möglichkeit, eine bestimmte Farbe vom Zufall auszuschließen. Die Voreinstellung ist hier „aus“ (das Pfeilsymbol zeigt auf einen leeren weißen Rahmen). Wählt man hier eine Farbe aus, dann wird diese künftig vom Zufallsgenerator nicht mehr vergeben. Ich habe über diese Funktion die Farbe Blau ausgeblendet. Informationen in dieser Farbe sind insbesondere nachts nur schwer zu lesen.

Anzeige 18 Einstellung Helligkeit Min: Diese Einstellung legt den minimalen Helligkeitswert des Matrix-Displays in Stufen von 1-10 fest. Der voreingestellte Wert 1 bedeutet, dass das Display bei Dunkelheit auf die niedrigste Helligkeitsstufe gesetzt wird. Das ist eigentlich die optimale Einstellung und sorgt dafür, dass das Display bei Nacht nicht blendet und trotzdem noch gut ablesbar bleibt. Allerdings werden im stark gedimmten Betrieb gelegentlich „Geisterpixel“ sichtbar, die das Bild etwas stören. Um diesen Effekt zu mildern, kann man mit dieser Einstellung die minimale Helligkeit erhöhen.

Durch Drücken des Tasters Ändern kann der Wert um eine Stufe erhöht werden, nach dem Erreichen des Endwertes 10 wird dann wieder bei 1 begonnen. Diese Art der Eingabe findet man auch bei anderen Einstellungen wieder, wo Zahlen oder Zeiten ausgewählt werden müssen. Hier ist es meist auch möglich, durch einen langen Druck auf den Taster Ändern eine schnelle Werteänderung zu bewirken (Auto-Repeat-Funktion).

Anzeige 19 Einstellung Helligkeit Max: Diese Einstellung legt den maximalen Helligkeitswert des Matrix-Displays in Stufen von 1-10 fest. Das Display leuchtet bei hoher Umgebungshelligkeit sehr hell und in Wohnräumen ist der voreingestellte Wert 10 oft zu hoch. Hier lässt sich die Helligkeit etwas reduzieren. Die realen Helligkeitswerte der 10 Stufen sind hier übrigens nicht identisch mit denen der minimalen Helligkeit.

Hinweis: Für eine optimale Einstellung der Helligkeitsregelung sollte man zunächst bei dunkler Umgebung den besten Wert für Helligkeit Min ermitteln, anschließend bei heller Umgebung den besten Wert für Helligkeit Max. Während der Dämmerung muss man ein wenig mit dem Potentiometer R11 experimentieren, bis man den optimalen Übergang zwischen den beiden Endwerten gefunden hat.

Anzeige 20 Einstellung Wechselzeit: Über diese Einstellung lässt sich die Zeit festlegen, nach der die anzuzeigenden Daten wechseln (Datum, Wochentag, Sensordaten, Geburtstage, Alarme). Die Wechselzeit kann 2, 3 oder 4 Sekunden betragen.

Anzeige 21 Einstellung Datum zeigen: Mit dieser Einstellung ist es möglich, das Datum aus der Wechselanzeige zu entfernen. In der Grundeinstellung ein wird das Datum angezeigt. Bei der Einstellung aus arbeitet die Wechselanzeige ohne Datum.

Anzeige 22 Einstellung W-Tag zeigen: Mit dieser Einstellung ist es möglich, den Wochentag aus der Wechselanzeige zu entfernen. In der Grundeinstellung ein wird der Wochentag angezeigt. Bei der Einstellung aus arbeitet die Wechselanzeige ohne Wochentag.

Anzeige 23 Einstellung Taganzeige: Mit dieser Einstellung kann die zweistellige Taganzeige unterhalb der Sekunden beeinflusst werden. Die Grundeinstellung Kalendertag bewirkt, dass hier ständig der Kalendertag (1-31) angezeigt wird. Über die Einstellung Wochentag lässt sich die Anzeige auf den Wochentag mit 2 Zeichen umstellen (z.B. Do). Die dritte Einstellmöglichkeit wechselnd ermöglicht eine Wechselanzeige zwischen Kalendertag und Wochentag.

Anzeige 24 Einstellung Nacht von: Mit dieser Einstellung lässt sich der Beginn eines Zeitraums festlegen, in dem das Display der Matrixuhr ausgeschaltet wird. Während dieser Zeit bleibt das Display auch ausgeschaltet, wenn Alarme oder Nachrichten empfangen werden. Es ist aber möglich, durch Drücken eines beliebigen Tasters das Display für 30 Sekunden zu aktivieren.

Anzeige 25 Einstellung Nacht bis: Mit dieser Einstellung lässt sich das Ende des Zeitraums festlegen, in dem das Display der Matrixuhr ausgeschaltet wird. Eine identische Einstellung von Nacht von und Nacht bis bewirkt die Deaktivierung der Nachtzeit. Übrigens, die Nachtzeit arbeitet vollkommen unabhängig von den Zeit-Einstellungen für den Sound, die etwas weiter unten beschrieben werden.

Anzeige 26 Einstellung Test-LED: Mit dieser Einstellung kann die LED D3 für Testfunktionen aktiviert werden. In der Grundeinstellung ist die LED ausgeschaltet. Mit der Auswahl der Test-Funktion DCF werden die empfangenen DCF77-Impulse an die LED weitergegeben. Bei ordnungsgemäßer Funktion des DCF77-Empfängers sollte die LED im Sekundentakt kurz aufleuchten. Die zweite Test-Funktion RS-232 bewirkt, dass jedes empfangene Datenpaket die LED kurz aufleuchten lässt. Bei korrekter Verbindung zu einem Sensormodul, Web-Modul oder dem internen Raspberry Pi sollte die LED in gewissen Zeitabständen aufleuchten (ungefähr alle 1-5 Sekunden).

Anzeige 27 Einstellung Feste Sync-Z (Feste Synchronisierungs-Zeit): Die Matrixuhr versucht ständig ein DCF77-Signal zu empfangen, um die Zeit zu synchronisieren. Leider werden durch das Matrix-Display so viele Störsignale erzeugt, dass im laufenden Betrieb keine DCF77-Synchronisierung möglich ist. Setzt man diese Einstellung auf ein, wird zu einer festen Uhrzeit und außerdem 2 Minuten nach dem Einschalten der Uhr das Matrix-Display zur Minderung von Störungen ausgeschaltet. Nach erfolgreicher Synchronisierung oder nach 30 Minuten aktiviert sich das Display wieder. Übrigens, wenn die etwas weiter oben beschriebene Nachtzeit genutzt wird, dann deaktiviert sich automatisch die feste Synchronisierungs-Zeit.

Anzeige 28 Einstellung Sync-Stunde (Synchronisierungs-Stunde): Diese Einstellung ergänzt die vorherige Einstellung Feste Sync-Z und hier wird die Zeit (Stunde) festgelegt, zu der das Display ausgeschaltet werden soll. Die Voreinstellung 3 bewirkt eine DCF77-Synchronisierung um 03:00 Uhr und ist somit optimal für Uhren im Wohnbereich. Befindet sich die Matrixuhr in einem Schlafzimmer, dann sollte man diese Einstellung z.B. auf 16 (16:00 Uhr) ändern, damit über Nacht eine kontinuierliche Anzeige vorhanden ist.

Anzeige 29 Einstellung DCF-Invert. (DCF-Invertierung): Mit dieser Einstellung lässt sich das empfangene DCF77-Signal invertieren. Wenn man nicht sicher ist, ob der verwendete DCF77-Empfänger eine Invertierung erfordert, kann man die Test-LED aktivieren und das Signal beobachten. Die LED sollte dann im Sekundentakt kurz aufleuchten. Scheint die LED hingegen eher ständig zu leuchten und im Sekundentakt kurz zu verlöschen, dann muss das DCF77-Signal invertiert werden, d.h. man muss diese Einstellung auf ein setzen. Verwendet man den in der Schaltung angegebenen Pollin-Empfänger, dann ist die Einstellung ein erforderlich.

Anzeige 30 Einstellung DCF-Pull-up (DCF-Eingang mit Pull-up-Widerstand): Falls der verwendete DCF77-Empfänger einen Open-Collector- bzw. Open-Drain-Ausgang besitzt, dann ist ein zusätzlicher Widerstand gegen +5V erforderlich. Dieser befindet sich im Mikrocontroller und kann mit dieser Einstellung aktiviert werden. Auch hier kann man die Test-LED zu Hilfe nehmen und das Signal beobachten. Bei falscher Einstellung leuchtet die LED ständig oder bleibt ständig aus. Der hier verwendete Pollin-Empfänger benötigt keinen Pull-up-Widerstand, hier kann man die Voreinstellung aus übernehmen.

Die folgende Tabelle zeigt eine Übersicht über die gebräuchlichsten DCF77-Empfänger und die erforderlichen Einstellungen:

DCF77-EmpfängerEinstellung DCF-Invert.Einstellung DCF-Pull-up
Pollin 810054einaus
Reichelt DCF77 MODULeinaus
ELV 091610ausein

Anzeige 31 Einstellung Stundengong: Diese Einstellung erklärt sich eigentlich selbst: Hier lässt sich das akustische Stundensignal ein- oder ausschalten. Die Voreinstellung ist ein.

Anzeige 32 Einstellung Alarmsound: Hier kann das akustische Signal bei einem Alarm vom Temperatur-Messsystem ein- oder ausgeschaltet werden. Diese Einstellung wirkt auch auf die Textnachricht vom Web-Modul. Die Voreinstellung ist ein.

Anzeige 33 Einstellung Sound von: Mit dieser Einstellung legt man den Beginn eines Zeitfensters fest, in dem akustische Signale erzeugt werden sollen.

Anzeige 34 Einstellung Sound bis: Diese Einstellung legt das Ende des Zeitfensters fest, in dem akustische Signale erzeugt werden sollen. Damit der Stundengong noch sicher ausgelöst wird, verlängert die Uhr das Zeitfenster um eine weitere Minute, das wirkliche Ende ist also in dieser Beispiel-Einstellung erst um 22:01 Uhr.

Hinweis: Es ist auch möglich, ein Zeitfenster in der Nacht einzustellen, also z.B. Sound von 23 und Sound bis 5. Das ergibt einen Zeitraum von 23:00 Uhr bis 05:01 Uhr. Möchte man generell keine akustischen Signale, dann muss man die Einstellung Stundengong auf aus und Alarmsound auf aus setzen. Für die vorübergehende Abschaltung gibt es die Mute-Funktion, die noch beschrieben wird.

Anzeige 35 Einstellung Roll-Geschw. (Roll-Geschwindigkeit der Laufschrift): Diese Einstellung ist nur bei einer Datenverbindung zum Web-Modul oder zum internen Raspberry Pi relevant. Hier lässt sich die Geschwindigkeit der als Laufschrift angezeigten Textnachricht festlegen. Die Voreinstellung ist 0 (sehr langsam) und kann bis auf 20 (sehr schnell) erhöht werden. Da man die Geschwindigkeit nicht am Wert erkennen kann, zeigt eine laufende Punktreihe die aktuell eingestellte Geschwindigkeit an.

Anzeige 36 Einstellung Sensorfilter: Diese Einstellung ist nur bei einer Datenverbindung zum Sensormodul relevant. In der Voreinstellung aus werden alle vom Sensormodul gelieferten Werte im eingestellten Wechsel-Rhythmus gemeinsam mit dem Datum und dem Wochentag angezeigt. Bei der Einstellung ein ist mehr Konfigurationsaufwand nötig, dafür lassen sich bestimmte Sensoren für die Anzeige auswählen und auch die Reihenfolge kann geändert werden.

Zum Vergleich der beiden Einstellungen habe ich ein Beispiel konstruiert: Es gibt 2 Temperatursensoren, einen Luftdrucksensor und einen Luftfeuchtigkeitssensor. Mit der Einstellung Sensorfilter aus werden alle verfügbaren Sensorwerte nacheinander ausgegeben. Dabei wird vor dem Sensorwert ein einfacher Name generiert und nach dem Wert eine entsprechende Einheit ergänzt. So ergibt sich in unserem Beispiel ohne weitere Konfigurationsarbeit die folgende Anzeige:

12.07.2018DonnerstagS01: 23.5°CS02: 18.4°CS25: 22.9°CS28: 984hPaS29: 47%12.07.2018 ⋅⋅⋅

Die Einstellung Sensorfilter ein erlaubt mehr Gestaltungsmöglichkeiten. Hier ist es möglich, die Anzahl der Sensoren zu begrenzen, die Reihenfolge der Sensoren festzulegen und es können Namen für die Sensoren vergeben werden. Die Einheit hinter dem Sensorwert wird auch hier automatisch ergänzt. Die einzige Einschränkung ist die Begrenzung auf maximal 8 Sensoren. So lässt sich mit der gleichen Beispiel-Konfiguration folgende Anzeige erzeugen:

12.07.2018DonnerstagAußen 18.4°CInnen 23.5°CInnen 47%12.07.2018 ⋅⋅⋅

Um eine solche gefilterte Anzeige zu bekommen, müssen die nachfolgenden 16 Einstellungs-Menüs bearbeitet werden. Abhängig von der Anzahl der Sensoren lassen sich allerdings einige Einstellungen überspringen.

Anzeige 37 Einstellung Sensornum. 1 (Sensornummer 1): Diese Einstellung ist (ebenso wie die folgenden Einstellungen Sensornum. 2 bis Sensornum. 8) nur relevant, wenn die vorherige Einstellung Sensorfilter auf ein gesetzt wurde. Hier kann man festlegen, welche 8 Sensoren im Anzeigezyklus nacheinander auf dem Display erscheinen sollen. Ich benutze wieder das konstruierte Beispiel und möchte die Reihenfolge wie in der Zeile weiter oben verwenden: zuerst die Außentemperatur (Sensor 2), dann die Innentemperatur (Sensor 1) und zum Schluss die Luftfeuchtigkeit (Sensor 29). Zunächst beginnt man mit der Einstellung Sensornum. 1 und stellt hier mit dem Taster Ändern den Wert 2 ein. Ein Druck auf Menü wechselt zur Einstellung Sensornum. 2 und hier wird nun 1 eingestellt. Weiter geht es mit der Einstellung Sensornum. 3, die auf den Wert 29 gesetzt wird. Die weiteren Einstellungen Sensornum. 4 bis Sensornum. 8 bleiben bei diesem Beispiel auf der Vorgabe aus. Damit sind Reihenfolge und anzuzeigende Sensornummern festgelegt.

Anzeige 38 Einstellung Sensornam. 1 (Sensorname 1): Über diese Einstellung und die nachfolgenden Einstellungen bis Sensornam. 8 können Namen für die 8 ausgewählten Sensoren eingegeben werden. Die Voreinstellung ist Sen-1 bis Sen-8 und lässt sich editieren. Möchte man den Namen beibehalten, dann geht es mit dem Taster Menü weiter zur nächsten Einstellung. Alternativ gelangt man mit dem Taster Ändern in den Editier-Modus.

Anzeige 39 Den eingeschalteten Editiermodus erkennt man an einem Unterstrich in Datum-Farbe, der das gerade editierte Zeichen markiert. Dieses Zeichen kann man nun mit dem Taster Ändern bearbeiten. Nach einem Tastendruck wird das nächste Zeichen im Alphabet angezeigt, in diesem Fall wäre das ein T. Soll wie im Beispiel der Text Außen entstehen, dann muss man recht oft drücken, da nach den großen noch die kleinen Buchstaben folgen und außerdem auch einige Sonderzeichen und die Ziffern 0-9. Durch langes Drücken auf Ändern kann man das gewünschte Zeichen schneller erreichen.

Anzeige 40 Hat man das richtige Zeichen gefunden, dann gelangt man mit dem Taster Menü zur nächsten Zeichenposition. Hier kann man wiederum mit Ändern das zweite Zeichen einstellen. Ist nach der Eingabe des letzten Zeichens der Text komplett, dann wird mit dem nächsten Druck auf Menü der Editiermodus wieder verlassen und gleichzeitig zur nächsten Einstellung (in diesem Fall Sensornam. 2) gesprungen. Danach folgen noch die Einstellungen Sensornam. 3 bis Sensornam. 8, in denen die Namen für die bis zu 8 gefilterten Sensoren eingegeben werden können.

Die Namen können maximal 5 Zeichen lang sein, mehr passt leider nicht auf die Zeile. Auch bei 5 Zeichen kann es eng werden, wenn der Temperaturwert vor dem Komma 3-stellig wird (z.B. bei 100.0°C oder -10.0°C). In diesen Fällen wird das Leerzeichen zwischen Name und Wert weggelassen. Grundsätzlich verwendet die Matrixuhr bei allen Texteingaben den nachfolgenden Zeichenvorrat:

-.:0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜabcdefghijklmnopqrstuvwxyzäöüß∎

Anzeige 41 Das letzte Symbol ist das so genannte Endezeichen. Dieses wird immer dann benötigt, wenn der Name kürzer als 5 Zeichen ist. Das linke Bild zeigt am Beispiel des Sensornamens Bad die erforderliche Eingabe. Hier muss an der Zeichenposition 4 das Endezeichen gesetzt werden. Auch wenn das hier etwas seltsam aussieht - die Software gibt später nur den Text Bad aus und ignoriert nachfolgende Zeichen.

Anzeige 42 Einstellung Alarme (Alarme vom Sensormodul): In dieser Einstellung kann man die 4 Alarme des Sensormoduls aktivieren. Dies sollte man nur dann tun, wenn eine direkte Verbindung zum Sensormodul besteht und sich die 4 Alarme gerade im Ruhezustand befinden. Wird die Einstellung auf ein gesetzt, dann wird der aktuelle Status aller Alarme als Ruhezustand angenommen und gespeichert. Anschließend erfolgt bei jeder Abweichung von diesem Zustand eine Alarmmeldung.

Anzeige 43 Einstellung Alarmname 1: Über diese Einstellung kann ein Name für den Alarm 1 des Sensormoduls eingegeben werden, die Voreinstellung ist Alarm-1. Die Eingabe erfolgt in der gleichen Weise wie bei den Sensornamen. Möglich sind hier bis zu 12 Zeichen, wobei man ausprobieren muss, ob der Name in die Zeile passt. Falls der Name bereits bei der Eingabe über den Bildrand geht, sorgt die Software dafür, dass der gerade bearbeitete Textteil komplett sichtbar ist und bearbeitet werden kann.

In den 3 nachfolgenden Einstellungen können die Namen für die Alarme 2-4 eingegeben werden.

Anzeige 44 Einstellung Aut. Sommerz. (Automatische Sommerzeit): Die Voreinstellung ein bewirkt, dass am letzten Sonntag im März und am letzten Sonntag im Oktober die Sommerzeit automatisch ein- und wieder ausgeschaltet wird, auch wenn die Uhr gerade keinen DCF77-Empfang oder keine Verbindung zum Internet hat. Sollte die Sommerzeit irgendwann abgeschafft werden, dann ist diese Einstellung auf aus zu setzen.

Anzeige 45 Einstellung Tag (Kalendertag): Diese Einstellung ermöglicht das manuelle Setzen des Kalendertages.

Anzeige 46 Einstellung Monat: Mit dieser Einstellung lässt sich der Monat setzen.

Anzeige 47 Einstellung Jahr: Mit dieser Einstellung wird das Jahr im Bereich von 2024 bis 2099 gesetzt.

Anzeige 48 Einstellung Stunde: Diese Einstellung setzt den Stundenwert. Jede Änderung ist sofort in der oberen Zeile sichtbar.

Anzeige 49 Einstellung Minute: Mit dieser Einstellung können die Minuten gesetzt werden. Auch hier ist jede Änderung sofort in der oberen Zeile sichtbar.

Anzeige 50 Einstellung Sekunde: Diese Einstellung unterscheidet sich von den vorherigen: Ein kurzer Druck auf Ändern setzt den Sekundenwert und auch einen Interrupt-Vorteiler auf 0 und sorgt für einen genauen Start der Matrixuhr mit den vorher eingestellten Werten für Datum und Uhrzeit.

Anzeige 51 Einstellung Matrix-Test: Dies ist nicht nur eine Testfunktion für das Display, sondern auch ein Stresstest für die Stromversorgung. Ein kurzer Druck auf Ändern setzt alle LEDs auf einen etwas höheren Weißwert als normal. Wenn alle LEDs weiß leuchten, dann ist das ein gutes Zeichen, dass alle Farben funktionieren. Für das Netzteil gibt es jetzt auch mehr zu tun, weil im normalen Betrieb nie alle LEDs leuchten und auch nicht diese Helligkeit erreicht wird. Kommt es hier zu einem Neustart der Software, dann ist vermutlich die Spannung eingebrochen und der Controller führt dann bei ungefähr 4,3V einen Reset durch. Funktioniert alles normal, dann führt ein nochmaliger Druck auf Ändern wieder zurück in die Einstellung Matrix-Test.

Anzeige 52 Einstellung Sound-Test: An dieser Stelle kann man die Funktion des MP3-Moduls prüfen. Ein kurzer Druck auf Ändern spielt den gerade angezeigten Sound 1 ab, gleichzeitig springt die Anzeige auf Sound 2. Der nächste Tastendruck spielt dann den Sound 2 ab und die Anzeige wechselt wiederum zum nächsten Sound. Zu beachten ist, dass die Software nach dem Start einer Sound-Ausgabe 6 Sekunden wartet, bevor der nächste Sound ausgelöst wird. Das soll verhindern, dass ein laufender Sound vom nächsten unterbrochen wird. Also nicht ungeduldig werden, wenn hier Verzögerungen auftreten.

Anzeige 53 Einstellung Sprache: Mit dieser Einstellung lässt sich die Sprache für die Menü-Texte ändern. Ein Druck auf den Taster Ändern schaltet die Ansicht in Language - English um und die Sprache wird komplett auf Englisch umgestellt. Ein weiterer Druck auf Ändern stellt die Sprache wieder auf Deutsch zurück.

Der nächste Druck auf Menü führt wieder zurück zur normalen Anzeige.

Übrigens, es ist nicht zwingend erforderlich, alle Einstellungs-Menüs zu durchlaufen. Man kann jederzeit mit einem langen Tastendruck auf Menü die Einstellungen abbrechen und zur normalen Anzeige zurückkehren. Alle geänderten Einstellungen werden dann dauerhaft im EEPROM des Mikrocontrollers gespeichert. Das passiert natürlich auch beim normalen Verlassen nach der letzten Einstellung. Erfolgt in den Einstellungs-Menüs 2 Minuten lang keine Eingabe, dann kehrt die Anzeige automatisch zum Normalbetrieb zurück. Auch in diesem Fall werden alle Änderungen gespeichert.

Weitere Funktionen

Anzeige 54 Funktion Mute: Im normalen Anzeigebetrieb sowie auch während der Anzeige von Alarmen oder einer Nachricht kann über einen kurzen Druck auf den Taster Ändern diese Funktion aktiviert oder deaktiviert werden. Diese bewirkt eine Stummschaltung, es werden also keine akustischen Signale mehr ausgegeben. Während Mute aktiv ist, wird eine durchgehende Linie in Alarm-Farbe unter der Uhrzeit angezeigt. Nach ungefähr 12 Stunden wird die Mute-Funktion automatisch wieder deaktiviert.

Anzeige 55 Funktion Quittieren: Mit dieser Funktion werden inaktive (unterstrichene) Alarme in der unteren Zeile gelöscht und die normale Anzeige wieder hergestellt. Für diese Funktion ist der Taster 3 bzw. die Sensorfläche Quittieren zuständig. Für eine optische Rückmeldung sorgt eine Animation: Es erscheint zunächst die gleiche Linie wie bei Mute unter der Uhrzeit. An beiden Enden werden dann in schneller Folge die Pixel nacheinander gelöscht, bis die Linie schließlich komplett verschwunden ist. Die Animation erscheint auch, wenn es eigentlich nichts zu quittieren gibt. So kann man die Funktion der Sensorfläche prüfen.

Anzeige 56 Funktion Raspberry Pi herunterfahren: Diese Funktion ist nur im Raspberry-Pi-Betrieb sinnvoll und ermöglicht das sichere Ausschalten der Matrixuhr durch Herunterfahren des Raspberry Pi, z.B. zu Wartungszwecken. Das Herunterfahren wird durch sehr langes Drücken (mindestens 4 Sekunden) des Tasters Ändern ausgelöst. Dabei erscheint wie bei der Funktion Mute zunächst eine durchgehende Linie in Alarm-Farbe, die nach 4 Sekunden aber wieder verschwindet. Der Taster kann dann wieder losgelassen werden und kurze Zeit später sendet der Raspberry Pi die Alarm-Meldung Poweroff. Man sollte dem Raspberry Pi noch eine Minute Zeit geben, anschließend kann man die Matrixuhr ausschalten.

Anzeige 57 Warnhinweis Keine Synchronisierung: Dieser Fall tritt ein, wenn die Uhr eingeschaltet wird und folglich noch keine Zeitdaten vorliegen. Erkennbar ist dieser Zustand am Doppelpunkt, der in Alarm-Farbe blinkt. Ist die Uhr mit einem DCF77-Empfänger ausgerüstet oder mit dem Web-Modul bzw. internen Raspberry Pi verbunden, dann erfolgt irgendwann eine Synchronisierung und der Hinweis verschwindet wieder. Alternativ kann man die Zeit auch manuell eingeben und bei der letzten Einstellung Sekunde wird beim Druck auf Ändern der Warnhinweis gelöscht.

Hinweis: Solange die Uhr nicht synchronisiert ist, funktioniert die Nachtzeit nicht und es werden keine akustischen Alarme ausgegeben. Die einzige Ausnahme ist die Einstellung Sound-Test, diese funktioniert auch ohne Synchronisierung.

Anzeige 58 Warnhinweis Synchronisierungsausfall: Dieser Hinweis erscheint, wenn die Uhr Zeitinformationen vom DCF77-Signal oder vom Web-Modul bzw. internen Raspberry Pi bezieht und mindestens 24 Stunden keine gültige Zeit mehr empfangen wurde. Der Doppelpunkt blinkt in diesem Fall in Datum-Farbe. Die Uhr läuft trotzdem normal weiter und wenn das Empfangsproblem behoben wurde, verschwindet auch der Warnhinweis wieder.

Hinweis: Diese Warnung erscheint nicht, wenn die Uhr manuell gestellt wurde und weder DCF77-Empfänger noch Web-Modul-Verbindung oder Raspberry Pi vorhanden sind. Es ist also nicht erforderlich, die Uhr jeden Tag zu stellen :-)

Symbol Teil 2 - Bedienung der Web-Seite der Matrixuhr

Dieser Teil ist nur relevant, wenn die Matrixuhr eine serielle Verbindung zum Web-Modul hat oder mit einem internen Raspberry Pi ausgestattet ist. In beiden Fällen ist die Bedienung absolut identisch. Der einzige Unterschied ist: beim Web-Modul-Betrieb öffnet man die Web-Seite des Web-Moduls und wählt im Menü die Option  Matrixuhr  - beim Raspberry-Pi-Betrieb öffnet man die Web-Seite auf dem Raspberry Pi der Matrixuhr.

Die Web-Seite ist in folgende 7 umrahmte Bereiche unterteilt, die jeweils eine Funktion umfassen:

Nachfolgend werden die Bereiche in der oben stehenden Reihenfolge beschrieben - bis auf eine Ausnahme: Die System-Einstellungen werden zuerst behandelt, denn ohne diese sind einige Funktionen nicht nutzbar.

Bereich System-Einstellungen

Matrixuhr Web-Seite

In diesem Bereich werden verschiedene Grundfunktionen aktiviert und konfiguriert. Ganz oben lässt sich die Zeit-Synchronisierung einschalten und direkt darunter wird das Synchronisierungs-Intervall festgelegt. Aktiviert man die Zeit-Synchronisierung mit dem voreingestellten Intervall von 60 Minuten, dann wird alle 60 Minuten ein Datenpaket mit der aktuellen Zeit zum Mikrocontroller der Matrixuhr gesendet. Außerdem erfolgt die erste Zeit-Synchronisierung immer eine Minute nach dem Einschalten der Matrixuhr und auch immer eine Minute nach einer Konfigurationsänderung. Weitere Synchronisierungen folgen dann im angegebenen Intervall.

Im nächsten Block kann eine Verbindung zu einem MQTT-Server aktiviert und konfiguriert werden. Ein solcher Server läuft auf dem Web-Modul und über die MQTT-Verbindung kann die Matrixuhr Sensordaten und Alarme vom Temperatur-Messsystem sowie weitere Informationen empfangen. Die nachfolgenden Parameter IP-Adresse und IP-Port können im Web-Modul-Betrieb auf der Voreinstellung bleiben. Beim Raspberry-Pi-Betrieb muss das Feld IP-Adresse mit der IPv4-Adresse des Web-Moduls ausgefüllt werden, z.B. 192.168.1.222. Der IP-Port entspricht dem MQTT-Standard und sollte nicht geändert werden.

Der nächste Parameter Gültigkeitsdauer hat folgende Bedeutung: Die Matrixuhr soll nur aktuelle Werte anzeigen. Fällt z.B. ein Sensor aus, dann wird nach Ablauf der Gültigkeitsdauer dessen letzter Wert verworfen und nicht mehr angezeigt. Verwendet man nur Sensorwerte vom Temperatur-Messsystem, dann kann man den voreingestellten Wert von 2 Minuten übernehmen. Soll die Matrixuhr Daten von Geräten empfangen, die ihre Werte in größeren Zeitabständen übermitteln, dann muss die Gültigkeitsdauer entsprechend erhöht werden. Übrigens, die Gültigkeitsdauer gilt nur für Sensorwerte. Bei Wetterdaten und Kraftstoffpreisen ist die Gültigkeit fest auf 60 Minuten eingestellt.

In die folgenden beiden Felder kann ein Username und ein Passwort eingetragen werden, sofern der verwendete MQTT-Server mit Zugangsdaten geschützt ist. Wenn das Web-Modul als MQTT-Server verwendet wird, dann müssen diese beiden Felder leer bleiben. Es folgen 4 weitere Felder, die es ermöglichen, Statusinformationen der Matrixuhr zum MQTT-Server zu senden. Man kann die Felder leer lassen, wenn man diese Funktionen nicht benötigt. Andererseits lassen sich mit diesen Daten z.B. mit Node-RED schöne Statistiken erstellen. Die 4 Felder haben folgende Funktionen:

LWT Topic: LWT steht für „Last will and testament“ und ist eine spezielle MQTT-Funktion. Unter dem hier eingetragenen Topic wird eine Nachricht auf dem MQTT-Server hinterlegt, die im Falle einer Verbindungsunterbrechung zwischen Matrixuhr und MQTT-Server an die Abonnenten verschickt wird. Bei der Matrixuhr lautet diese Nachricht offline. Während des Verbindungsaufbaus zum MQTT-Server wird außerdem unter dem gleichen Topic die Nachricht online verschickt. Damit werden alle Abonnenten über den Online-Status der Matrixuhr informiert: Verbindet sich die Uhr mit dem Server, wird online weitergegeben. Kommt es zur Trennung, greift der LWT-Mechanismus und gibt den Status offline weiter.
Uptime Topic: Über dieses Topic sendet die Matrixuhr einmal pro Minute die aktuelle Systemlaufzeit des Raspberry Pi in Tagen mit 2 Nachkommastellen.
RSSI Topic: Über dieses Topic sendet die Matrixuhr einmal pro Minute (zeitgleich mit der Systemlaufzeit) die Stärke des WLAN-Empfangssignals in dBm.
Load Topic: Über dieses Topic sendet die Matrixuhr einmal pro Minute (zeitgleich mit Systemlaufzeit und RSSI) die aktuelle Systemauslastung des Raspberry Pi.

Die nächsten 3 Felder sind wichtig, wenn zusätzliche Informationen wie Wetterdaten, Kraftstoffpreise oder Laufschrift-Nachrichten über MQTT empfangen werden sollen. Wenn das Web-Modul als MQTT-Server und Datenlieferant verwendet wird, dann müssen dort in Node-RED die notwendigen Dienste (OpenWeatherMap und Tankerkönig) eingerichtet sein. Die Einrichtung für die Übermittlung von Wetter- und Kraftstoffdaten ist hier beschrieben: Web-Modul - Konfiguration von Node-RED (Beispiel-Flows 6 und 7).

Falls die MQTT-Funktion nicht genutzt wird, dann bietet die Matrixuhr die Möglichkeit, Wetterdaten direkt abzufragen. Über die Eingabefelder im nächsten Block hat man die Möglichkeit, den internen Wetterdatenempfang zu konfigurieren. Dafür ist zunächst eine Anmeldung bei OpenWeatherMap erforderlich. Der Link neben dem Eingabefeld APPID führt direkt zur entsprechenden Seite. Hier wählt man die Free-Option und nach einer notwendigen Anmeldung erhält man einen API-Key (auch als APPID bezeichnet), der aus 32 Hexadezimal-Zeichen besteht. Dieser kommt dann in das Eingabefeld APPID. Ganz wichtig ist natürlich auch der Ort - hier sollte man zunächst auf der Homepage von OpenWeatherMap prüfen, ob der gewünschte Ort verfügbar ist. Im positiven Fall trägt man diesen dann in das Eingabefeld Ort ein. Wird der Ort nicht gefunden, dann lässt man das Eingabefeld für den Ort leer und füllt stattdessen die beiden Eingabefelder für Breitengrad und Längengrad mit den GPS-Koordinaten in Dezimalschreibweise aus. Dabei bitte den Punkt als Komma verwenden. Mit dem letzten Auswahlfeld Sprache kann man die Sprache für die Wetterlage festlegen (Details folgen später). Die Kommunikation mit OpenWeatherMap erfolgt übrigens einmal pro Minute verschlüsselt über https.

Hinweis: Wird ein MQTT-Topic für den Empfang von Wetterinformationen eingegeben, dann deaktiviert sich automatisch der interne Wetterdatenempfang der Matrixuhr. Die Daten in den Eingabefeldern bleiben erhalten, haben aber keine Funktion mehr. Die einzige Ausnahme ist das Auswahlfeld Sprache: Diese Einstellung wirkt auch auf die über MQTT empfangenen Wetterdaten. Übrigens, die über MQTT gelieferten Wetterdaten sind identisch mit denen der internen Wetterdaten-Abfrage. Grundsätzlich empfehle ich die Nutzung von MQTT für die Wetterdaten. So ist nur eine Abfrage beim Wetterdienst notwendig und die Informationen stehen allen Geräten im Haus über MQTT zur Verfügung. Ein weiterer Vorteil ist, dass alle Empfänger identische Daten anzeigen.

Sind alle Einstellungen komplett, dann werden diese durch einen Klick auf den Button System-Einstellungen speichern gespeichert und es erscheint der Hinweis  gespeichert  zur Bestätigung. Übrigens, ganz oben in diesem Bereich und einigen weiteren Bereichen befindet sich ein [Hilfe]-Link. Dieser führt direkt auf diese Homepage zur entsprechenden Beschreibung.

Wichtig: Die MQTT-Verbindung sollte nur dann aktiviert werden, wenn der Server auch wirklich vorhanden ist. Anderenfalls wird alle 10 Sekunden versucht, eine Verbindung herzustellen und das führt zu einer höheren Systemauslastung und zu vielen Fehlermeldungen im Linux-Log. Weiterhin muss sich der MQTT-Server im heimischen Netzwerk befinden, denn die Verbindung wird nicht verschlüsselt.

Bereich Status

Matrixuhr Status

Dieser Bereich zeigt einige wenige Systeminformationen an:

Systemlaufzeit: Hier wird die Laufzeit des Linux-Systems angezeigt. Diese wird zunächst in Minuten angegeben. Nach einer Laufzeit von 60 Minuten wechselt der Wert in Stunden mit einer Nachkommastelle und nach 24 Stunden wird die Zeit in Tagen mit 2 Nachkommastellen angegeben.
Systemauslastung: Dieser Wert sollte weit unter 1 liegen, kann aber beim Systemstart kurzzeitig überschritten werden.
WLAN-SSID: Hier wird der Name des WLAN angezeigt, mit dem die Matrixuhr verbunden ist.
WLAN-Signal: Der Wert zeigt das Empfangssignal (RSSI) des Raspberry Pi an und sollte zwischen -80 dB und -30 dB liegen.

Bereich Nachricht

Matrixuhr Nachricht

Mit dieser Funktion kann man eine Nachricht zur Matrixuhr senden, die dann als Laufschrift angezeigt wird. Dazu wird einfach ein Text in das Feld eingegeben und mit einem Klick auf den Button Nachricht senden wird die Eingabe gespeichert. Die Seite wird dabei neu aufgebaut und neben dem Button erscheint der Hinweis  gesendet . Es kann einige Sekunden dauern, bis die Nachricht zur Matrixuhr übermittelt wird. Das liegt daran, dass das zuständige Programm matrixuhr.pl die verschiedenen Daten in einem sich zyklisch wiederholenden Zeitraster sendet. An der Matrixuhr wird beim Empfang der Nachricht der Klang 6 abgespielt und die Nachricht ununterbrochen als Laufschrift angezeigt. Die zuletzt eingegebene Nachricht bleibt auf dem Web-Server gespeichert und wird wieder in das Eingabefeld eingetragen. Die Länge der Nachricht ist auf 100 Bytes begrenzt und man muss bedenken, dass Umlaute bei der Übertragung in UTF-8 konvertiert werden und somit mehrere Bytes benötigen. Die mögliche Zeichenanzahl ist also kleiner als 100. Neben den normalen ASCII-Zeichen (Kode 32 - 126) sind folgende Zeichen erlaubt: ÄÖÜäöüéß°€.

Bereich Geburtstage

Matrixuhr Geburtstage

In diesem Bereich kann eine Geburtstagsliste verwaltet werden. Die Geburtstagsliste wird zyklisch geprüft und werden Einträge gefunden, die zum aktuellen Datum passen, dann erscheint der Name und das errechnete Alter auf der Matrixuhr.

Die Eingabefelder sind eigentlich selbsterklärend. Beim Feld Name muss man beachten, dass er sich auf der Matrixuhr die Zeile mit dem Alter teilen muss. Ein guter Richtwert für die Länge des Namens sind 9 Zeichen, dann bleibt noch Platz für ein Leerzeichen und ein zweistelliges Alter. Hier sollte man einfach ein wenig experimentieren. Über das Auswahlfeld Sortierung kann die Liste wahlweise nach dem Datum oder dem Namen sortiert werden. Bei der Sortierung nach dem Datum wird das Jahr nicht berücksichtigt. Nur wenn mehrere Einträge am gleichen Tag vorhanden sind, entscheidet das Jahr über deren Reihenfolge. Die Anzahl der Einträge ist übrigens nicht begrenzt. Nach dem Speichern der Geburtstage über den Button Geburtstage speichern wird die Liste neu ausgegeben und immer eine leere Eingabezeile für einen neuen Eintrag ergänzt. Außerdem erscheint der Hinweis  gespeichert  neben dem Button. Zum Löschen eines Eintrages muss das Eingabefeld Name geleert werden und nach dem Speichern verschwindet der Eintrag aus der Liste. Wichtig: Namen dürfen nicht mehrfach verwendet werden. Neue Einträge, die einen bereits vorhandenen Namen verwenden, werden nicht gespeichert.

Bereich Sensorliste

Matrixuhr Sensorliste

Die Matrixuhr kann verschiedene Sensorwerte anzeigen und überwachen. Die Verarbeitung der Daten erfolgt dabei in 2 Schritten: Zunächst ist es erforderlich, alle benötigten Sensoren in der Sensorliste zu erfassen. Damit wird der Datenempfang aktiviert und jedem Sensor ein eindeutiger Name A bis Z zugeordnet. Unter diesem Namen kann dann im zweiten Schritt in den weiter unten folgenden Bereichen Sensoren und Alarme die Ausgabe und Überwachung konfiguriert werden.

Ein großer Teil der Sensorliste ist bereits fest mit den Namen M bis Z sowie a bis d belegt. Hier sind verschiedene Wetterdaten, der Wert des 1-Wire-Sensors und bis zu 4 Kraftstoffpreise verfügbar. Weitere Sensordaten können über MQTT empfangen werden und dafür ist ein Eintrag im oberen Teil der Liste erforderlich. Alle hier erfassten Sensoren werden dann beim MQTT-Server abonniert und bekommen außerdem einen Namen A bis L zugewiesen (maximal 12 Einträge sind möglich). Für jeden Sensor sind zwei Eingaben erforderlich: In das Feld MQTT Topic wird das vollständige Topic des Sensors eingetragen. Über das Feld Dezimal kann die Anzahl der Nachkommastellen (0, 1 oder 2) ausgewählt werden. Empfangene Sensordaten werden auf Plausibilität geprüft und in die gewählte Einstellung konvertiert. Zusätzlich steht noch die Auswahlmöglichkeit aus zur Verfügung. Diese schaltet die Plausibilitätsprüfung und Konvertierung komplett aus und ermöglicht die Anzeige beliebiger Informationen, die z.B. dynamisch von Node-RED generiert werden können.

Eine weitere Einstellung soll noch erwähnt werden: Der 1-Wire-Sensor Z kann mit einem Korrekturwert zwischen -5,0° und 5,0° versehen werden. Wichtig ist hier, dass das Komma als Punkt geschrieben wird.

Über den Button Sensorliste speichern werden alle Eingaben in diesem Bereich gespeichert und neben dem Button der Hinweis  gespeichert  angezeigt. Weiterhin erscheint eine neue Leerzeile zur Eingabe eines weiteren Sensors, sofern das Maximum von 12 noch nicht erreicht wurde. Zum Löschen eines Eintrages muss das Feld MQTT Topic geleert werden und nach dem Speichern verschwindet der Eintrag aus der Liste. Zu beachten ist, dass beim Löschen nachfolgende Einträge nachrücken und Verschiebungen bei den Buchstaben im Feld Name auftreten.

Bereich Sensoren

Matrixuhr Sensoren

In diesem Bereich lassen sich die Sensordaten zusammenstellen, die auf der Matrixuhr angezeigt werden sollen. Alle hier eingegebenen Zeilen werden aufbereitet und nacheinander im eingestellten Wechsel-Rhythmus auf der unteren Zeile der Matrixuhr angezeigt. Voraussetzung für diese Funktion ist die vorherige Erfassung der benötigten Sensoren im Bereich Sensorliste.

Für die Anzeige von Sensordaten und anderen Informationen steht eine unbegrenzte Anzahl von Datenfeldern zur Verfügung. In ein Datenfeld passen ungefähr 12 Zeichen und diese können aus Sensorwerten, festen Zeichen oder auch Symbolen bestehen. Für die Anzeige von Sensorwerten dienen hier Platzhalter, die aus einem eckigen Klammerpaar und einem eingeschlossenen Buchstaben zusammengesetzt sind. Die Matrixuhr ersetzt dann zum Zeitpunkt der Anzeige den Platzhalter durch den entsprechenden Sensorwert. Im Bereich Sensorliste befindet sich eine Übersicht mit allen zur Verfügung stehenden Platzhaltern und deren Bedeutung.

Beim Ausfüllen der Datenfelder muss beachtet werden, dass immer nur eine Zeile eingegeben werden kann. Über den Button Sensoren speichern muss dann die Liste gespeichert werden und neben dem Button wird der Hinweis  gespeichert  angezeigt. Erst jetzt erscheint eine neue Eingabezeile und das nächste Datenfeld kann eingegeben werden.

Auf dem Bild oben sind bereits 6 Datenfelder gefüllt, die ich genau so in meiner Matrixuhr verwende. Die nachfolgende Tabelle beschreibt diese und einige weitere Beispiele etwas ausführlicher:

ZeileAnzeigebeispielBemerkung
[W] [A]°CAnzeigebeispiel 1 Dieses Datenfeld besteht aus einem Wettersymbol, dem Wert des Sensors A (Temperatur vom Außensensor) und dem abschließenden Text °C. Das Wettersymbol wird dynamisch aus den Daten des Wetterdienstes generiert und ist immer 24 Pixel breit (ca. 4 Zeichen). Es gibt Symbole für den Tag und die Nacht, die zum Sonnenaufgang bzw. Sonnenuntergang wechseln.
$Z [S] mmAnzeigebeispiel 2 Bei diesem Datenfeld wird ein festes Regensymbol, die vom Wetterdienst übermittelte Regenmenge mit einer Nachkommastelle in mm/h und ein abschließender Text mm angezeigt. Das Regensymbol ist 16 Pixel breit (ca. 3 Zeichen).
$Y [V] [R]Anzeigebeispiel 3 Hier wird ein festes Windsymbol, ein dynamischer Windrichtungspfeil, der von den Daten des Wetterdienstes generiert wird und die ebenfalls vom Wetterdienst übermittelte Windgeschwindigkeit in km/h ohne Nachkommastelle angezeigt. Für eine Einheit wie z.B. km/h ist leider nicht genug Platz. Das Windsymbol hat übrigens eine feste Breite von 16 Pixel (ca. 3 Zeichen), der Windpfeil ist 7 Pixel breit.
[B]°C [C]%Anzeigebeispiel 4 Dieses Datenfeld besteht zunächst aus dem Sensorwert B (Temperatur im Wohnzimmer) und dem nachfolgenden Text °C. Hier schließt sich nach einem Leerzeichen der Sensorwert C (Luftfeuchtigkeit im Wohnzimmer) und ein Prozentzeichen % an.
$W [a]€Anzeigebeispiel 5 Bei diesem Datenfeld wird ein festes Tankstellensymbol, ein von Tankerkönig übermittelter Kraftstoffpreis und ein Euro-Zeichen verwendet. Wenn man auf das Euro-Zeichen verzichtet, passen auch 2 Preise nebeneinander. Das Tankstellensymbol hat übrigens eine feste Breite von 10 Pixel.
$U [D] kWAnzeigebeispiel 6 Dieses Datenfeld verwendet das feste Solarsymbol, den Sensorwert D (aktuelle Solar-Leistung in kW mit 2 Nachkommastellen) und den festen Text kW. Das Solarsymbol hat eine Breite von 13 Pixel.
[X]Anzeigebeispiel 7
Anzeigebeispiel 8
Die Wetterlage ist ein spezielles Element und muss einzeln im Datenfeld stehen. Bei der Anzeige kann diese aus bis zu 4 Textteilen bestehen, die nacheinander ausgegeben werden. Die Anzeige der nachfolgenden Datenfelder erfolgt dann nach dem letzten Textteil.
[Y]Anzeigebeispiel 9 Auch die Sonnenzeiten werden durch ein spezielles Element definiert, welches einzeln im Datenfeld stehen muss. Auf der Anzeige erscheinen dann in einem festen Format die Zeiten von Sonnenaufgang und Sonnenuntergang, getrennt durch ein Sonnensymbol.

Hier noch einige Hinweise und Tipps für die Benutzung der Datenfelder:

Bereich Alarme

Matrixuhr Alarme

In diesem Bereich kann man festlegen, wie die Matrixuhr auf Alarm-Ereignisse reagieren soll. Neben den 4 Alarmen des Temperatur-Messsystems kann die Uhr noch 4 weitere Alarme verwalten, die zur Überwachung von Sensorwerten oder als Timer verwendet werden können. Jedem der 8 Alarme kann über das Auswahlfeld Sound ein Klang zugeordnet werden, der dann bei Auslösung des Alarms auf der Matrixuhr abgespielt wird. Zur Auswahl stehen die Nummern 1 bis 6, die den 6 verfügbaren Klängen der Matrixuhr entsprechen. Weiterhin gibt es noch die Auswahl 0, bei der im Alarmfall kein Ton erzeugt wird (stumme Signalisierung). Bei der Sound-Auswahl ist zu beachten, dass der Klang 5 bereits für die Textnachricht verwendet wird und der Klang 6 für den Stundengong.

Das nächste Auswahlfeld Halten legt fest, was auf der Matrixuhr passieren soll, wenn der Alarm wieder verschwindet. Setzt man diese Einstellung auf aus, dann wird die Alarmanzeige automatisch nach 2 Minuten gelöscht. Bei der Auswahl ein bleibt der Alarm im Display stehen und muss manuell an der Uhr quittiert werden. Im nächsten Eingabefeld Text kann der Text eingegeben werden, der bei Auslösung des Alarms auf dem Display der Matrixuhr erscheinen soll. Hier gilt wieder der Richtwert von 12 Zeichen für die Textlänge oder einfach ausprobieren, ob der vorgesehene Text auf eine Displayzeile passt.

Das letzte Eingabefeld unterscheidet sich bei den beiden Alarmgruppen. Bei den Alarmen 1-4 können die 4 Alarme eines Sensormoduls ausgewertet werden. Dazu muss das Sensormodul am Web-Modul angeschlossen und konfiguriert sein. Zur Aktivierung eines Alarms vom Sensormodul übernimmt man einfach das MQTT-Topic, welches im Web-Modul für diesen Alarm eingetragen wurde. Es müssen nicht alle Alarme des Sensormoduls verwendet werden, auch die Reihenfolge kann beliebig sein. Die Konfiguration des Alarms 1 im oben stehenden Bild führt beispielsweise zu folgendem Ablauf: Bei Öffnung des Garagentors wird auf der Matrixuhr der Klang 1 abgespielt und der Text Garagentor angezeigt. Beim Schließen des Tors wechselt die Anzeige auf Garagentor und 2 Minuten später wird der Alarm automatisch auf der Matrixuhr gelöscht. Der Ablauf bei Alarm 2 ist ähnlich, nur das Verhalten bei inaktivem Alarm ist anders. Hier bleibt der Text Briefkasten nach dem Schließen der Briefkasten-Klappe dauerhaft in der Anzeige und muss mit der Sensorfläche Quittieren gelöscht werden.

Bei den Alarmen 5-8 hat das letzte Eingabefeld eine andere Funktion. Hier kann die Bedingung festgelegt werden, die zum Auslösen des entsprechenden Alarms führen soll. Man kann damit z.B. einen Sensorwert überwachen und bei dessen Über- oder Unterschreitung einen Alarm an der Matrixuhr auslösen. Es können alle verfügbaren Werte aus der Sensorliste mit Ausnahme von V, W, X und Y verwendet werden. Die folgende Tabelle beschreibt das Beispiel von Alarm 5 aus dem Bild und weitere 4 Beispiele:

BedingungBeschreibung
[B]<18Ein Alarm wird ausgelöst, wenn der Wert von Sensor B (Temperatur Wohnzimmer) einen Wert von 18°C unterschreitet.
[A]>30Ein Alarm wird ausgelöst, wenn der Wert von Sensor A (Außentemperatur) einen Wert von 30°C überschreitet.
[A]<[B]Ein Alarm wird ausgelöst, wenn die Außentemperatur kleiner ist als die Temperatur im Wohnzimmer.
[R]>70Ein Alarm wird ausgelöst, wenn der Wert von Sensor R (Windgeschwindigkeit) 70 km/h überschreitet (Sturmwarnung).
[a]<1.70Ein Alarm wird ausgelöst, wenn der Wert von Sensor a (Preis von Tankstelle 1) unter 1,70€ liegt.

Man hat also die Möglichkeit, einen Sensorwert mit einem Festwert zu vergleichen oder 2 Sensorwerte miteinander. Auch hier wird immer geprüft, ob aktuelle Sensorwerte vorliegen. Ist ein Sensorwert nicht mehr gültig, dann wird die Bedingung auch nicht geprüft und kein Alarm ausgelöst.

Die Alarme 5-8 können auch als Timer verwendet werden. So ist es möglich, einen Alarm zu einer bestimmten Zeit auszulösen - entweder täglich, wöchentlich oder an Geburtstagen. Im Bild weiter oben habe ich den Alarm 6 als Geburtstagsalarm konfiguriert. Dabei passiert folgendes: Wenn ein Geburtstag ansteht, dann wird um 8:00 Uhr der Klang 3 abgespielt und der Alarmtext Geburtstag angezeigt. Nach 2 Minuten wird die Alarmanzeige auf der Matrixuhr automatisch wieder gelöscht. Die folgende Tabelle beschreibt die Möglichkeiten für Timer-Alarme:

BedingungBeschreibung
*:12:00Es wird jeden Tag ein Alarm um 12:00 Uhr ausgelöst.
3:20:30Es wird jeden Mittwoch ein Alarm um 20:30 Uhr ausgelöst. Die Ziffer an der ersten Stelle bestimmt den Wochentag: 1 = Montag, 7 = Sonntag.
+:08:00Es wird an jedem Geburtstag ein Alarm um 8:00 Uhr ausgelöst.

Technisch bedingt können die Timer-Alarme um einige Sekunden verzögert ausgelöst werden. Und auch hier noch der Hinweis: Über den Button Alarme speichern werden alle Eingaben gespeichert und neben dem Button der Hinweis  gespeichert  angezeigt.

Wichtig: Bei jedem Speichervorgang wird das Programm matrixuhr.pl neu gestartet, um die geänderte Konfiguration einzulesen. Dabei werden zunächst alle bisher übermittelten Daten auf der Matrixuhr gelöscht. Da alle Sensorwerte über MQTT oder über den Wetterdienst erst wieder empfangen und aufbereitet werden müssen, kann es einige Zeit dauern, bis das Ergebnis der Konfigurationsänderung sichtbar wird.

Symbol Weitere Informationen

Dieser Abschnitt liefert weitere Informationen über die Anzeige von Daten und Alarmen auf der Matrixuhr in den verschiedenen Betriebsarten. Weiterhin wird auf spezielle Einstellungen eingegangen und die Kommunikation zwischen dem Mikrocontroller der Matrixuhr und den angeschlossenen Komponenten (Sensormodul, Web-Modul oder Raspberry Pi) beschrieben.

Symbol Sensormodul-Betrieb

Bei dieser Betriebsart ist eine RS-232-Verbindung zum Sensormodul erforderlich. Die Matrixuhr empfängt alle Daten des angeschlossenen Sensormoduls und ist in der Lage, alle wichtigen Informationen auszuwerten und anzuzeigen. Für diese Betriebsart sind die in der folgenden Tabelle aufgeführten Einstellungen wichtig:

EinstellungInformationen
Sensorfilter aus Es werden alle empfangenen Sensordaten angezeigt. Das Anzeigeformat ist fest vorgegeben und die nachfolgenden Einstellungen (Sensornummer 1-8 und Sensorname 1-8) sind nicht relevant.
Sensorfilter einEs werden nur die in der folgenden Einstellung (Sensornummer 1-8) ausgewählten Sensoren in der eingegebenen Reihenfolge angezeigt. Die Namen können in den Einstellungen Sensorname 1-8 festgelegt werden.
Sensornum. 1 - Sensornum. 8 Diese Einstellung ist nur bei Sensorfilter ein relevant. Hier können 8 Sensornummern eingegeben werden, die dann in der entsprechenden Reihenfolge angezeigt werden.
Sensornam. 1 - Sensornam. 8 Auch diese Einstellung ist nur bei Sensorfilter ein relevant. Hier können für die 8 ausgewählten Sensoren Namen von bis zu 5 Zeichen Länge eingegeben werden.
Alarme ausEs werden keine Alarme des Temperatur-Messsystems signalisiert.
Alarme einBeim Setzen der Einstellung auf ein wird der aktuelle Status der 4 Alarme als Ruhezustand angenommen und gespeichert. Danach werden alle Abweichungen vom Ruhezustand signalisiert, wobei die Klänge 1-4 fest zugeordnet sind.
Alarm 1 - Alarm 4 Diese Einstellung ist nur bei Alarme ein relevant. Hier können die 4 Alarme mit einem bis zu 12 Zeichen langen Namen versehen werden.

Besonderheiten

Die empfangenen Sensorwerte werden in den Wechsel-Rhythmus der Anzeige direkt nach dem Datum und dem Wochentag eingefügt. Bei der Einstellung Sensorfilter aus erscheinen die Sensorwerte in der vom Sensormodul vorgegebenen Reihenfolge. Bei der Einstellung Sensorfilter ein kann man die Reihenfolge bei der Eingabe von Sensornum. 1 - Sensornum. 8 festlegen. Unabhängig von der Sensorfilter-Einstellung wird automatisch die entsprechende Einheit (°C, hPa, %) angehängt. Ein Anzeigezyklus sieht dann ungefähr so aus:

DatumWochentagSensor 1Sensor 2Sensor nDatum ⋅⋅⋅

Bei Alarmmeldungen schaltet die Anzeige in den 3-zeiligen Alarmmodus um und in der unteren Zeile erscheinen dann die Alarme, welche ebenfalls im eingestellten Rhythmus wechseln (falls mehrere Alarme aktiv sind). Nicht mehr aktive Alarme erscheinen weiterhin in der Anzeige, werden aber unterstrichen dargestellt. Diese können mit der Sensorfläche Quittieren gelöscht werden.

Bei jedem Empfang eines Sensorwertes oder Alarms wird ein Timeout-Zähler von 2 Minuten gestartet. Fällt ein Sensor aus, dann wird dieser nach 2 Minuten aus dem Anzeigezyklus herausgenommen. Beim Ausfall der Datenverbindung betrifft das alle Sensoren und auch die Alarme, die dann ebenfalls nach 2 Minuten nicht mehr angezeigt werden. Eine Signalisierung erfolgt nicht, aber man erkennt eine Verbindungsunterbrechung daran, dass die Uhr nur noch Datum und Wochentag anzeigt.

Es ist übrigens möglich, das Sensormodul in das Gehäuse der Matrixuhr einzubauen und beide Einheiten direkt zu verbinden. Das ist sinnvoll, wenn man kein Temperatur-Messsystem installiert hat, aber trotzdem einige Sensordaten auf der Uhr anzeigen möchte. In diesem Fall kann man das Sensormodul ohne Display betreiben sowie die RS-232-Treiber weglassen und das Sensormodul direkt mit der Matrixuhr verbinden:

Sensormodul TX (IC2 Pin 3) → Matrixuhr RX (IC1 Pin 16)

Datenpakete

Die Matrixuhr wertet folgende vom Sensormodul über RS-232 empfangene Datenpakete aus:

• Sensorwert

n:vvvvv7 Zeichen + <CR>

nSensorkennung im Bereich 1-8, a-s und w-z
:Trennzeichen
vvvvvSensorwert (5 Zeichen)

Mit diesem Datentyp wird ein Sensorwert übermittelt. Die Sensorkennungen 1-8 entsprechen den Sensoren 1-8, die Kennungen im Bereich a-s entsprechen den Sensoren 9-27 und die Kennungen w-z entsprechen den Sensoren 28-31. Das Trennzeichen ist immer ein Doppelpunkt und der Wert besteht immer aus 5 Zeichen. Benötigt der Wert weniger als 5 Zeichen, dann wird dieser immer rechtsbündig ausgegeben und der Bereich zwischen Doppelpunkt und Wert wird durch Leerzeichen aufgefüllt. Hier sind einige Beispiele:

3: 22.6   Der Sensor 3 übermittelt eine Temperatur von 22.6°C.
b:-13.4   Der Sensor 10 übermittelt eine Temperatur von -13.4°C.
w: 1014   Der vom Sensor 28 gemessene Luftdruck beträgt 1014hPa.
y:   49   Der Sensor 30 übermittelt eine Luftfeuchtigkeit von 49%RH.

• Alarmwert

n:a3 Zeichen + <CR>

n Alarmkennung im Bereich A-D
: Trennzeichen
a Alarmwert (0 oder 1)

Mit diesem Datentyp wird eine Alarmmeldung übermittelt. Die Alarmkennung n ist ein Buchstabe im Bereich A-D, wobei A für den Alarm 1 verwendet wird, B für den Alarm 2 usw. Das Trennzeichen ist immer ein Doppelpunkt und der Alarmwert ist entweder 0 oder 1, wobei 0 hier Alarmkontakt geöffnet und 1 Alarmkontakt geschlossen bedeutet. Auch hier 2 Beispiele:

B:1   Der Alarmkontakt 2 wurde geschlossen.
C:0   Der Alarmkontakt 3 wurde geöffnet.

Die Matrixuhr vergleicht die empfangenen Alarmmeldungen mit dem gespeicherten Ruhezustand und generiert immer dann eine Alarmmeldung auf dem Display, wenn eine Abweichung vom Ruhezustand auftritt. Kehrt ein Alarm in den Ruhezustand zurück, dann verbleibt die Alarmmeldung auf dem Display, wird aber unterstrichen dargestellt. Diese Alarmmeldungen können dann mit dem Taster bzw. mit der Sensorfläche Quittieren gelöscht werden.

Das Sensormodul übermittelt beim Systemstart noch ein weiteres Paket: die Sensorbelegung. Diese wird von der Uhr aber nicht ausgewertet.

Symbol Web-Modul-Betrieb und Raspberry-Pi-Betrieb

Beide Betriebsarten verwenden die gleiche Kommunikation zwischen einem Raspberry Pi und dem Mikrocontroller der Matrixuhr. Nur bei der Schnittstelle gibt es einen Unterschied: Während beim Web-Modul-Betrieb die Informationen über Pegelwandler und eine RS-232-Verbindung vom Raspberry Pi des Web-Moduls zum Mikrocontroller übertragen werden, gelangen die Daten beim Raspberry-Pi-Betrieb auf dem direkten Weg ohne Pegelwandlung zum Mikrocontroller. Für beide Betriebsarten sind folgende Einstellungen wichtig:

EinstellungInformationen
Sensorfilter aus Diese Einstellung bewirkt, dass alle vom Web-Modul bzw. vom internen Raspberry Pi empfangenen Sensordaten in der Reihenfolge angezeigt werden, wie sie auf dem Web-Formular konfiguriert wurden. Die Einstellung ein führt hier zu Fehlfunktionen bei der Anzeige der Sensorwerte.
Roll-Geschw. 0-20Diese Einstellung hat Einfluss auf die empfangene Textnachricht und bestimmt die Geschwindigkeit der Laufschrift.

Besonderheiten

Die empfangenen Datenfelder werden in den Wechsel-Rhythmus der Anzeige direkt nach dem Datum und dem Wochentag eingefügt. Weiterhin lassen sich auch Geburtstage im Web-Formular verwalten und diese werden technisch ebenfalls wie Datenfelder behandelt. Die Ausgabe der Geburtstage erfolgt dabei direkt nach den Datenfeldern, so dass ein Anzeigezyklus ungefähr so aussieht:

DatumWochentagDatenfeld 1Datenfeld nGeburtstag 1Geburtstag nDatum ⋅⋅⋅

Auch beim Web-Modul- oder Raspberry-Pi-Betrieb schaltet die Anzeige bei Alarmmeldungen in den 3-zeiligen Alarmmodus um und in der unteren Zeile erscheinen dann die Alarme, welche ebenfalls im eingestellten Rhythmus wechseln (falls mehrere Alarme aktiv sind). Nicht mehr aktive Alarme erscheinen weiterhin in der Anzeige, werden aber unterstrichen dargestellt. Zusätzlich zu den 4 Alarmen des Temperatur-Messsystems können weitere 4 Alarme zur Überwachung von Sensorwerten definiert werden und auch diese reihen sich dann in den Wechsel-Rhythmus ein. Nicht mehr aktive (unterstrichene) Alarme können mit dem Taster bzw. der Sensorfläche Quittieren gelöscht werden. Es besteht zusätzlich die Möglichkeit, jeden Alarm so zu konfigurieren, dass eine automatische Quittierung erfolgt. In diesem Fall bleibt der Alarm noch 2 Minuten unterstrichen sichtbar und verschwindet dann automatisch von der Anzeige.

Eine besondere Funktion ist die Übermittlung einer Textnachricht vom Web-Formular. Hier wird ebenfalls die Anzeige in den 3-zeiligen Modus gesetzt und die dritte Zeile zeigt dann die Nachricht als Laufschrift an. Eventuell anstehende Alarme werden dabei in den Hintergrund gestellt und erst dann angezeigt, wenn die Textnachricht mit dem Taster bzw. der Sensorfläche Quittieren gelöscht wurde.

Bei jedem Empfang eines Datenpaketes (Datenfeld, Geburtstag oder Alarm) wird ein Timeout-Zähler von 2 Minuten gestartet. Beim Ausfall der Datenverbindung werden somit nach 2 Minuten keine Datenfelder, Geburtstage und Alarme mehr angezeigt. Eine empfangene Textnachricht bleibt allerdings erhalten und läuft weiterhin in der dritten Zeile. Eine Signalisierung erfolgt bei einer Verbindungsunterbrechung nicht, aber man erkennt diesen Zustand daran, dass nur noch Datum und Wochentag angezeigt werden. Nach 24 Stunden wird allerdings der Warnhinweis Synchronisierungsausfall aktiv (Doppelpunkt blinkt in Datum-Farbe). Das passiert aber nur, wenn die Zeitsynchronisierung über das Web-Modul bzw. den internen Raspberry Pi erfolgt und kein DCF77-Empfänger verwendet wird.

Das Web-Modul bzw. der interne Raspberry Pi arbeitet mit UTF-8 und sendet alle Daten ebenfalls in diesem Format. Umlaute und Sonderzeichen werden dabei durch mehrere Bytes kodiert übertragen. Die Software der Matrixuhr enthält eine einfache Funktion zur UTF-8-Dekodierung, diese ist aber auf die folgenden Zeichen beschränkt: ÄÖÜäöüéß°€.

Datenpakete

Die Matrixuhr wertet folgende vom Web-Modul über RS-232 oder vom internen Raspberry Pi direkt empfangene Datenpakete aus:

• Datenfeld

nn:vAbschluss durch <LF> oder <CR>

nn Feldkennung im Bereich 01-31
:Trennzeichen
vFeldinformation (maximal 12 Zeichen)

Mit diesem Datentyp wird ein Datenfeld oder ein Geburtstag übermittelt. Die Feldkennung nn liegt im Bereich 01-31 und hat keine Beziehung zu einer realen Sensornummer. Mit der Feldkennung wird der Platz im Sensorfeld der Matrixuhr festgelegt, wo der Datensatz gespeichert werden soll. Da die Sensorfeld-Plätze der Reihe nach angezeigt werden, ist mit der Feldkennung auch gleichzeitig die Reihenfolge festgelegt. Das Trennzeichen ist immer ein Doppelpunkt und die Feldinformation kann aus bis zu 12 Zeichen bestehen. Hier sind einige Beispiele:

01:Außen 27.3°C   Der Text Außen 27.3°C soll auf dem ersten Platz im Sensorfeld gespeichert werden.
02:25.0°C 44%     Der Text 25.0°C 44% soll auf dem zweiten Platz im Sensorfeld gespeichert werden.
03:Fritz 43       Der Text Fritz 43 soll auf dem dritten Platz im Sensorfeld gespeichert werden.

Damit ergibt sich folgende Anzeige auf der Matrixuhr:

DatumWochentagAußen 27.3°C25.0°C 44%Fritz 43Datum ⋅⋅⋅

Die Matrixuhr kann Symbole für die aktuelle Wetterlage, die Windrichtung und noch einige andere anzeigen. Die meisten Symbole werden automatisch entsprechend der empfangenen Wetterinformationen ausgewählt, andere können in den Datenfeldern für eigene Anzeigen verwendet werden. Ein großer Teil der Symbole verwendet feste Farben, die nicht geändert werden können. Grundsätzlich können alle verfügbaren Symbole auch für andere Zwecke verwendet werden. Die folgende Tabelle zeigt alle Symbole und deren Kodierung, die in den Datenfeldern verwendet werden muss:

SymbolKodierungBedeutungBesonderheit
Symbol$AKlarer Himmel (Tag-Symbol)24 Pixel breit, feste Farben
Symbol$BKlarer Himmel (Nacht-Symbol)24 Pixel breit, feste Farben
Symbol$CEin paar Wolken (Tag-Symbol)24 Pixel breit, feste Farben
Symbol$DEin paar Wolken (Nacht-Symbol)24 Pixel breit, feste Farben
Symbol$EMäßig bewölkt (Tag-Symbol)24 Pixel breit, feste Farben
Symbol$FMäßig bewölkt (Nacht-Symbol)24 Pixel breit, feste Farben
Symbol$GÜberwiegend bewölkt, bedeckt (Tag-Symbol)24 Pixel breit, feste Farben
Symbol$HÜberwiegend bewölkt, bedeckt (Nacht-Symbol)24 Pixel breit, feste Farben
Symbol$IRegenschauer (Tag-Symbol)24 Pixel breit, feste Farben
Symbol$JRegenschauer (Nacht-Symbol)24 Pixel breit, feste Farben
Symbol$KRegen (Tag-Symbol)24 Pixel breit, feste Farben
Symbol$LRegen (Nacht-Symbol)24 Pixel breit, feste Farben
Symbol$MGewitter (Tag-Symbol)24 Pixel breit, feste Farben
Symbol$NGewitter (Nacht-Symbol)24 Pixel breit, feste Farben
Symbol$OSchnee (Tag-Symbol)24 Pixel breit, feste Farben
Symbol$PSchnee (Nacht-Symbol)24 Pixel breit, feste Farben
Symbol$QNebel, Dunst, Trüb (Tag-Symbol)24 Pixel breit, feste Farben
Symbol$RNebel, Dunst, Trüb (Nacht-Symbol)24 Pixel breit, feste Farben
Symbol$SEmpfang eines fehlerhaften Symbol-Kodes24 Pixel breit, feste Farben
Symbol$0Windrichtung unbestimmt7 Pixel breit, Datum-Farbe
Symbol$1Wind aus Richtung Süd7 Pixel breit, Datum-Farbe
Symbol$2Wind aus Richtung Südwest7 Pixel breit, Datum-Farbe
Symbol$3Wind aus Richtung West7 Pixel breit, Datum-Farbe
Symbol$4Wind aus Richtung Nordwest7 Pixel breit, Datum-Farbe
Symbol$5Wind aus Richtung Nord7 Pixel breit, Datum-Farbe
Symbol$6Wind aus Richtung Nordost7 Pixel breit, Datum-Farbe
Symbol$7Wind aus Richtung Ost7 Pixel breit, Datum-Farbe
Symbol$8Wind aus Richtung Südost7 Pixel breit, Datum-Farbe
Symbol$TSonnen-Symbol10 Pixel breit, feste Farben; für Anzeige der Sonnenzeiten (wird intern verwendet)
Symbol$USolar-Symbol13 Pixel breit, feste Farben; für Anzeige von Solarenergie
Symbol$VBatterie-Symbol5 Pixel breit, feste Farben; für Anzeige von Batterie-Ladeständen
Symbol$WTankstellen-Symbol10 Pixel breit, feste Farben; für Anzeige von Kraftstoffpreisen
Symbol$XWolken-Symbol16 Pixel breit, feste Farben; für Anzeige der Wolkendichte
Symbol$YWind-Symbol16 Pixel breit, feste Farben; für Anzeige von Windinformationen
Symbol$ZRegen-Symbol16 Pixel breit, feste Farben; für Anzeige der Regenmenge

• Alarmwert

An:ashtAbschluss durch <LF> oder <CR>

AnAlarmkennung im Bereich A1-A8
:Trennzeichen
aAlarmwert (0 oder 1)
sAlarmsound (0-6)
hHalte-Modus (0 oder 1)
tAlarm-Text (maximal 12 Zeichen)

Mit diesem Datentyp wird eine Alarmmeldung übermittelt. Die Alarmkennung A1-A8 liefert hier direkt die Alarmnummer. Das Trennzeichen ist immer ein Doppelpunkt und der Alarmwert ist entweder 0 oder 1, wobei 0 hier Alarm inaktiv und 1 Alarm aktiv bedeutet. Bei einer Meldung mit dem Alarmwert 0 werden keine weiteren Zeichen gesendet. Bei einem Alarmwert 1 folgen noch weitere Daten: Der erste Wert kann im Bereich 0-6 liegen und bestimmt den Alarmsound, der abgespielt werden soll. Die Werte 1-6 lösen den entsprechenden Klang in der Matrixuhr aus, der Wert 0 kann verwendet werden, um den Alarm ohne Ton auszulösen. Der Halte-Modus legt fest, was nach der Rückkehr des Alarms in den Ruhezustand passieren soll: Der Wert 0 bedeutet, dass der Alarm automatisch nach 2 Minuten quittiert wird. Beim Wert 1 bleibt der Alarm stehen, bis er über die Funktion Quittieren manuell gelöscht wird. Als letztes folgt noch der Alarmtext, der auf dem Display angezeigt werden soll, dieser kann maximal 12 Zeichen lang sein. Auch hier einige Beispiele:

A1:0                Der Alarm 1 kehrt in den Ruhezustand zurück.
A2:141Briefkasten   Der Alarm 2 wurde ausgelöst, der Text Briefkasten erscheint auf dem Display, der Sound 4 wird abgespielt und der Alarm bleibt nach der Rückstellung in der Anzeige, bis er manuell quittiert wird.
A5:100Wohnzimmer    Ein Sensoralarm ist aktiv, der Text Wohnzimmer erscheint, es wird kein Sound abgespielt und der Alarm wird automatisch 2 Minuten nach der Rückkehr in den Normalzustand vom Display gelöscht.

• Uhrzeit

TM:yyyymmdd hh:mm:ss.cc sAbschluss durch <LF> oder <CR>

TMfeste Kennung
:Trennzeichen
yyyymmddDatum in der Reihenfolge Jahr Monat Tag
Leerzeichen
hh:mm:ss.ccUhrzeit in der Reihenfolge Stunde:Minute:Sekunde.Hundertstel
Leerzeichen
sSommerzeit (0 oder 1)

Mit diesem Datentyp wird die aktuelle Uhrzeit übermittelt. Diese wird vom Web-Modul oder dem internen Raspberry Pi regelmäßig im eingestellten Intervall gesendet, beim Empfang von der Matrixuhr genau geprüft und anschließend übernommen. Durch die Verwendung von Hundertstel Sekunden erfolgt das Setzen der Uhr sehr genau und zeigt keine Abweichungen gegenüber einer DCF77-Uhr. Hier ein Beispiel:

TM:20240215 20:59:37.42 0   Die Uhr wird mit dem Datum 15.02.2024, der Uhrzeit 20:59:37 mit 42 Hundertstel gestellt. Außerdem ist die Sommerzeit nicht aktiv.

• Textnachricht

ME:TextAbschluss durch <LF> oder <CR>

ME feste Kennung
:Trennzeichen
TextTextnachricht (maximal 100 Zeichen)

Mit diesem Datentyp kann eine Textnachricht zur Matrixuhr übermittelt werden, die bis zu 100 Zeichen lang sein kann. Genau genommen sind es 100 Bytes und man muss berücksichtigen, dass Umlaute und einige Sonderzeichen durch die UTF-8-Kodierung mehrere Bytes benötigen. Der empfangene Text wird sofort als Laufschrift angezeigt und der fest zugeordnete Sound 5 einmalig abgespielt. Die Textnachricht wird fortlaufend wiederholt und muss mit dem Taster oder der Sensorfläche Quittieren gelöscht werden. Auch dafür ein Beispiel:

ME:Heute wird es etwas später...   Der übermittelte Text erscheint als Laufschrift.

Symbol Sonstiges

Eine Uhr mit Matrix-Display war schon länger geplant. LEDs in einfachen Matrix-Formen (z.B. 8x8) gibt es schon länger. Allerdings muss man sich für eine oder 2 Farben entscheiden und der Aufwand für die Ansteuerung ist enorm. Nach der Entwicklung des Weihnachtssterns kam die Idee, WS2812B für die LED-Matrix zu verwenden. Aber auch das wurde wieder verworfen, da die Abstände zwischen den LEDs zu groß sind. Irgendwann Anfang 2015 fand ich eher zufällig bei Adafruit das hier verwendete RGB-Matrix-Display, welches in verschiedenen Größen und Auflösungen erhältlich ist. Leider waren diese Displays zu dieser Zeit (Mitte Februar 2015) nur bei Adafruit in den USA erhältlich und nach langem Überlegen bestellte ich die 64x32-Version mit 5mm Pixelabstand, außerdem noch ein „RGB Matrix HAT“ für den direkten Anschluss an einen Raspberry Pi B+ oder Raspberry Pi 2. Der ursprüngliche Plan war nämlich, die Uhr mit einem Raspberry Pi zu realisieren.

Nach einer guten Woche und reichlich Geld für die von UPS abgewickelten Zollformalitäten hielt ich das Display in der Hand und auch das Modul für den Raspberry Pi. Leider waren die ersten Versuche nicht so erfolgreich. Prinzipiell funktionierte das Display am Raspberry Pi, aber die Ergebnisse überzeugten nicht. So traten immer wieder Störungen auf und es gab ständig Helligkeitsschwankungen. Eigentlich ist das sogar nachvollziehbar, denn der Raspberry Pi ist zwar schnell genug für eine Multiplex-Ansteuerung, aber das Linux-System lässt leider keine genauen Schaltzeiten im Mikrosekunden-Bereich zu. Also wurde die Idee mit dem Raspberry Pi wieder verworfen und doch wieder ein AVR-Mikrocontroller vorgesehen.

Bei Adafruit gibt es viele Anleitungen für Projekte und auch für die Matrix-Displays ist dort einiges zu finden. So hat man eine komplette Bibliothek für den Anschluss einer solchen RGB-Matrix an einen Arduino geschrieben und zum freien Download zur Verfügung gestellt. Auf dieser Basis habe ich dann erste Versuche auf einem ATmega328P und später durch ein angepasstes Software-Modul auch auf dem größeren ATmega1284P durchführen können. Die Arduino-Bibliothek für die RGB-Matrix kann das Display mit 4 Bits pro Farbe ansteuern, was einen recht brauchbaren Farbraum ergibt. Auch sind schon viele Funktionen für Grafik und Text eingebaut und man kann mit zwei Puffern arbeiten, um ein neues Bild ohne Störungen vorzubereiten und dann mit einem Pufferwechsel zu aktivieren. Ich war trotzdem nicht so recht mit der Bibliothek zufrieden, denn das Display leuchtet im Tagbetrieb sehr hell, hat aber keine Möglichkeit für einen gedimmten Nachtbetrieb vorgesehen. Auch konnte ich mich nicht so recht mit der Arduino-Software anfreunden und es war mir auch nicht ganz klar, welche Ressourcen des AVR von der Software bereits verwendet werden.

Also startete ich ein komplett neues Projekt mit dem Atmel Studio und schrieb selbst eine Routine für das Matrix-Display, die zwar nicht so viele Farben unterstützt, dafür aber eine Helligkeitssteuerung ermöglicht. Einige Tricks habe ich von Adafruit abgeschaut, so z.B. die Verwendung von 2 Puffern, die im Wechsel arbeiten. Die Ansteuerung des RGB-Matrix-Displays ist im Prinzip nicht schwierig, aber durch den Multiplexbetrieb und die serielle Ansteuerung wird effizienter Kode benötigt. Aus diesem Grund ist die Routine komplett in Assembler geschrieben worden. Das restliche Programm wurde in C realisiert, wobei einige Teile von bereits bestehenden Projekten in modifizierter Form weiterverwendet werden konnten, z.B. stammen der Zeichensatz und einige Ausgabe-Funktionen von der Tischuhr.

Anfangs war noch nicht so recht klar, wie die Uhr mit anderen Geräten kommunizieren sollte. Da das ursprüngliche Projekt auf einem Raspberry Pi entstehen sollte und somit auch eine Web-Oberfläche zur Bedienung und sowie ein Zugriff aus dem Internet angedacht war, sollte natürlich auch die AVR-Version in irgendeiner Form mit einem Raspberry Pi zusammenarbeiten. So entstand der Plan, das bereits vorhandene Web-Modul des Temperatur-Messsystems mit der Matrixuhr zu verbinden und einfach die dort verfügbaren Informationen für die Uhr zu nutzen. Damit man nicht unbedingt auf das Web-Modul angewiesen ist, habe ich außerdem noch eine Verbindung mit dem Sensormodul angedacht, die allerdings nicht ganz so viele Möglichkeiten bietet. Außerdem sollte auch ein autonomer Betrieb der Uhr möglich sein - somit kann man die Uhr auch ohne Temperatur-Messsystem nutzen.

Nach einigen Monaten Entwicklungszeit lief die Uhr stabil und auch die Kommunikation mit dem Sensormodul oder dem Web-Modul funktionierte. Dazu war auf dem Web-Modul ebenfalls einige Entwicklungsarbeit notwendig. Zunächst musste der einfache RS-232-Empfänger durch einen vollwertigen RS-232-Transceiver ersetzt werden, denn es müssen jetzt zusätzlich Daten versendet werden. Bei dieser Gelegenheit habe ich gleich noch eine Echtzeituhr (RTC) eingebaut, damit nach einem Neustart des Raspberry Pi ohne Internetverbindung eine gültige Uhrzeit vorhanden ist. Für die Matrixuhr ist die RTC nicht unbedingt erforderlich, aber da auf meinem Web-Modul auch noch FHEM zur Steuerung von Rollläden und Heizung läuft, erschien mir dieser Schritt sinnvoll. Außerdem musste noch ein Programm erstellt werden, welches zyklisch die Sensordaten, Geburtstage, Alarme und Uhrzeit zur Matrixuhr sendet. Dafür habe ich ein Perl-Programm verwendet, welches als Systemdienst eingebunden und automatisch gestartet wird.

Im Frühjahr 2018 kam der Wunsch auf, den Funktionsumfang der Matrixuhr etwas zu erweitern. Außerdem war die bisherige Datenkommunikation zwischen Web-Modul und Matrixuhr nicht besonders elegant gelöst und sollte geändert werden. Und eine kleine Schwäche in der Helligkeitsregelung hat mich auch schon länger gestört. Damit ich meine laufenden Systeme nicht außer Betrieb nehmen muss, habe ich ein zweites Web-Modul und auch eine weitere Matrixuhr aufgebaut. Diese wurde gleich auf den aktuellen Hardware-Stand gebracht und mit einem Raspberry Pi ausgestattet. Hier kam eine kleine und kostengünstige Variante in Form des „Raspberry Pi Zero WH“ zum Einsatz, der zudem eine Netzwerkverbindung über WLAN erlaubt. Die Entwicklung der Software hat dann einige Zeit in Anspruch genommen, schließlich musste nicht nur die Software der Matrixuhr, sondern auch die des Web-Moduls erweitert und umgebaut werden. Aber es konnten alle Probleme gelöst werden und fortan erfolgt die Verteilung der Sensordaten und Alarminformationen auf dem Web-Modul über einen MQTT-Server. Das ermöglicht nicht nur die kabellose Versorgung mehrerer Matrixuhren, sondern auch die Weitergabe der Daten an andere Systeme, wie z.B. Haussteuerungen. In meinem Fall kommen die Sensordaten und Alarme über MQTT sehr komfortabel in die Haussteuerung FHEM, wo diese Daten auch weiterverarbeitet und für Steuerungszwecke verwendet werden können.