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 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.

Letzte Bearbeitung: 28.07.2018

Symbol Downloads
Schaltplan
Stückliste mit Empfehlungen zur Bauteilbestellung
Software für ATmega1284P mit komplettem Quelltext in C vom 26.07.2018matrixuhr-atmega1284p-v200.zip
Sound-Paket mit 6 Klängen für den MP3-Player der Matrixuhrmatrixuhr-sounds.zip
Platinen-Layout (Eagle und PDF) vom 06.03.2018 ohne Raspberry-Pi-Optionmatrixuhr-layout.zip
Software-Paket v4.00 für Raspberry Pi vom 26.07.2018matrixuhr-files-v400.tar.gz
Raspberry Pi Homepage - Downloads („Raspbian Stretch Lite“)https://www.raspberrypi.org/downloads/raspbian/
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 Advanced IP Scanner (Netzwerk durchsuchen) https://www.advanced-ip-scanner.com/
Homepage von FileZilla Client (Dateien vom und zum Raspberry Pi übertragen) https://filezilla-project.org/
Symbol Inhaltsverzeichnis
Beschreibung Allgemeine Informationen über die Matrixuhr
Schaltung Beschreibung der Schaltung
Hardware Bilder und Hinweise zum Aufbau der Uhr
Software Beschreibung der Software der Uhr
Inbetriebnahme Inbetriebnahme der Uhr
Bedienung Bedienungsanleitung und komplette Beschreibung aller Funktionen
Datenkommunikation Informationen über die Verbindung der Uhr mit dem Sensor- oder Web-Modul
Sonstiges Einige 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 9600Baud 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 und Wetterinformationen 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 wird 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 Betriebart 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 und Wetterinformationen angezeigt werden. Weitere 4 Alarme stehen zur Verfügung, um Sensorwerte zu überwachen (Unterschreitungen, Überschreitungen oder auch Vergleiche zwischen 2 Sensorwerten). 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 Funktionen:

BetriebsartSensordatenAlarmeGeburtstageWetterdatenTextnachricht1-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 Wettersymbole 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 natürlich auch Umlaute und Unterlängen sauber 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 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 Annäherungssensor 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 der Konfiguration über eine Web-Seite.

Eins muss ich allerdings noch erwähnen: Das Matrix-Display ist in Deutschland nur schwer erhältlich und auch relativ teuer (Stand vom Juli 2018). Ich habe mein Exemplar im Frühjahr 2015 in den USA bei Adafruit bestellt. Dort ist es mit knapp 80$ auch recht preiswert, aber der Versand per UPS sehr teuer. Dazu kommen noch die Zoll-Formalitäten, die zwar UPS erledigt, sich aber gut bezahlen lässt. Eine alternative Bestellmöglichkeit fand ich in Luxemburg bei Electronic-Shop. Da liegt man preislich über 100€, bestellt habe ich dort jedoch noch nicht. Eine weitere Möglichkeit ist AliExpress. Hier kann man ein vergleichbares Display für ca. 30€ bekommen. Dabei sollte man unbedingt auf die LED-Größe SMD2727 achten. Die meisten Displays verwenden kleinere LEDs und das ergibt nicht so ein schönes Bild. Ich habe für eine weitere Matrixuhr ein etwas kleineres Display dort gekauft und die Qualität ist in Ordnung. Die Displays gibt es übrigens in 4 Baugrößen mit LED-Abständen von 3, 4, 5 und 6mm, bei AliExpress verwendet man als Größenangabe P3, P4, P5 und P6. In dem hier beschriebenen Projekt habe ich die 5mm-Version (P5) verwendet. Man kann übrigens auch 2 Displays im Format 32x32 verwenden und diese dann kaskadieren.

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 heran geht, 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 und wird auch von Adafruit als Geisterpixel-Effekt erwähnt. Beim 2015 bei Adafruit gekauften Display ist dieser Geisterpixel-Effekt recht deutlich zu sehen, beim Display von AliExpress aus dem Jahr 2018 ist der Effekt jedoch kaum wahrzunehmen.

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. Jeweils 16 LED-Zeilen bilden eine Multiplexeinheit, somit sind bei diesem 32-zeiligen Display zwei solche Einheiten vorhanden (obere und untere Bildhälfte). 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. Ü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. Inzwischen gibt es das MP3-Modul MSM4 und 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 einfach 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 bildet die Eingabefunktionen der Uhr. 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 IC2 erkannt und ein Schaltimpuls ausgegeben, der über T9 vom Mikrocontroller wie ein Tastendruck ausgewertet wird.

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. Ü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. 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 und leider auch teurere Alternative aufgelistet. 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 sind dann von außen sichtbar und 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.

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 es 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, was 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 alle 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 angeschossene 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.

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 W. 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.

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, 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

Der 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 Wettersymbole
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 folgende 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. Nach dem Setzen einiger Variablen und der Freigabe der Interrupts geht das Programm 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. Anschließend werden die Einheiten umgeschaltet und der Vorgang beginnt von vorn. Die Verwendung einer einzelnen Einheit führte immer wieder zu Bildstörungen im Display.
Jede Matrix-Einheit besteht wiederum aus 2 Teilen mit einer Größe von 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 einer weiteren identischen Einheit lassen sich nochmals 8 Farbwerte speichern und durch die abwechselnde Multiplexausgabe der beiden Teile entsteht eine Farbmischung.

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 kurzes 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 die Alarmmeldungen 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 der 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 Synchronisierungfunktion 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 und Pixel als Farbwert in inaktiver Matrix setzen. 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. 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ücksichtigten 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 vom Timer 1 alle 156,25µs (Frequenz 6400Hz) ausgelöst und sieht mit nur 2 Zeilen wenig komplex aus. Aber das täuscht, denn Zeile 1 ruft eine in Assembler geschriebene Funktion auf, welche in der Datei Matrix-Uhr_asm.s gespeichert ist. Diese dient ausschließlich zum Senden der Daten aus dem aktiven Matrix-Puffer an das Display und steuert außerdem noch gemeinsam mit dem Timer2 die Helligkeit. Die Assembler-Funktion bekommt vom C-Programm 3 Parameter übergeben: die Speicheradresse des Matrix-Puffers, einen Multiplexzähler und einen PWM-Wert für die Helligkeit. 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. Die Displayzeile wird aus den Bits 1-4 (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.

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. Die Bits 1-4 des Multiplexzählers werden 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 Wert (0-15) mit 64 multipliziert und zur Adresse im Matrix-Puffer addiert. Das ergibt die Position im Puffer, wo die Daten der auszugebende Zeile gespeichert sind. Jetzt beginnt das eigentliche Senden der Farbdaten über eine Schleife, die 64 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 der 64 Bytes sorgt ein kurzer High-Impuls an PA4 für die Übernahme der Daten in den Speicher (Latch) des Displays. Den Abschluss macht ein Low an PA5 - das schaltet die LED-Ausgänge ein und die neue Zeile wird sichtbar.

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 die Interrupt-Routine wieder beendet. Timer2 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.

Die Ausgaben an das Matrix-Display erfolgen alle 156,25µs, also mit einer Frequenz von 6400Hz und 32 Ausgaben sind erforderlich, um ein vollständiges Bild darzustellen. Somit ergeben sich Zeiten von 5ms bzw. eine Frequenz von 200Hz für ein vollständiges Bild. Dieser Wert ist ein Kompromiss, um einerseits das Bild möglichst flimmerfrei darzustellen und andererseits den Mikrocontroller nicht nur mit der Bildausgabe zu beschäftigen. Die Ausgabe einer Pixelzeile dauert übrigens ungefähr 34µs, das sind 22% der verfügbaren Rechenzeit.

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, desto länger bleibt das Display eingeschaltet und um so heller erscheint das Display. Das alles passiert im Zeitraster von Timer1, also 6400 mal pro Sekunde.

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 zu 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 hängt ausnahmsweise mal nicht an einem Timer und 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 (Sensordaten, Alarminformationen, Geburtstage, Wetterinformationen, Textnachrichten, Uhrzeit) und sendet diese 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.

Die Hauptarbeit leistet hier das Programm matrixuhr.pl. Es liest nach dem Start zunächst alle Konfigurationsdaten ein und läuft dann in einer Endlosschleife. Es empfängt ständig Sensordaten und Alarminformationen über MQTT vom Web-Modul, verwaltet eine Geburtstagsliste und übernimmt die vom Programm matrixctl.pl bereitgestellten Wetterdaten 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.

Das Programm matrixuhr.pl leistet noch etwas mehr. 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.

Das Programm matrixctl.pl 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.

Das letzte Programm matrixrcv.pl 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 die matrixrcv.pl fährt daraufhin den Raspberry Pi herunter. Dieses Programm wird nur beim Raspberry-Pi-Betrieb installiert.

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/messagemuzu sendende Textnachricht
/srv/sensor/messagemu.sgesendete Textnachricht
/srv/sensor/mqttmuMQTT-Konfiguration
/srv/sensor/senlmuMQTT-Topics der Sensorliste 1
/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/passName und Passwort für den Web-Server
/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)
 
/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.icoMini-Bild für Browser
/var/www/html/icon.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:

Betriebsart ↓ Installationsschritt → 1011121314
Autonomer BetriebO
Sensormodul-BetriebO
Web-Modul-BetriebO
Raspberry-Pi-BetriebO OOO

Schritt ist erforderlich
OSchritt ist optional

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

Für die Inbetriebnahme der Matrixuhr wird die aktuelle Software v2.00 vom 23.08.2015 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 Nach der Übertragung der HEX-Datei und der richtigen Einstellung der Fuse-Bits sollte die Anzeige wie im nebenstehenden Bild aussehen. Die Zeit muss im Sekundentakt zählen und der Doppelpunkt zwischen den Stunden und den Minuten im Sekunden-Rhythmus blinken. Die Farben werden zunächst durch einen Zufallsgenerator bestimmt und können deshalb von diesem Bild abweichen.

Anzeige 10 Sekunden später wechselt die Anzeige in den normalen Modus. Da jetzt noch keine Zeitinformationen vorliegen, wird anstelle des Datums ein Platzhalter angezeigt.

Anzeige 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. ELV empfiehlt zunächst eine Formatierung der Karte mit FAT oder FAT32 vor der Verwendung. Anschließend kopiert man bis zu 6 Dateien in das Hauptverzeichnis die 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. Außerdem zeigt das langsame Blinken einer blauen LED den aktiven Idle-Modus an. Der neue Modus wird übrigens dauerhaft im EEPROM des Modul-Controllers gespeichert.

Diese Prozedur ist übrigens beim MSM2 und MSM4 identisch.

Symbol Schritt 3 - Raspberry Pi vorbereiten (nur bei Raspberry-Pi-Betrieb)

Die Inbetriebnahme des Raspberry Pi erfordert etwas Konfigurationsarbeit. Ich habe diese in mehrere Schritte unterteilt und es sollte erst dann mit dem nächsten Schritt begonnen werden, wenn der vorherige erfolgreich abgeschlossen wurde. Grundsätzlich sollte man sehr sorgfältig vorgehen, insbesondere dann, wenn Systemdateien bearbeitet werden müssen. Ein kleiner Fehler kann durchaus dazu führen, dass das System nicht mehr richtig funktioniert oder gar nicht mehr startet. Um Fehler zu vermeiden empfiehlt es sich, die teilweise recht langen Kommandozeilen in die Zwischenablage zu kopieren und dann im Terminalfenster einzufügen (wird weiter unten noch genauer beschrieben). Wichtig: Immer nur eine Zeile kopieren und erst nach dem Ausführen eines Kommandos die nächste Zeile holen. Nur beim Editieren von Dateien können mehrere Zeilen gleichzeitig übertragen werden. Falls trotz aller Vorsicht das System Probleme macht, dann sollte man nicht lange nach dem Fehler suchen und einfach noch mal von vorn beginnen.

Bei der Beschreibung gehe ich davon aus, dass ein Windows-PC zur Verfügung steht, mit dem die vorbereitenden Arbeiten durchgeführt werden. Diese Arbeiten können selbstverständlich auch mit Linux erledigt werden, diesen Weg habe ich aber nicht ausprobiert. Weiterhin werden alle Einstellungen für eine deutsche Sprachversion beschrieben. Soll eine Matrixuhr in einer anderen Sprachversion installiert werden, dann sind abweichende Eingaben erforderlich. Die Beschreibung ist an vielen Stellen sehr knapp gehalten, da der Text sonst zu umfangreich geworden wäre. Bei einigen Schritten habe ich die verwendeten Quellen angegeben. Einige weitere Informationen über den Raspberry Pi, Linux, Perl, HTML und PHP habe ich auf der Unterseite Links, Software zusammengestellt.

Für die Inbetriebnahme eines neuen Raspberry Pi ist zunächst ein geeignetes Betriebssystem notwendig. Dieses kann man als Image-Datei downloaden und mit einer geeigneten Software auf eine SD-Karte schreiben. Diese Karte wird dann in den Raspberry Pi gesteckt und dient sozusagen als Festplatte. Ich habe das Linux-System „Raspbian Stretch“ ausgewählt, welches von der Raspberry Pi Homepage geladen werden kann. Dieses steht in 2 Versionen zur Verfügung: „Raspbian Stretch with Desktop“ und „Raspbian Stretch Lite“. Der hauptsächliche Unterschied besteht darin, dass in der Lite-Version der grafische Desktop fehlt. Da dieser hier nicht benötigt wird, sollte die Lite-Version verwendet werden, die sogar auf einer 4GB-Karte betrieben werden kann. Die folgende Beschreibung bezieht sich übrigens auf die während der Texterstellung aktuelle Version „Raspbian Stretch Lite“ vom 27.06.2018 (2018-06-27-raspbian-stretch-lite.img). Sollte eine neuere Version zur Verfügung stehen, dann bitte diese verwenden.

Wir benötigen nun ein Programm, welches das Image auf unsere SD-Karte schreibt. Dazu wird allgemein der Win32 Disk Imager empfohlen und dieser hat sich auch bei mir bewährt. Dieses Programm ist allerdings nicht ganz ungefährlich und das liegt daran, dass es nicht nur auf SD-Karten schreiben kann, sondern auch auf beliebige andere Wechseldatenträger. Wenn man sich bei den Laufwerks-Buchstaben nicht ganz sicher ist, dann kann es passieren, dass man versehentlich eine angeschlossene USB-Festplatte oder einen USB-Stick überschreibt. Deshalb empfiehlt es sich, vor dem Programmstart alle nicht benötigten Wechseldatenträger zu entfernen.

Jetzt wird unser soeben geladenes Raspbian-Image entpackt und die SD-Karte in den Kartenleser des PCs gesteckt. Die SD-Karte sollte mindestens 4GB, besser 8GB groß sein. Bei der Wahl der Geschwindigkeitsklasse gibt es unterschiedliche Meinungen, ich empfehle eine Class-10-Karte wie in der Stückliste. Hier liegt auch ein Adapter bei, mit dem man die microSD-Karte in einen normalen Karten-Schlitz stecken kann. Jetzt wird der Win32 Disk Imager gestartet, bei Image File über das kleine Symbol das Raspbian-Image ausgewählt und im Feld Device sollte der Laufwerks-Buchstabe unserer SD-Karte stehen. Wenn man sich wirklich sicher ist, dann wird über den Button Write der Schreibvorgang gestartet, der einige Zeit dauern kann. Der Win32 Disk Imager ist übrigens auch später noch sehr nützlich, denn man kann damit auch SD-Karten auslesen und somit jederzeit ein komplettes Backup vom System anfertigen und bei Bedarf auch wieder auf die Karte zurückschreiben.

Ist der Win32 Disk Imager mit seiner Arbeit fertig, dann kann das Programm beendet werden. Die SD-Karte bleibt zunächst im Kartenleser gesteckt, da noch zwei Dateien auf die Karte geschrieben werden müssen. Der Hintergrund ist folgender: Der Raspberry Pi der Matrixuhr soll „headless“ betrieben werden, also ohne Bildschirm und ohne Eingabegeräte. Auch die komplette Einrichtung wird ohne Zusatzgeräte durchgeführt. Alle Ein- und Ausgaben erfolgen über die WLAN-Verbindung unter Verwendung des SSH-Protokolls. Bei „Raspbian Stretch Lite“ ist die SSH-Funktion in der Voreinstellung aus Sicherheitsgründen ausgeschaltet und diese müssen wir zunächst aktivieren. Auch die Daten für das WLAN müssen wir dem System bekannt geben. Für beide Aktivitäten habe ich in dem bereits verwendeten Software-Paket v2.00 folgende 2 Dateien abgelegt:

Matrix-Uhr\Raspberry Pi\sshBei dieser Datei ist nur der Dateiname wichtig, der Inhalt ist ohne Bedeutung.
Matrix-Uhr\Raspberry Pi\wpa_supplicant.confDiese Datei enthält die Zugangsdaten für das WLAN (SSID und Passwort).

Unter Windows ist ein kleiner Bereich der SD-Karte sichtbar und dort kopieren wir die beiden Dateien hin. Die Datei wpa_supplicant.conf auf der Speicherkarte muss allerdings noch bearbeitet werden (z.B. mit dem Editor von Windows). Hier müssen die Beispiel-Einträge der folgenden beiden Zeilen mit den richtigen Zugangsdaten für das WLAN ausgefüllt werden (bitte nicht die Anführungszeichen entfernen):

ssid="Mein_WLAN"
psk="Mein_WLAN_Passwort"

Nach dem Speichern der geänderten wpa_supplicant.conf wird die nun fertige SD-Karte über die „Auswerfen“-Funktion auf der Windows-Taskleiste vom System abgemeldet und in Raspberry Pi gesteckt, welcher wiederum auf die Hauptplatine aufgesteckt werden muss. Bei Einschalten der Matrixuhr sollte der Raspberry Pi starten, was am Flackern einer LED zu erkennen ist. Beim ersten Start wird übrigens das Raspbian-System an die Größe der SD-Karte angepasst und anschließend ein Reboot durchgeführt. Man sollte also dem Raspberry Pi mindestens 90 Sekunden Zeit geben, bevor man versucht, eine Verbindung herzustellen. Auf dem Matrix-Display passiert zunächst nichts außergewöhnliches, da vom Raspberry Pi noch keine Daten gesendet werden.

Symbol Schritt 4 - Verbindung mit dem Raspberry Pi herstellen (nur bei Raspberry-Pi-Betrieb)

Das Raspbian-System ist so konfiguriert, dass der Raspberry Pi über DHCP vom Router des Heimnetzwerks eine IP-Adresse zugewiesen bekommt. Diese Adresse muss jetzt ermittelt werden und dafür kann man sich entweder in den Router einloggen oder das Freeware-Programm Advanced IP Scanner verwenden, welches alle Geräte im Heimnetz anzeigt. Hier muss auf jeden Fall der Raspberry Pi aufgelistet werden, anderenfalls sind vermutlich die WLAN-Daten nicht korrekt. Wird unser Raspberry Pi gefunden, wird jetzt noch ein SSH-Client auf dem PC benötigt, damit wir eine Verbindung zum Raspberry Pi aufbauen können. Ich habe mich hier für das Freeware-Programm PuTTY entschieden. Die Bedienung ist auch nicht kompliziert: In das Feld Host Name kommt die IP-Adresse des Raspberry Pi, als Beispiel verwende ich hier 192.168.1.13 und im Feld Port steht schon die richtige Nummer 22. Mit einem Klick auf Open wird die Verbindung aufgebaut. Zunächst erscheint jedoch eine Sicherheitswarnung. PuTTY speichert von jedem Server eine Art Fingerabdruck und prüft diesen bei jedem Verbindungsaufbau. So kann man vor dem Login erkennen, ob man mit dem richtigen Server verbunden ist. Von unserem Raspberry Pi liegt dieser Fingerabdruck noch nicht vor und wir haben jetzt die Möglichkeit, mit einem Klick auf Ja den Fingerabdruck zu speichern. Jetzt erscheint die folgende Eingabezeile:

login as: _

Hier geben wir den Benutzernamen pi ein. Anschließend erscheint eine Passwortabfrage, die in unserem Beispiel so aussehen würde:

pi@192.168.1.13's password: _

Hier geben wir das voreingestellte Passwort raspberry ein. Wenn alles geklappt hat, dann erscheinen einige Informationen und zum Schluss der folgende Eingabe-Prompt:

pi@raspberrypi:~ $ _

Sollte PuTTY keine Verbindung zum Raspberry Pi herstellen können, dann wurde vermutlich beim Schritt 3 vergessen, die Datei ssh auf die SD-Karte zu kopieren. In diesem Fall sollte man die Matrixuhr ausschalten und nochmals ab Schritt 3 beginnen.

Wenn alles geklappt hat, dann kann man noch etwas an der Optik von PuTTY arbeiten. Dazu klickt man auf das kleine Symbol links oben auf der Titelzeile und wählt die Option Change Settings... aus. Hier habe ich in der Kategorie Window die vorgegebene Fenstergröße von 80x24 auf 120x32 vergrößert, damit mehr Informationen im Terminalfenster zu sehen sind. Auch der Zeichensatz ist nicht optimal, diesen kann man in der Kategorie Window - Appearance und Change... ändern, z.B. auf Consolas, 12-point. Alle Einstellungen lassen sich natürlich auch speichern, dies erfolgt in der Kategorie Session. Hier gibt man einen passenden Namen in das Feld Saved Sessions ein und klickt auf Save. Mit Apply wird das Einstellungsfenster wieder geschlossen und zum Terminalfenster zurückgekehrt. Wird PuTTY später erneut gestartet, dann lässt sich die soeben gespeicherte Session durch einen Doppelklick auf den Namen wieder aufrufen.

Symbol Schritt 5 - Betriebssystem konfigurieren (nur bei Raspberry-Pi-Betrieb)

Nachdem PuTTY nun optimal eingerichtet ist, werden wir mit dessen Hilfe das Raspbian-Betriebssystem konfigurieren. Dafür werden Kommandos verwendet, die direkt am Eingabe-Prompt eingegeben werden müssen. Diese Kommandos können durchaus recht lang sein und hier bietet es sich an, diese hier im Browser zu markieren und in die Zwischenablage zu kopieren. Im Terminalfenster von PuTTY kann man dann den Inhalt der Zwischenablage mit der rechten Maustaste an der aktuellen Cursor-Position einfügen. Alle Eingaben am Prompt werden außerdem von Raspbian in einer Historie gespeichert. Mit den Pfeiltasten nach oben und unten kann man durch diese Historie blättern und so ein bestimmtes Kommando nochmals an den Eingabe-Prompt holen. Weiterhin beherrscht Linux eine sehr gute Autovervollständigung, die man mit der Tabulator-Taste auslösen kann. Kommandos, Verzeichnisnamen und teilweise auch Parameter werden dann ergänzt, soweit dies möglich ist.

Wir geben nun das erste Kommando ein oder kopieren es über die Zwischenablage ins Terminalfenster:

sudo raspi-config

Damit wird das Programm raspi-config gestartet, welches eine menügeführte Einstellung vieler Systemfunktionen ermöglicht. Einige Einstellungen erfordern erweiterte Rechte, diese werden mit dem vorangestellten sudo gewährt. Ist das Programm gestartet, dann werden hauptsächlich die Pfeiltasten, die Tabulator-Taste und Enter verwendet. Los geht's:

Damit sind alle notwendigen Systemeinstellungen erledigt. Wir wechseln nun mit Tab auf Finish und drücken Enter. Danach erscheint ein Fenster, in dem ein Reboot angeboten wird, dieses bestätigen wir mit Yes und Enter. Der Raspberry Pi startet nun neu und trennt dabei die SSH-Verbindung. PuTTY zeigt diesen Zustand mit einer Fehlermeldung an. Wir geben dem Raspberry Pi mindestens 45 Sekunden Zeit und bauen die Verbindung wieder auf. Dazu quittieren wir die Fehlermeldung von PuTTY und klicken anschließend auf das kleine Symbol links oben auf der Titelzeile. In dem nun erscheinenden Menü wählen wir Restart Session aus. Es folgt nun wieder die Abfrage von Benutzername und Passwort, wobei ab jetzt das neue Passwort verwendet werden muss. Sollte an dieser Stelle die Verbindung nicht wieder hergestellt werden können, dann hat offensichtlich der Router dem Raspberry Pi eine neue IP-Adresse zugeteilt. In diesem Fall muss man die neue IP-Adresse ermitteln (über den Router oder mit dem Advanced IP Scanner). Anschließend wird PuTTY beendet, neu gestartet und eine Verbindung zur neuen IP-Adresse des Raspberry Pi aufgebaut.

Symbol Schritt 6 - Netzwerk konfigurieren (nur bei Raspberry-Pi-Betrieb)

Grundsätzlich ist das Netzwerk des Raspberry Pi bereits konfiguriert, anderenfalls wäre keine SSH-Verbindung möglich. Aber es ist so konfiguriert, dass der Raspberry Pi beim Systemstart vom Router des Heimnetzwerks über DHCP eine IP-Adresse zugewiesen bekommt (dynamische IP-Adresse). Das hat leider den Nachteil, dass die IP-Adresse nicht vorhersehbar ist und sich auch jederzeit ändern kann. Zwar erkennen viele Router-Modelle den Raspberry Pi nach einem Neustart wieder und vergeben die gleiche IP-Adresse, trotzdem bietet eine statische Adresse einige Vorteile. So ist die Matrixuhr zukünftig immer unter der gleichen IP-Adresse erreichbar und diese Adresse können wir in gewissen Grenzen selbst festlegen.

Zur Vergabe einer statischen Adresse sind 3 Parameter notwendig: die IP-Adresse, die Subnetz-Maske und das Gateway. Mit dem folgenden Kommando kann man sich einige Parameter des Netzwerks anschauen:

netstat -rn

Unsere Beispiel-Konfiguration würde dann folgendes Bild ergeben:
Kernel-IP-Routentabelle
Ziel            Router          Genmask         Flags   MSS Fenster irtt Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG        0 0          0 wlan0
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 wlan0

Das sind typische Werte in einem Heimnetz und hier kann man bereits zwei Parameter entnehmen: Die Subnetz-Maske ist 255.255.255.0 und das Gateway (Adresse des Routers) 192.168.1.1. Nun muss noch die IP-Adresse festgelegt werden, wobei die ersten 3 Teile mehr oder weniger vom Router vorgegeben sind (192.168.1). Den 4. Teil der Adresse können wir aber selbst bestimmen und hier ist es wichtig, dass dieser nicht bereits von einem anderen Gerät im Netz verwendet wird und auch nicht im DHCP-Bereich des Routers liegt. Diese Informationen kann man normalerweise aus dem Router auslesen. Meist sind die Adressen ab 201 frei und so verwende ich bei der folgenden Konfiguration beispielhaft die IP-Adresse 192.168.1.223.

Um eine statische IP-Adresse festzulegen, ist das Bearbeiten einer Konfigurationsdatei des Linux-Systems erforderlich. Hier bietet sich der vorinstallierte Texteditor nano an. Dieser ist nicht schwer zu bedienen, allerdings sind die Funktionen für den Windows-Benutzer etwas ungewohnt. Aber so viele Funktionen muss man sich gar nicht merken, wichtig ist Strg-O zum Speichern einer Datei und Strg-X zum Beenden des Editors. Mit dem folgenden Kommando wird der Texteditor mit erweiterten Rechten gestartet und die zu bearbeitende Konfigurationsdatei geöffnet:

sudo nano /etc/dhcpcd.conf

Wir bewegen nun mit den Pfeiltasten den Cursor an das Ende der Datei und fügen die folgenden Zeilen ein (ich benutze hier die Daten von unserem Beispiel):
interface wlan0
  static ip_address=192.168.1.223/24
  static routers=192.168.1.1
  static domain_name_servers=192.168.1.1

In der zweiten Zeile wird die gewünschte IP-Adresse des Raspberry Pi angegeben. Der Wert hinter dem Schrägstrich entspricht unserer Subnetz-Maske in einer anderen Schreibweise. Schreibt man die Subnetz-Maske 255.255.255.0 binär, dann sieht das so aus: 11111111.11111111.11111111.00000000. In der alternativen Schreibweise wird einfach die Anzahl der Einsen angegeben, in diesem Fall 24. Die Adressen in Zeile 3 und 4 sind identisch und entsprechen der IP-Adresse des Routers. Mit der bereits erwähnten Tastenkombination Strg-O wird die Datei gespeichert, der Dateiname nochmals mit Enter bestätigt und der Editor mit Strg-X wieder verlassen. Die einfachste Möglichkeit zur Aktivierung der neuen Netzwerk-Konfiguration ist ein Neustart. Dazu verwenden wir das folgende Kommando:

sudo reboot

Dabei verliert PuTTY wieder die Verbindung. Da sich nun die IP-Adresse des Raspberry Pi geändert hat, bestätigen wir die Fehlermeldung und beenden PuTTY. Nun starten wir PuTTY neu, klicken in der Liste der Saved Sessions auf unsere gespeicherte Einstellung und anschließend auf den Button Load. Im Feld Host Name tragen wir nun die neue IP-Adresse ein (in unserem Beispiel wäre das die 192.168.1.223) und klicken anschließend auf den Button Save. Damit haben wir die gespeicherte Einstellung auf den aktuellen Stand gebracht und können diese nun mit einem Doppelklick auf unseren Eintrag in den Saved Sessions starten. Wenn alles geklappt hat, dann erscheint login as: und wir können uns erneut einloggen.

Klappt das Login nicht, dann ist vermutlich bei der Änderung der Netzwerkkonfiguration ein Fehler gemacht worden. Man kann mithilfe des Routers oder dem Advanced IP Scanner schauen, ob sich der Raspberry Pi vielleicht unter einer anderen IP-Adresse meldet. Falls nicht, dann muss man leider von vorn (ab Schritt 3) beginnen.

Symbol Schritt 7 - Betriebssystem updaten (nur bei Raspberry-Pi-Betrieb)

Jetzt ist ein guter Zeitpunkt, das Betriebssystem Raspbian auf den neuesten Stand zu bringen, dafür geben wir das folgende Kommando ein:

sudo apt-get update

Raspbian stellt nun Verbindungen zu mehreren Servern her und holt aktuelle Paketlisten. Kurz gesagt, es werden Informationen zu den aktuellen Softwareständen geholt.

Mit dem nächsten Kommando werden alle installierten Pakete aufgelistet, die nicht auf dem neuesten Stand sind. Werden hier nur wenige Pakete gefunden, dann beginnt das Update sofort. Anderenfalls erscheint erst eine Sicherheitsabfrage, die mit J oder Enter bestätigt werden muss:

sudo apt-get upgrade

Insbesondere das zweite Kommando kann einige Zeit in Anspruch nehmen. Diese beiden Kommandos sollte man in gewissen Zeitabständen wiederholen, damit das System immer auf dem aktuellen Stand bleibt.

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

Das Archiv matrixuhr-files-v400.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-v400.tar.gz

Jetzt packen wir das Archiv auf dem Raspberry Pi aus:

tar -xf matrixuhr-files-v400.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-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 9 - 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 alle gewünschten Daten auf und sendet sie zur Matrixuhr. Von 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 10 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 3 Konfigurationsdateien in ein Systemverzeichnis:

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

Als nächstes kopieren wir die 3 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-get install libio-socket-ssl-perl
sudo apt-get install libwww-perl

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

sudo cpan install Net::MQTT:Simple
sudo cpan install Net::MQTT:Constants
sudo cpan install LWP::Simple

Vor der eigentlichen Installation erscheint beim ersten Modul noch eine Frage, die mit Enter bestätigt werden muss. Nicht wundern - die Installation dieser Module nimmt sehr viel Zeit in Anspruch.

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 folgendem Kommando wird nun das Programm matrixuhr.pl gestartet:

sudo matrixuhr.pl

Es erfolgen hier keine Ausgaben auf dem Bildschirm, es dürfen auch keine Fehlermeldungen erscheinen. Nach ungefähr 10 Sekunden kann das Programm mit Strg-C wieder beendet werden. Jetzt werden die 3 Perl-Programme 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 Dienst 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 10 - 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 Raspbian-Lite-Systems 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-get install lighttpd
sudo apt-get install php7.0-common php7.0-cgi php7.0

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 9 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 force-reload lighttpd

Damit ist der Web-Server funktionsbereit und das können wir gleich mal testen. Dazu wird auf dem PC ein neues Fenster oder ein Tab im Web-Browser geöffnet und dort die IP-Adresse des Raspberry Pi als Ziel eingegeben, z.B. http://192.168.1.223 und es sollte jetzt die „Placeholder page“ von lighttpd erscheinen.

Für die Konfiguration der Matrixuhr benötigen wir jetzt noch eine Web-Seite, diese muss noch an die richtige Stelle kopiert werden:

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

Nun kommt der große Moment: Wir rufen jetzt vom PC nochmals unseren Web-Server auf oder klicken einfach auf die Funktion Neuladen des Browsers und dann sollte ein Bild wie dieses erscheinen:

Matrixuhr Web-Seite

Die Seite ist noch etwas länger, auf dem Bild ist nur ein Teil zu sehen. Als letzte Tätigkeit dieses Installationsschrittes löschen wir noch die Beispiel-Web-Seite von lighttpd:

sudo rm /var/www/html/index.lighttpd.html

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

Dieser Schritt ist optional, aber sehr zu empfehlen. Wenn der Web-Server der Matrixuhr später für das Internet freigegeben werden soll, dann ist ein Passwortschutz unbedingt erforderlich. Hierfür sollte man auf keinen Fall die Daten des SSH-Zugangs verwenden (pi und das dazugehörige Passwort), sondern eine separate Name- und Passwort-Kombination wählen. Als Beispiel für die folgende Beschreibung verwende ich hier den Namen meinname und das Passwort test99. Zunächst wird im Verzeichnis /srv/sensor (wo auch die Konfigurationsdaten liegen) eine Datei mit den Zugangsdaten angelegt, die wir pass nennen:

nano /srv/sensor/pass

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

meinname:test99

Mit den (hoffentlich noch bekannten) Tastenkombinationen Strg-O, Enter und Strg-X wird die Datei angelegt und der Editor wieder verlassen. Die folgenden beiden Kommandos übergeben die Datei-Rechte an den Web-Server und erteilen der Gruppe www-data das Schreibrecht:

sudo chown www-data:www-data /srv/sensor/pass
sudo chmod 664 /srv/sensor/pass

Der Web-Server benötigt 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

Trotz Vorkonfiguration ist es notwendig, eine Zeile zu bearbeiten. Dazu wird die soeben kopierte Datei geöffnet:

sudo nano /etc/lighttpd/conf-available/05-auth.conf

In die Zeile  "require" => "user=username"  muss noch der richtige Benutzername eingetragen werden. Bezogen auf unsere Beispiel-Zugangsdaten muss die Zeile anschließend so aussehen:  "require" => "user=meinname". Jetzt kann die Datei wieder gespeichert werden. Zum Abschluss muss das Authentication-Modul noch eingeschaltet werden und nach einem Neustart des Web-Servers ist dann auch der Passwortschutz aktiv:

sudo lighty-enable-mod auth
sudo systemctl force-reload lighttpd

Wenn alles geklappt hat, dann werden jetzt beim Aufruf unserer Web-Seite der Benutzername und das Passwort abgefragt. Falls später der Wunsch besteht, Benutzername und Passwort zu ändern, dann muss zunächst (wie beschrieben) die Datei pass geändert werden. Bei einer Änderung des Benutzernamens ist es zusätzlich erforderlich, den neuen Namen in die Konfiguration von lighttpd einzutragen.

Symbol Schritt 12 - SSL-Verschlüsselung 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 11 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, wobei hier durchaus Phantasiedaten eingegeben werden können. Man sollte allerdings auf Umlaute und Sonderzeichen verzichten. Als Ergebnis erhalten wir eine Datei mit dem Namen server.pem. Diese muss ins Verzeichnis des Web-Servers kopiert werden:

sudo cp 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 force-reload lighttpd

Nun versuchen wir die Seite über https aufzurufen: https://192.168.1.223. Jeder ordentliche Browser wird jetzt eine Warnung ausgeben, so sagt z.B. Firefox: Diese Verbindung ist nicht sicher. Je nach Browser muss man die Warnung bestätigen und gegebenenfalls eine Ausnahmeregel erstellen. Danach wird die Seite angezeigt und auch die Verschlüsselung wird aktiviert. Man kann zur Kontrolle die Seiteninformationen aufrufen (meist über die rechte Maustaste zu erreichen) und dort den Status der Verbindung anzeigen lassen. Auch das Zertifikat lässt sich hier einsehen. Unser Zertifikat ist übrigens 10 Jahre gültig.

Symbol Schritt 13 - Zugriff aus dem Internet 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 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 11 (Passwort) und 12 (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. Manche Provider trennen regelmäßig die Verbindung und auch hier bekommt man eine neue IP-Adresse zugewiesen. 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: 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 alle Anfragen an diesen Namen zur gerade aktuellen IP-Adresse unseres Routers weitergeleitet werden.

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, für den eingehenden Port nicht die 443, sondern eine Zahl zwischen 1000 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:3457. Das alles gilt nur für den Aufruf des Web-Moduls über das Internet, im Heimnetz ändert sich dadurch nichts.

Übrigens, man kann noch einen Schritt weiter gehen und auch den SSH-Zugang für das Internet freigeben. Die Einstellungen für die Portweiterleitung sind ähnlich wie beim Web-Server, nur dass hier der ausgehende Port 22 verwendet wird. Auch hier sollte man für den eingehenden Port nicht die 22 wählen. Damit ist dann auch ein weltweites Remote-Login mit PuTTY möglich. Hier sollte man aber gründlich überlegen, ob man das wirklich braucht, denn sollte es jemandem gelingen, sich in die Matrixuhr einzuloggen, dann hat dieser die volle Kontrolle über den Raspberry Pi und möglicherweise auch über andere Geräte im Heimnetzwerk.

Noch eine Information: Die hier beschriebenen Einstellungen für das Netzwerk entsprechen dem Standard IPv4. Eigentlich wollte ich auf das aktuelle IPv6 eingehen, aber das Thema ist doch recht komplex.

Damit ist die Installation der Matrixuhr im Raspberry-Pi-Betrieb abgeschlossen. Interessant ist vielleicht noch der Abschnitt Sonstiges etwas weiter unten.

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

Dieser Schritt ist nur beim Web-Modul-Betrieb der Matrixuhr erforderlich. Dabei werden die notwendigen Programme auf dem Raspberry Pi des Web-Moduls eingerichtet und die Matrixuhr wird über ein RS-232-Kabel mit dem Web-Modul verbunden. Weiterhin müssen folgende Voraussetzungen 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-v400.tar.gz
tar -xf matrixuhr-files-v400.tar.gz

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

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

Wichtig für die Funktion ist noch ein Zusatzmodul, welches mit folgendem Kommando installiert wird:

sudo cpan install LWP::Simple

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 /etc/systemd/system
sudo systemctl enable matrixuhr
sudo systemctl enable matrixctl
sudo systemctl start matrixuhr
sudo systemctl start matrixctl

Jetzt fehlt nur noch eine HTML-Datei:

cp matrixuhr-files/www/matrix.php /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.

Symbol Sonstiges - Backup, Restore, nützlicher Helfer

In regelmäßigen Abständen sollte man das gesamte System sichern. Damit erspart man sich im Notfall die soeben beschriebene Neuinbetriebnahme. Für eine Datensicherung müssen wir das System herunterfahren und abschalten, damit die SD-Karte entnommen werden kann. Die Software der Matrixuhr hat dafür eine Funktion eingebaut: Durch langes Drücken des Tasters 2 (mindestens 4 Sekunden) wird ein Poweroff-Kommando an den Raspberry Pi gesendet und wenn dieser darauf reagiert, erscheint dies auch auf der Anzeige der Matrixuhr als Alarmmeldung. Wir geben dem Raspberry Pi noch mindestens 30 Sekunden zum Herunterfahren und dann kann die Matrixuhr ausgeschaltet werden.

Für die Datensicherung kommt wieder der Win32 Disk Imager zum Einsatz. Die SD-Karte kommt in den Kartenleser des PCs und der Win32 Disk Imager wird gestartet. Im Feld Image File wird über das kleine Symbol ein Name und ein Speicherort für das Backup-Image ausgewählt bzw. eingegeben. Im Feld Device wählen wir den Laufwerks-Buchstaben der SD-Karte. Nun wird auf den Button Read geklickt und der Lese-Vorgang beginnt, der je nach Speichergröße der Karte einige Zeit dauern kann. Nach Bestätigung der Erfolgsmeldung kann das Programm wieder beendet und die SD-Karte über die „Auswerfen“-Funktion auf der Windows-Taskleiste vom System abgemeldet werden. Nun wird die Karte wieder in den (noch ausgeschalteten) Raspberry Pi gesteckt und dieser an den Strom angeschlossen. Nach ungefähr 45 Sekunden ist dann unsere Matrixuhr wieder online.

Falls die Notwendigkeit besteht, das System wieder herzustellen, kann man sich das Herunterfahren sparen und die Matrixuhr direkt ausschalten. Die SD-Karte kommt in den Kartenleser des PCs und der Win32 Disk Imager wird gestartet. Bei Image File wird nun über das kleine Symbol das letzte Backup-Image ausgewählt und im Feld Device sollte der richtige Laufwerks-Buchstabe stehen. Zur Sicherheit sollte man andere Wechseldatenträger entfernen, damit nicht versehentlich ein falsches Laufwerk beschrieben wird. Wenn man sich wirklich sicher ist, dann wird über den Button Write der Schreibvorgang gestartet, der einige Zeit dauern kann. Nach der Fertig-Meldung des Win32 Disk Imagers kann das Programm wieder beendet werden. Die SD-Karte wird über die „Auswerfen“-Funktion auf der Windows-Taskleiste vom System abgemeldet und kommt nun in den ausgeschalteten Raspberry Pi. Schaltet man den Strom wieder ein, dann sollte das System genau so starten und laufen wie zum Zeitpunkt der Backup-Erstellung.

Zwei kleine Tipps:
  1. Es wird empfohlen, das Backup mit dem Schritt 7 der Inbetriebnahme zu kombinieren: Zuerst führt man das Backup durch und wenn die Matrixuhr wieder läuft, startet man nacheinander die beiden Update-Kommandos. Das hat den Vorteil, dass bei einem fehlerhaften Update-Vorgang das System wieder auf den vorherigen stabilen Stand gebracht werden kann.
  2. Man sollte für die Matrixuhr 2 identische SD-Karten kaufen. Falls eine Karte im laufenden Betrieb ausfallen sollte, dann kann man problemlos das Backup auf die Reserve-Karte schreiben. Kauft man später eine neue Karte, dann kann es durchaus passieren, dass diese trotz gleicher Speicherkapazität weniger verfügbaren Platz hat. Die Folge ist, dass das Backup nicht auf die Karte geschrieben werden kann. Es gibt zwar Möglichkeiten, die Größe anzupassen, aber das ist nicht ganz so einfach. Zur Not kann man in einem solchen Fall ohne Probleme eine größere Speicherkarte nehmen (z.B. 16GB anstatt 8GB).

An dieser Stelle möchte ich noch auf einen nützlichen Helfer hinweisen. Die ältere Generation erinnert sich bestimmt noch an den legendären Norton Commander. Ein ähnliches Programm gibt es auch für Linux unter dem Namen Midnight Commander. Damit kann man bequem durch die Verzeichnisse navigieren sowie Dateien kopieren, verschieben, löschen, anzeigen, editieren oder vergleichen und vieles mehr. Der Midnight Commander kann folgendermaßen installiert werden:

sudo apt-get install mc

Nach der Installation kann man das Programm sofort benutzen:

mc

Man kann den Midnight Commander auch mit erweiterten Rechten starten:

sudo mc

Aber Vorsicht! Hier hat man sozusagen die Allmacht und kann viel kaputt machen.

SymbolUpdate

Die nachfolgende Anleitung beschreibt den speziellen Fall, bei dem eine Matrixuhr im Web-Modul-Betrieb läuft und ein Update von der vorherigen Software v3.10 auf die aktuelle v4.00 erfolgen soll. Dazu muss zuerst das Web-Modul auf den Softwarestand v4.00 gebracht werden. Anschließend wird das aktuelle Software-Paket für die Matrixuhr geladen und entpackt:

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

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

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

Wichtig für eine neue Funktion ist noch ein Zusatzmodul, welches mit folgendem Kommando installiert wird:

sudo cpan install LWP::Simple

Für die Wetterdatenfunktion müssen nun 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

Im nächsten Schritt stoppen wir einen Systemdienst und deaktivieren diesen auch, da er nach einem veralteten Verfahren eingerichtet wurde:

sudo service matrixuhr stop
sudo update-rc.d matrixuhr remove
sudo rm /etc/init.d/matrixuhr

Nun kopieren wir die aktuellen Dateien an die richtige Stelle und starten 2 Systemdienste:

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

Jetzt fehlt nur noch eine HTML-Datei:

cp matrixuhr-files/www/matrix.php /var/www/html

Damit ist das Update abgeschlossen.

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 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 Pixeln verwendet, welche Platz für ungefähr 12 Zeichen bietet.

Anzeige 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 Ist die Matrixuhr mit dem Sensor- oder Web-Modul verbunden oder mit einem internen Raspberry Pi ausgestattet, dann lassen 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 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 Weiterhin ermöglicht eine Datenverbindung zum Web-Modul oder ein interner Raspberry Pi die Anzeige von Wetterinformationen des Wetterdienstes OpenWeatherMap. Diese werden wie Sensordaten behandelt und in den Wechsel-Rhythmus eingefügt. Neben einem Wettersymbol und einem Symbol für die Windrichtung stehen Werte wie Temperatur, Luftfeuchtigkeit, Luftdruck, Windgeschwindigkeit, Böengeschwindigkeit und Wolkendichte zur Verfügung. Außerdem kann die aktuelle Wetterlage in Textform ausgegeben werden, z.B. Leicht bewölkt.

Anzeige Die Matrixuhr kann natürlich auch Alarme des Temperatur-Messsystems anzeigen, sofern die Uhr mit dem Sensor- oder dem Web-Modul verbunden ist. 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 einen anderen Zeichensatz mit nur 8 Pixeln Höhe angezeigt und das schafft Platz für 2 Textzeilen mit jeweils 11 Pixeln 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 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 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 Die Matrixuhr verwendet noch eine weitere 3-zeilige Anzeige für das Einstellungs-Menü, welches im folgenden Abschnitt beschrieben wird. Hier erscheint auf der zweiten Zeile linksbündig die gewählte Einstellung und auf der dritten Zeile rechtsbündig der gerade aktuelle Status oder Wert.

Wie man auf den Bildern erkennen kann, verwendet die Matrixuhr (bis auf eine Ausnahme) 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 und separaten Kalendertag (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ü)

Die einzige Ausnahme ist das Wettersymbol - hier werden feste Farben verwendet. 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.

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 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 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 angekommen ist. Ist man mit der Einstellung zufrieden, dann kann man durch einen kurzen Druck auf den Taster Menü zur nächsten Einstellung gehen.

Anzeige Einstellung Datum-Farbe: Über diese Einstellung 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.

Anzeige Einstellung Alarm-Farbe: Diese Einstellung beeinflusst die Farbe von Alarmmeldungen und der Textnachricht. Die Voreinstellung ist auch hier der „Zufall“. Eine Änderung der Alarm-Farbe ist hier außer bei den Farbfeldern auch beim Pfeilsymbol zu sehen. Mit einem kurzen Druck auf den Taster Menü gelangt man zur nächsten Einstellung. Das gilt übrigens für alle weiteren Einstellungen ebenso und wird deshalb nicht mehr erwähnt.

Anzeige 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 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 Einstellung Helligkeit Min (Minimalwert für die Helligkeit): 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 abzulesen ist. 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. Der Wert kann durch Drücken des Tasters Ändern um eine Stufe erhöht werden, nach dem Erreichen des Endwertes 10 wird dann wieder bei 1 begonnen. In dieser Einstellung kann man den Taster Ändern auch lang drücken, dann erfolgt eine schnelle Werteänderung.

Anzeige Einstellung Helligkeit Max (Maximalwert für die Helligkeit): 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 kann man die Helligkeit etwas reduzieren. Auch bei dieser Einstellung ist eine schnelle Werteänderung durch langes Drücken des Tasters Ändern möglich. 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. Ganz perfekt wird man es nicht hinbekommen, da sich optische Bauelemente alles andere als linear verhalten.

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

Anzeige 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. Nach Umstellung auf die Einstellung aus arbeitet die Wechselanzeige ohne Datum.

Anzeige 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. Nach Umstellung auf die Einstellung aus arbeitet die Wechselanzeige ohne Wochentag.

Anzeige 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 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 mindestens einmal pro Sekunde aufleuchten.

Anzeige Einstellung Feste Sync-Z (Feste Synchronisierungs-Zeit): Die Voreinstellung aus bewirkt eine ständige DCF77-Synchronisierung im Hintergrund. Leider werden durch einige Komponenten der Uhr (hauptsächlich das Matrix-Display) so viele Störsignale erzeugt, dass im laufenden Betrieb keine DCF77-Synchronisierung möglich ist. Für diesem Fall kann man die Einstellung auf ein ändern. Es wird auch weiterhin ständig eine Synchronisierung im Hintergrund versucht, zusätzlich aber zu einer festen Uhrzeit und 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.

Anzeige 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. Einstellbar ist jede Stunde im Bereich von 0-23 und es ist hier möglich, die Werteänderung durch einen langen Tastendruck von Ändern zu beschleunigen.

Anzeige 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 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
Conrad 641138aus/ein
(abhängig vom benutzten Ausgang)
ein
ELV 091610ausein

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

Anzeige 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 Einstellung Sound von (Beginnzeit der akustischen Signalisierung): Mit dieser Einstellung legt man den Beginn eines Zeitfensters fest, in dem akustische Signale erzeugt werden sollen. Die Voreinstellung ist 8, also 08:00 Uhr. Bei dieser Einstellung ist es möglich, die Werteänderung durch einen langen Tastendruck von Ändern zu beschleunigen.

Anzeige Einstellung Sound bis (Endezeit der akustischen Signalisierung): Diese Einstellung legt das Ende des Zeitfensters fest, in dem akustische Signale erzeugt werden sollen. Die Voreinstellung ist 22, also 22:00 Uhr. Damit der Stundengong noch sicher ausgelöst wird, verlängert die Uhr das Zeitfenster um eine weitere Minute, das wirkliche Ende ist also in diesem Beispiel erst 22:01 Uhr. Auch bei dieser Einstellung ist es möglich, die Werteänderung durch einen langen Tastendruck von Ändern zu beschleunigen.

Hinweis: Es ist auch möglich, ein Zeitfenster in der Nacht einzustellen, also z.B. mit 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 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. Auch bei dieser Einstellung kann die beschleunigte Einstellung durch einen langen Tastendruck auf Ändern verwendet werden.

Anzeige Einstellung Sensorfilter: Diese Einstellung ist nur bei einer Datenverbindung zum Sensormodul relevant. In der Voreinstellung aus werden alle vom Sensormodul gelieferten Sensorwerte 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 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 Einstellungen durchgeführt werden.

Anzeige 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. Hier kommt man übrigens durch einen langen Druck auf Ändern schneller zur gewünschten Sensornummer. Die weiteren Einstellungen Sensornum. 4 bis Sensornum. 8 bleiben bei diesem Beispiel auf der Vorgabe aus. Damit sind Reihenfolge und anzuzeigende Sensornummern festgelegt.

Anzeige 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 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 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 folgenden 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 Das letzte Symbol ist das so genannte Endezeichen. Dieses wird immer dann benötigt, wenn der Name weniger als 5 Zeichen lang 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 Einstellung Alarme (Alarme vom Sensormodul): In dieser Einstellung kann man die 4 Alarme des Sensormoduls aktivieren. Dies sollte man nur dann tun, wenn eine 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 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. Es kann passieren, dass der Name schon bei der Eingabe über den Bildrand geht. Die Software sorgt in diesem Fall dafür, dass der gerade bearbeitete Textteil komplett sichtbar ist.

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

Anzeige 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 Einstellung Tag (Kalendertag): Diese Einstellung ermöglicht das manuelle Setzen des Kalendertages, obwohl durch die automatische Synchronisierung der Matrixuhr durch das DCF77-Signal oder über das Internet keine Notwendigkeit besteht. Hier besteht wieder die Möglichkeit, den Tag durch langes Drücken von Ändern schnell zu erhöhen.

Anzeige Einstellung Monat: Mit dieser Einstellung lässt sich der Monat setzen und auch hier ist eine schnelle Werteänderung möglich.

Anzeige Einstellung Jahr: Mit dieser Einstellung wird das Jahr im Bereich von 2018 bis 2099 gesetzt. Auch hier ist mit einem langen Tastendruck auf Ändern eine schnelle Werteänderung möglich.

Anzeige Einstellung Stunde: Diese Einstellung setzt den Stundenwert. Jede Änderung ist sofort in der oberen Zeile sichtbar und auch hier ist eine schnelle Werteänderung möglich.

Anzeige Einstellung Minute: Mit dieser Einstellung können die Minuten gesetzt werden. Auch hier ist jede Änderung sofort in der oberen Zeile sichtbar und eine schnelle Werteänderung ist ebenfalls möglich.

Anzeige 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 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 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 der nächste Sound etwas auf sich warten lässt.

Anzeige 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 Funktion Mute: Im normalen Anzeigebetrieb sowie auch während der Anzeige von Alarmen oder einer Textmeldung 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 Funktion Quittieren: Diese Funktion ist im Zusammenhang mit den Alarmen des Temperatur-Messsystems wichtig. Hiermit lassen sich unterstrichene (inaktive) Alarme löschen. Für diese Funktion ist der Taster 3 bzw. die Sensorfläche Quittieren zuständig. Für eine optische Rückmeldung sorgt eine Animation, die auf einem Bild leider nicht darstellbar ist: Es erscheint zunächst die gleiche Linie wie bei Mute unter der Uhrzeit. An beiden Enden werden dann in schneller Folge die Pixel wieder 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 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 30 Sekunden Zeit geben, anschließend kann man die Matrixuhr ausschalten.

Anzeige 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, werden keine akustischen Alarme ausgegeben. Die einzige Ausnahme ist die Einstellung Sound-Test, diese funktioniert auch ohne Synchronisierung.

Anzeige 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 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 kommen zuerst an die Reihe. Hier sind einige Einstellungen erforderlich, ohne die andere Funktionen nicht nutzbar sind.

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 zur Matrixuhr gesendet. Der genaue Zeitpunkt ist allerdings nicht definiert. Die erste Zeit-Synchronisierung erfolgt immer etwa eine Minute nach dem Einschalten der Matrixuhr und weitere Synchronisierungen folgen dann im angegebenen Intervall. Das gleiche passiert übrigens auch bei jeder Konfigurationsänderung. Klickt man also nach der Aktivierung der Zeit-Synchronisierung auf den Button Button, dann erscheint der Hinweis  gespeichert  neben dem Button. Außerdem wird jetzt der Matrixuhr-Dienst neu gestartet, nach einer Minute die erste Zeit-Synchronisierung durchgeführt und weitere 60 Minuten später die nächste usw.

Im nächsten Block kann die Verbindung zum MQTT-Server aktiviert werden. Der MQTT-Server befindet sich auf dem Web-Modul und über diese Verbindung kann die Matrixuhr Sensordaten und Alarminformationen vom Temperatur-Messsystem empfangen. Es spielt übrigens keine Rolle, ob der Web-Modul-Betrieb oder der Raspberry-Pi-Betrieb genutzt wird - die Übermittlung der Daten erfolgt immer über den MQTT-Server. Wichtig: Die Aktivierung der MQTT-Verbindung sollte nur dann erfolgen, wenn der Server auch wirklich vorhanden ist. Anderenfalls wird alle 10 Sekunden versucht, eine Verbindung herzustellen und das führt zu einer höheren Systemlast und auch zu vielen Fehlermeldungen im Log-Bereich des Linux-Systems. Die nachfolgenden Parameter IP-Adresse und IP-Port können im Web-Modul-Betrieb übernommen werden. 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.

Soll der Wetterdatenempfang genutzt werden, dann sind Einstellungen im nächsten Block notwendig. Die Matrixuhr kommuniziert dann ungefähr einmal pro Minute mit den Servern von OpenWeatherMap und holt einen Datensatz mit Wetterinformationen vom gewünschten Ort. Damit das funktioniert, ist zunächst eine Anmeldung bei OpenWeatherMap erforderlich. Der Link neben dem Eingabefeld APPID führt direkt zur entsprechenden Seite. Nach der Anmeldung wählt man die kostenlose Option, die für unsere Zwecke vollkommen ausreichend ist. Man erhält dann 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 gefunden wird. Im positiven Fall trägt man diesen dann in das Eingabefeld Ort ein. Wird der Ort nicht gefunden, dann bleibt das Eingabefeld für den Ort leer und man muss sich die GPS-Koordinaten für seinen Ort organisieren. Damit werden dann die beiden Eingabefelder für Breitengrad und Längengrad befüllt. Mit dem letzten Auswahlfeld Sprache kann man die Sprache für die Wetterlage festlegen (Details folgen später). Die Kommunikation mit OpenWeatherMap erfolgt übrigens verschlüsselt über https.

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 Button 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 2 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 die Geburtstagsliste verwaltet werden. Die Geburtstagsliste wird zyklisch geprüft und werden Einträge gefunden, die zum aktuellen Datum passen, denn 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 sind 9 Zeichen, dann bleibt noch Platz für ein Leerzeichen und ein zweistelliges Alter. Hier sollte man einfach ein wenig experimentieren. Die Anzahl der Einträge ist übrigens nicht begrenzt. Nach dem Speichern der Geburtstage über den Button Button 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.

Bereich Sensorliste 1 (Sensoren vom Temperatur-Messsystem)

Matrixuhr Sensorliste 1

Soll die Matrixuhr Sensordaten von einem Web-Modul empfangen, dann ist dieser Bereich wichtig. Eingaben sind aber nur dann sinnvoll, wenn im Bereich System-Einstellungen die MQTT-Funktion aktiviert wurde. Alle Sensoren, die von der Matrixuhr angezeigt oder überwacht werden sollen, müssen in dieser Liste stehen. Hier muss darauf geachtet werden, dass das MQTT Topic jedes Sensors exakt mit der Einstellung des Web-Moduls übereinstimmt. Der sicherste Weg ist, die Konfigurationsseite des Web-Moduls zu öffnen und die gewünschten Einträge nacheinander zu kopieren. Auf der linken Seite wird jedem Eintrag automatisch ein Buchstabe (Name) zugeordnet und über diesen kann der Sensorwert in den folgenden Bereichen Sensoren und Alarme verwendet werden. Die Liste kann maximal 12 Sensoren aufnehmen, die dann unter den Namen A bis L zur Verfügung stehen. Über den Button Button wird nach Eingabe einer Zeile die Liste gespeichert und neben dem Button der entsprechende Hinweis  gespeichert  angezeigt. Weiterhin erscheint eine neue Leerzeile zur Eingabe eines weiteren Sensors, sofern das Maximum von 12 noch nicht erreicht ist. 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 Sensorliste 2 (Sensoren vom Wetterdienst)

Matrixuhr Sensorliste 2

In diesem Bereich sind bis auf eine Ausnahme keine Einstellungen erforderlich. Die Sensorliste 2 dient hauptsächlich zur Information und gibt einen Überblick über weitere Sensoren, deren Werte von der Matrixuhr angezeigt oder überwacht werden können. Das betrifft überwiegend Wetterdaten, die unter den Namen M bis X zur Verfügung stehen. Außerdem gibt es noch den Namen Z, der dem Wert des 1-Wire-Sensors am Raspberry Pi entspricht. Letzterer kann auf Wunsch mit einem Korrekturwert zwischen -5,0° und 5,0° versehen werden. Wichtig ist hier, dass das Komma als Punkt geschrieben wird. Bei einer Änderung des Korrekturwertes wird mit einem Klick auf den Button Button dieser übernommen und direkt daneben der Hinweis  gespeichert  ausgegeben.

Bereich Sensoren

Matrixuhr Sensoren

In diesem Bereich lassen sich die Sensordaten zusammenstellen, die auf der Matrixuhr dargestellt werden sollen. Alle hier eingegebenen Zeilen werden aufbereitet und nacheinander zur Matrixuhr gesendet. Die Matrixuhr gibt dann diese Zeilen zyklisch im eingestellten Wechsel-Rhythmus aus. Die einzelnen Zeilen können sehr flexibel gestaltet werden. Die folgende Tabelle beschreibt die beiden Beispieleinträge aus dem Bild und 2 weitere Beispiele:

ZeileBedeutung der ElementeAnzeigebeispielBemerkung
[W] [A]°CWettersymbol
Leerzeichen
Sensorwert A
°C
Anzeige Das Wettersymbol ist immer 24 Pixel breit (ca. 4 Zeichen).
[B]°C [C]%Sensorwert B
°C
Leerzeichen
Sensorwert C
%
Anzeige
Wind [V] [R]Wind
Leerzeichen
Windrichtungssymbol
Leerzeichen
Windgeschwindigkeit in km/h
AnzeigeDas Windrichtungssymbol ist immer 7 Pixel breit.
[X]Wetterlage in TextformAnzeige  Anzeige Die Wetterlage kann aus bis zu 4 Textteilen bestehen, die nacheinander ausgegeben werden.

Das Prinzip ist recht einfach: Der Name (Buchstabe) des gewünschten Sensorwertes wird in eckige Klammern gesetzt und in die Zeile eingetragen. Es ist möglich, mehrere Sensorwerte in einer Zeile zu verwenden und es können auch Texte hinzugefügt werden. Die verschiedenen Sensoren aus der Sensorliste 1 und Sensorliste 2 können dabei beliebig kombiniert werden. Die einzige Ausnahme ist die Wetterlage X im letzten Beispiel - diese kann man nur einzeln und ohne weitere Zusätze verwenden. Beim Zusammenstellen einer Zeile sollte man immer das Limit von 12 Zeichen für eine Matrixuhr-Zeile beachten. Man muss also überlegen, ob die aus der Liste resultierenden Daten auf die Matrixuhr passen - oder einfach ausprobieren. Es gibt noch ein spezielles Zeichen, welches man für Grenzfälle verwenden kann: Mit dem Stern (*) lässt sich ein flexibles Leerzeichen einsetzen, das die Ausgabe von Temperaturwerten optimiert. Die folgende Tabelle zeigt die Wirkung bei verschiedenen Werten:

ZeileTemperaturwertAnzeigeBemerkung
Außen*[A]°C23,5°CAnzeigeBei Werten mit einer Stelle oder zwei Stellen vor dem Komma ist noch genug Platz für ein Leerzeichen.
-9,4°CAnzeigeAuch bei negativen Werten mit einer Stelle vor dem Komma ist der Platz ausreichend.
101,6°CAnzeigeBei 3 Stellen vor dem Komma reicht der Platz nicht mehr aus und hier wird das Leerzeichen automatisch weggelassen. Da sieht nicht schön aus, aber alle Zeichen passen noch auf die Matrixuhr-Zeile.
-12,3°CAnzeigeGleiches passiert, wenn ein negativer Wert zweistellig ist.

Bei den Wetterdaten gibt es noch folgendes zu beachten: Nicht immer werden alle Werte vom Wetterdienst übermittelt. So fehlt oft die Böengeschwindigkeit und in diesem Fall wird diese auf den gleichen Wert wie die Windgeschwindigkeit gesetzt. Bei niedrigen Windgeschwindigkeiten fehlt manchmal die Windrichtung, in diesem Fall wird ein kleines Plus-Symbol anstatt des Windpfeils ausgegeben.

Generelles zu den Sensorwerten: Grundsätzlich kann man nur die Elemente aus der Sensorliste 1 oder Sensorliste 2 verwenden, für die auch Werte vorliegen. Anderenfalls erfolgt keine Ausgabe der Sensorzeile. Wenn mehrere Sensor-Elemente in einer Zeile stehen und auch nur eins davon keine Daten enthält, dann wird die gesamte Zeile nicht ausgegeben. Weiterhin haben alle Sensor- und Wetterdaten eine begrenzte Gültigkeit. Bei Sensordaten liegt diese bei 2 Minuten, bei den Wetterdaten bei einer Stunde. Fällt also beispielsweise ein Sensor des Temperatur-Messsystems aus, dann wird dessen letzter Wert noch 2 Minuten lang ausgegeben, anschließend erfolgt keine Ausgabe mehr.

Zum Schluss noch der Hinweis: Über den Button Button wird nach Eingabe einer Zeile die Liste gespeichert und neben dem Button der entsprechende Hinweis  gespeichert  angezeigt. Weiterhin erscheint eine neue Leerzeile zur Eingabe einer weiteren Sensorzeile.

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 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 Alarmen 1-4 und 5-8. Bei den Alarmen 1-4 kann hier das MQTT Topic eingegeben werden und das genau so, wie es auf dem Web-Modul definiert wurde. Die Reihenfolge der 4 Alarme muss dabei nicht mit der im Web-Modul übereinstimmen und es können auch Alarme weggelassen werden, die nicht signalisiert werden sollen. Die Konfiguration des Alarms 1 im oben stehenden Bild führt beispielsweise zu folgendem Ablauf: Wird das Garagentor geöffnet, dann wird auf der Matrixuhr der Klang 1 abgespielt und der Text Garagentor angezeigt. 2 Minuten nach dem Schließen des Tors wird der Alarm automatisch auf der Matrixuhr gelöscht. Beim Alarm 2 gibt es die Besonderheit, dass die Matrixuhr nach dem Schließen der Briefkasten-Klappe weiterhin den Text Briefkasten anzeigt. Dieser muss dann an der Uhr quittiert 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. Hier kann z.B. ein Sensorwert überwacht werden und bei dessen Über- oder Unterschreitung lässt sich ein Alarm an der Matrixuhr auslösen. Es können alle verfügbaren Werte aus der Sensorliste 1 und Sensorliste 2 mit Ausnahme von V, W und X verwendet werden. Die folgende Tabelle beschreibt das Beispiel von Alarm 5 aus dem Bild und 3 weitere Beispiele:

BedingungBeschreibung
[B]<18Ein Alarm wird ausgelöst, wenn die Temperatur im Wohnzimmer (Sensor B) eine Temperatur von 18°C unterschreitet.
[A]>30Ein Alarm wird ausgelöst, wenn die Außentemperatur (Sensor A) eine Temperatur von 30°C überschreitet.
[A]<[B]Ein Alarm wird ausgelöst, wenn die Außentemperatur kleiner als die Temperatur im Wohnzimmer ist.
[R]>70Ein Alarm wird ausgelöst, wenn die Windgeschwindigkeit (Sensor R) 70 km/h überschreitet (Sturmwarnung).

Man hat also die Möglichkeit, einen Sensorwert mit einem Festwert zu vergleichen oder 2 Sensorwerte miteinander. Auch bei der Bedingung wird immer die Gültigkeit der Sensorwerte geprüft (2 Minuten bei den Sensoren des Temperatur-Messsystems und 1 Stunde bei den Wetterdaten). Ist ein Sensorwert nicht mehr gültig, dann wird die Bedingung auch nicht geprüft und auch kein Alarm ausgelöst. Und auch hier noch der Hinweis: Über den Button Button werden alle Eingaben gespeichert und neben dem Button der entsprechende 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 bei zu 20 Sekunden dauern, bis das Ergebnis der Konfigurationsänderung sichtbar wird.

Symbol Datenkommunikation

Dieser Abschnitt beschäftigt sich mit den Kopplungsmöglichkeiten der Matrixuhr und dem Temperatur-Messsystem. Dafür gibt es 3 Möglichkeiten:

Sensormodul-Betrieb
Bei dieser Betriebsart ist eine RS-232-Verbindung zum Sensormodul erforderlich. Die Uhr wird damit eine vollwertige Komponente des Temperatur-Messsystems und verhält sich wie eines der Anzeigemodule und kann auch parallel zu weiteren Modulen betrieben werden. Es besteht die Möglichkeit, alle oder maximal 8 ausgewählte Sensorwerte anzuzeigen und auch die 4 Alarme lassen sich überwachen. Die Anzeige der Sensorwerte und Alarme ist an der Uhr konfigurierbar: Es können Sensornamen mit einer Länge von bis zu 5 Zeichen und Alarmnamen mit einer Länge von bis zu 12 Zeichen vergeben werden.

Web-Modul-Betrieb
Diese Betriebsart erfordert eine zusätzliche RS-232-Verbindung zwischen Web-Modul und Matrixuhr. Das Web-Modul muss dafür mit einem RS-232-Ausgang ausgerüstet sein, welcher speziell aufbereitete Daten zur Uhr sendet. Dafür ist auch eine zusätzliche Software auf dem Web-Modul erforderlich. Alle auf dem Web-Modul notwendigen Arbeiten sind im Abschnitt Inbetriebnahme (Schritt 14) beschrieben. Diese Betriebsart bietet einen großen Komfort, da man viele Einstellungen nicht an der Uhr, sondern über ein Web-Formular erledigen kann. So lassen sich die anzuzeigenden Sensordaten relativ frei definieren, Alarmmeldungen können einem der 6 Klänge zugeordnet werden oder auch lautlos signalisieren. Auch lassen sich Alarme so einstellen, dass sie nicht quittiert werden müssen und automatisch von der Anzeige verschwinden, wenn sie nicht mehr aktiv sind. Es stehen noch 4 weitere Alarme zur Verfügung, mit denen man Sensorwerte überwachen und sogar vergleichen kann. Geburtstage können in nahezu beliebige Anzahl verwaltet werden, aktive Geburtstage erscheinen dabei im normalen Anzeigezyklus der Uhr. Außerdem ist es möglich, eine Nachricht von bis zu 100 Zeichen auf dem Web-Formular zu hinterlassen, die dann als Laufschrift auf der Uhr erscheint. Ein DCF77-Empfänger ist bei dieser Betriebsart nicht erforderlich, die Uhr wird zyklisch vom Web-Modul synchronisiert.

Raspberry-Pi-Betrieb
Diese Betriebart ist funktionell mit dem Web-Modul-Betrieb identisch und bietet auch die gleichen Konfigurationsmöglichkeiten. Hier wird der Raspberry Pi direkt in die Matrixuhr eingebaut und die Leitung zwischen dem Raspberry Pi und der Uhr auf wenige Zentimeter verkürzt. Hier werden die gleichen speziell aufbereiteten Daten übertragen wie beim Web-Modul-Betrieb. Eine Verbindung zu einem Web-Modul ist über das Netzwerk-Protokoll MQTT möglich, aber nicht notwendig.

Im folgenden Text wird auf die speziellen Einstellungen der Matrixuhr in den 3 Betriebsarten eingegangen sowie die übertragenen Datenpakete beschrieben.

Symbol Sensormodul-Betrieb

Für diese Betriebsart sind neben den allgemeinen Einstellungen 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 dem Taster bzw. 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

Für diese Betriebsarten sind folgende beiden 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 Sensorwerte 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 Sensorwerte behandelt. Die Ausgabe der Geburtstage erfolgt dabei direkt nach den Sensorwerten, so dass ein Anzeigezyklus ungefähr so aussieht:

DatumWochentagSensor 1Sensor 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 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 dritten Zeile zeigt dann die Nachricht als Laufschrift an. Eventuell anstehende Alarme werden dabei zurückgestellt und erst dann angezeigt, wenn die Textnachricht mit dem Taster bzw. der Sensorfläche Quittieren gelöscht wurde.

Bei jedem Empfang eines Datenpaketes (Sensorwert, Geburtstag oder Alarm) wird ein Timeout-Zähler von 2 Minuten gestartet. Beim Ausfall der Datenverbindung werden somit nach 2 Minuten keine Sensorwerte, 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. ASCII-Zeichen bleiben zwar erhalten, aber Umlaute und Sonderzeichen werden durch 2 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:

• Sensorwert

nn:vAbschluss durch <LF> oder <CR>

nn Sensorkennung im Bereich 01-31
:Trennzeichen
vSensorwert (maximal 12 Zeichen)

Mit diesem Datentyp wird ein Sensorwert oder ein Geburtstag übermittelt. Die Sensorkennung nn liegt im Bereich 01-31 und hat keine Beziehung zu einer realen Sensornummer. Mit der Sensorkennung 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 Sensorkennung auch gleichzeitig die Reihenfolge festgelegt. Das Trennzeichen ist immer ein Doppelpunkt und der Sensorwert 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 ist in der Lage, Wettersymbole anzuzeigen. Diese sind in der Software des Mikrocontrollers gespeichert und können über eine spezielle Kodierung im Sensorwert-Datensatz zur Anzeige gebracht werden. Diese Wettersymbole haben im Gegensatz zu den anderen Elementen auf der Matrixuhr feste Farben, die nicht geändert werden können. Die folgende Tabelle zeigt die Kodierung und die resultierenden Wettersymbole:

KodierungTag-SymbolKodierungNacht-SymbolBedeutung
$ASymbol$BSymbolWolkenlos
$CSymbol$DSymbolWenig bewölkt
$ESymbol$FSymbolLeicht bewölkt
$GSymbol$HSymbolBewölkt
$ISymbol$JSymbolRegenschauer
$KSymbol$LSymbolRegen
$MSymbol$NSymbolGewitter
$OSymbol$PSymbolSchnee
$QSymbol$RSymbolNebel
$SSymbol$SSymbolEmpfang eines fehlerhaften Symbol-Kodes, dürfte normalerweise nicht auftreten

Weiterhin besteht die Möglichkeit, die Windrichtung anzuzeigen. Für diese Funktion sind ebenfalls Symbole in der Mikrocontroller-Software enthalten und die zur Anzeige notwendige Kodierung ist in der folgenden Tabelle aufgelistet:

KodierungSymbolBedeutung
$0SymbolWindrichtung unbestimmt
$1SymbolWind aus Richtung Süd
$2SymbolWind aus Richtung Südwest
$3SymbolWind aus Richtung West
$4SymbolWind aus Richtung Nordwest
$5SymbolWind aus Richtung Nord
$6SymbolWind aus Richtung Nordost
$7SymbolWind aus Richtung Ost
$8SymbolWind aus Richtung Südost

• 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 folgenden 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>

TM feste Kennung
:Trennzeichen
yyyymmddDatum in der Reihenfolge Jahr Monat Tag
Leerzeichen
hh:mm:ss.ccUhrzeit in der Reihenfolge Stunde:Minute:Sekunde.Hundertstel
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:20180712 20:59:37.42 1   Die Uhr wird mit dem Datum 12.07.2018, der Uhrzeit 20:59:37 mit 42 Hundertstel gestellt. Außerdem ist die Sommerzeit 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 2 Bytes belegen. 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, den bereits vorhandenen Web-Server (Web-Modul des Temperatur-Messsystems) mit der Matrixuhr zu verbinden und einfach die dort verfügbaren Information 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 wieder 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“ zu 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 verwenden können.