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 Temperaturmesssystem, Geburtstage sowie eine Textnachricht als Laufschrift. Welche Daten angezeigt werden, 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 Temperaturmesssystem: 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 Temperaturmesssystems: In diesem Modus können neben den Sensordaten und Alarmen des Messsystems nahezu beliebig viele Geburtstage verwaltet und weitere 4 Alarme (z.B. für Temperaturüberwachungen) definiert werden. Die Uhr benötigt hier keinen DCF77-Empfänger und kann vom Web-Modul synchronisiert werden. Außerdem ist es möglich, eine Textnachricht auf dem Web-Server zu hinterlassen, die dann als Laufschrift auf der Uhr erscheint.

Letzte Bearbeitung: 25.08.2015

Symbol Downloads

Schaltplan matrixuhr-sch.pdf
Stückliste mit Empfehlungen zur Bauteilbestellung matrixuhr-stkl.htm
Software für ATmega1284P mit komplettem Quelltext in C matrixuhr-atmega1284p-v100.zip vom 23.08.2015
Sound-Paket mit 6 Klängen für den MP3-Player der Matrixuhrmatrixuhr-sounds.zip

Symbol Inhaltsverzeichnis

Beschreibung Allgemeine Informationen über die Matrixuhr
Schaltung Beschreibung der Schaltung
Hardware Bilder und Hinweise zum Aufbau der Uhr
Software Kurze Beschreibung der Uhrensoftware
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. Alle habe die gemeinsame Eigenschaft, dass sie eigenständig arbeiten und keine Verbindung zu anderen Geräten haben. Die hier vorgestellte Matrixuhr kann natürlich ebenfalls so betrieben werden, aber sie bietet zusätzlich die Möglichkeit, über eine Verbindung zum Temperaturmesssystem zusätzliche Informationen anzuzeigen. Dazu wird die Uhr wie ein Modul des Temperaturmesssystems ü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 Datenleitung der Uhr kann auch mit dem Web-Modul verbunden werden. Damit sind weitere Informationen auf der Uhr darstellbar und es hat den Vorteil, dass man alle für die Uhr bestimmten Daten komfortabel mit einem Browser auf dem Web-Modul konfigurieren kann. Die folgende Übersicht zeigt die 3 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 Temperaturmesssystems 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)
    Das ist die komfortabelste Betriebsart. 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 Messsystems auch Geburtstage 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 auf dem Web-Modul zu hinterlassen, 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.

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

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.

Für die Verbindung zum Sensor- oder Web-Modul wird eine unidirektionale RS-232-Verbindung benötigt. Das bedeutet, dass entweder das Sensor- oder das Web-Modul als Datensender arbeitet und die Uhr nur Daten empfängt. Dafür kann entweder ein geschirmtes Kabel (Mikrofonkabel) oder z.B. auch eine Doppelader in einem vorhandenen LAN-Kabel verwendet werden. Eine Verbindung über Funk wurde nicht getestet, sollte aber mit transparenten Modulen im Bereich von 433MHz, 868MHz oder 2,4GHz möglich sein.

Eins muss ich allerdings noch erwähnen: Das Matrix-Display ist nicht in Deutschland erhältlich (Stand vom August 2015). Ich habe mein Exemplar 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 bei 118€ plus knapp 12€ Versand, bestellt habe ich dort jedoch noch nicht. Vielleicht probiert es jemand mal aus und berichtet von den Erfahrungen. Die Displays gibt es übrigens in 4 Baugrößen mit LED-Abständen von 3, 4, 5 und 6mm, ich habe hier die 5mm-Version verwendet. Auch gibt es unterschiedliche Varianten, z.B. auch in der Form mit 32x32 LEDs. Die kann man auch nehmen und dann einfach 2 Stück kaskadieren.

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 zum Einsatz. Dieses wird auf die 26-polige Pfosten-Buchsenleiste J4 aufgesteckt und enthält bereits alle wichtigen Komponenten: Mikrocontroller, microSD-Karten-Steckplatz für die Speicherung der Klänge, MP3-Player (VS1011e) und einen 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 (die man auch durch Analogschalter wie z.B. 4066 ersetzen kann). 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. Das MP3-Modul 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 das demodulierte HF-Signal direkt an einem Ausgang liefert. Dieses Signal wird am Anschluss PA6 vom Mikrocontroller gelesen und verarbeitet. Beim Pollin-Empfängers 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 festen Nachtzeit abschalten, das Netzteil jedoch nicht. Vielleicht gelingt die Nachtsynchronisierung, 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 R12, D2 und T8 sind für die Datenübertragung zuständig. Diese bilden einen einfach RS-232-Empfänger, der die vom Hohlsteckverbinder J8 kommenden Spannungspegel von bis zu ±12V auf 5V-Pegel umsetzt und außerdem das Signal 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. In meiner Planung war eine Bluetooth-Verbindung zwischen Web-Modul und Matrixuhr vorgesehen. Am Web-Modul war ein kleines USB-Dongle geplant und an der Uhr ein preiswertes Bluetooth-Modul aus Fernost. Wegen der recht großen Entfernung habe ich diese Option aber wieder verworfen und mich letztendlich für eine solide Kabelverbindung entschieden. Den Controller-Anschluss PD3 (TXD1) habe ich frei gehalten, damit ein Funkmodul angeschlossen und initialisiert werden kann.

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.

Der verbleibende 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 Temperaturmesssystem 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 wie ein Tastendruck vom Mikrocontroller ausgewertet wird.

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 Milli-Ampere, während des Abspielens können jedoch je nach eingestellter Lautstärke bis zu 500mA fließen. Insgesamt ist das Netzteil also nicht überdimensioniert, könnte aber vermutlich noch einen Raspberry Pi versorgen. Es spricht nichts dagegen, das Web-Modul direkt in die Uhr einzubauen.

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! Wer sich das nicht zutraut, sollte besser auf ein Netzteil mit einem steckbaren Stromkabel 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 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 bzw. sichtbar sind. Sie sind beim Aufbau der Controllerplatine bereits mit der Schaltung verbunden und somit nicht im Verkabelungsplan enthalten.

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.

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 hier 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. Die 10mm Dicke der inneren Befestigungselemente wurden mit Bedacht gewählt. Das ist der optimale Abstand zwischen Display-Rückseite mit aufgestecktem Flachbandkabel und der Controllerplatine.

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 wird und die aktuelle Zeit von diesem bezieht. 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 weit über 100 Bilder aufgenommen und mit verschiedenen Kameraeinstellungen experimentiert. Ihr müsst mir an dieser Stelle einfach glauben, dass die LEDs in der Realität viel heller leuchten und die Farben kräftiger sind.

Symbol Software

Dieses Kapitel ist sehr trocken und wer sich nicht für die Details interessiert, darf es gern überspringen. Für den Nachbau und den Betrieb der Uhr sind die folgenden Informationen nicht notwendig.

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

Matrix-Uhr.c enthält das Hauptprogramm
Matrix-Uhr_asm.s enthält den Assembler-Teil für die Ansteuerung des Matrix-Displays
charset.h enthält Zeichensätze für die Ziffern und die Textelemente
strings.h enthält eine Stringliste in deutscher und englischer Sprache

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. Erst jetzt beginnt der eigentliche Programmteil. Dieser besteht grundsätzlich aus 4 Blöcken: den Interrupt-Routinen, vielen Funktionen, der Initialisierung und der Hauptprogrammschleife. Das Programm beginnt mit der Initialisierung, läuft dann in der Hauptprogrammschleife und ruft dabei verschiedene Funktionen aus. Durch Ereignisse gesteuert werden dann die Interrupt-Routinen aktiv. Die Beschreibung der Programmblöcke erfolgt in der zuletzt genannten Reihenfolge, auch wenn sie im Quelltext anders angeordnet sind.

Initialisierung: Diese wird bei jedem Systemstart oder Reset 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) und den 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 ans 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: Der Matrix-Puffer 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 Nachtsynchronisierung 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 in diesem 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 gesucht 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 nächtlichen 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 (3:00 Uhr und 2 Minuten nach dem Systemstart). 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.

Funktionen: Dieser Programmteil steht im Quelltext vor dem Hauptprogramm und enthält über 30 Funktionen, die vom Hauptprogramm aufgerufen werden. 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) und eine größere Funktion zum Speichern aller Daten im EEPROM.

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 einer Kleinziffer für Sekunde und Wochentag. 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 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. Die wird benötigt, um spezielle Zeichen vom Web-Modul (welches mit UTF-8 arbeitet) 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 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, 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 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 nochmals 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 (eine hundertstel Sekunde) ü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-Routinen: Insgesamt arbeiten in der Matrixuhr 5 Interrupt-Routinen, welche im Quelltext gleich hinter den Variablen-Deklarationen abgelegt sind. 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 übermittelt: 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 4-1 (4 Bit = 16 Zeilen) gewonnen und über Bit 0 der Farbwert. Der PWM-Wert wird aus der gemessenen Helligkeit (0-70) ermittelt und für die Ausgabe-Funktion in den Bereich 255-185 umgesetzt. 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 4-1 des Multiplexzählers werden zunächst an die Bit-Positionen 3-0 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. Außerdem wird der Interrupt vom Timer2 aktiviert. Dieser Interrupt wird dann nach Ablauf des Timers über PA5 die LED-Ausgänge wieder abschalten. Eine Ausnahme sind sehr kleine PWM-Werte: Hier reicht die Auflösung von Timer2 nicht aus und die Wartezeit wird deshalb mit einer Zählschleife realisiert und im Anschluss daran erfolgt die Abschaltung der LED-Ausgänge über PA5.
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 36,5µs, das sind 23% 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 das 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 4-Sekunden-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 reagiert auf jedes empfangene Zeichen am RX von USART1 (RS-232). Alle Zeichen werden in einem 256 Byte großen Empfangspuffer abgelegt und anschließend der Schreibzeiger erhöht. Über den Vergleich des Schreibzeiger mit einem Lesezeiger kann das Hauptprogramm später feststellen, dass neue Zeichen im Puffer liegen und verarbeitet werden müssen.

Symbol Inbetriebnahme

Für die Inbetriebnahme der Matrixuhr wird die aktuelle Software v1.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 angeschlossenes 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 6.2 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 werden stattdessen die Werte für die 3 Fuse-Bit-Register erwartet und direkt geschrieben (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

Anzeige1

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.

Anzeige2

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

Anzeige2

Auch der Wochentag ist noch nicht bekannt. Die beiden Texte in der unteren Zeile wechseln übrigens alle 4 Sekunden. Wenn alles (wie hier beschrieben) funktioniert, geht es mit der Inbetriebnahme des MP3-Moduls weiter.

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

Das letzte einstellbare Element ist das Potentiometer für die Empfindlichkeit der Helligkeitsregelung. Dieses kann man zunächst in Mittelstellung bringen, die optimale Einstellung lässt sich später im laufenden Betrieb ermitteln. Damit ist die Inbetriebnahme abgeschlossen.

Symbol Bedienung

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

Anzeige4

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

Anzeige5

Auf der unteren Zeile werden im normalen Betrieb immer das Datum und die Uhrzeit im Wechsel angezeigt. Die Wechselzeit ist fest auf 4 Sekunden eingestellt und erfolgt immer zur Sekunde 2, 6, 10, 14 usw.

Anzeige6

Ist die Matrixuhr mit dem Sensor- oder dem Web-Modul verbunden, dann lassen auch die Sensorwerte des Temperaturmesssystems darstellen. Diese Werte erscheinen ebenfalls im 4-Sekunden-Takt nach dem Datum und dem Wochentag und nach der Anzeige des letzten Sensorwertes beginnt der Zyklus wieder mit dem Datum.

Anzeige7

Mit einer Datenverbindung zum Web-Modul lassen sich auch Geburtstage anzeigen. Diese fügen sich ebenfalls in den 4-Sekunden-Takt 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.

Anzeige8

Die Matrixuhr kann natürlich auch Alarme des Temperaturmesssystems 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.

Anzeige9

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 4-Sekunden-Rhythmus wie die anderen Informationen gewechselt. Mit der Quittierungsfunktion, deren Beschreibung weiter unten folgt, lassen sich inaktive Alarme wieder löschen.

Anzeige10

Bei der Kopplung der Matrixuhr mit dem Web-Modul steht eine besondere Funktion zur Verfügung: Auf dem Web-Modul 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.

Anzeige11

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 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 separater Kalendertag) 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ü)

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)
1MenüAufruf des Einstellungs-MenüsZur nächsten Einstellung wechselnEinstellungs-Menü vorzeitig beenden
2ÄndernMute-Funktion ein-/ausschaltenWert schrittweise ändernWert schnell ändern
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, so wie in der ersten Einstellung:

Anzeige12

Einstellung Zeit-Farbe: Mit dieser Einstellung lässt sich die Farbe der Stunden, Minuten und Sekunden festlegen. Die Werte-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.

Anzeige13

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.

Anzeige14

Einstellung Datum-Farbe: Über diese Einstellung kann die Farbe von Datum, Wochentag, Sensorwerten, Geburtstagen und Kalendertag (unter den Sekunden) geändert werden. Auch hier zeigt das Pfeilsysmbol auf die Voreinstellung „Zufall“. Die Änderung der Einstellung erfolgt in der gleichen Art und Weise wie bei der Einstellung 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.

Anzeige15

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 im weiteren Text nicht mehr erwähnt.

Anzeige16

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 weißen leeren Rahmen). Wählt man hier eine Farbe aus, dann wird diese künftig vom Zufallsgenerator nicht mehr vergeben. Ich habe diese Funktion eingebaut, um die Farbe Blau auszublenden. Informationen in dieser Farbe sind insbesondere nachts nur schwer zu lesen.

Anzeige17

Einstellung Helligkeit Min (Minimalwert für die Helligkeit): Diese Einstellung legt den minimalen Helligkeitswert des Matrix-Displays fest. Der voreingestellte Wert 0 bedeutet, dass das Display bei Dunkelheit auf die niedrigste Helligkeitsstufe gesetzt wird. Das ist eigentlich die optimale Einstellung und sorgt dafür, dass bei Nacht das Display weder blendet, noch den Raum unnütz beleuchtet. 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 schrittweise bis auf 20 erhöht werden, nach dem Erreichen des Endwertes wird dann wieder bei 0 begonnen. In dieser Einstellung kann man den Taster Ändern auch lang drücken, dann erfolgt eine schnelle Werteänderung.

Anzeige18

Einstellung Helligkeit Max (Maximalwert für die Helligkeit): Diese Einstellung legt den maximalen Helligkeitswert des Matrix-Displays fest. Das Display leuchtet bei hoher Umgebungshelligkeit ebenfalls sehr hell und in Wohnräumen ist der voreingestellte Wert 70 oft zu hoch. Hier kann man die Helligkeit etwas reduzieren, damit das Display nicht blendet. Der Wert kann im Bereich von 40 bis 70 eingestellt werden. Auch in dieser Einstellung kann man den Taster Ändern für eine schnelle Werteänderung lang drücken.

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.

Anzeige19

Einstellung Test-LED: Mit dieser Einstellung kann die LED D3 für Testfunktionen aktiviert werden. Durch Druck auf Ändern wird zunächst die Test-Funktion DCF aktiviert. Damit werden die empfangenen DCF77-Impulse an die LED weitergegeben. Bei ordnungsgemäßer Funktion des DCF77-Empfängers sollte die LED im Sekundentakt kurz aufleuchten. Nochmaliges Drücken auf Ändern schaltet in die Test-Funktion RS-232. Diese bewirkt, dass jedes empfangene Datenpaket die LED kurz aufleuchten lässt. Bei korrekter Verbindung sollte die LED (abhängig von der Einstellung des Sensormoduls) mindestens einmal pro Sekunde aufleuchten. Ein weiter Druck auf Ändern schaltet die Test-LED wieder aus.

Anzeige20

Einstellung DCF-Synchr. (Display-Abschaltung zur DCF-Synchronisierung): Um Missverständnisse zu vermeiden: Diese Einstellung schaltet nicht den DCF77-Empfang ein oder aus - dieser ist permanent eingeschaltet. Hier geht es um eine spezielle Einstellung zur Verbesserung der DCF-Synchronisierung. Übernimmt man die Voreinstellung aus, dann läuft die Uhr normal und versucht im Hintergrund das DCF-Signal zu empfangen und zu dekodieren. Leider stört das Display durch den Multiplex- und PWM-Betrieb enorm und wenn man diese Einstellung auf ein setzt, wird das Display einmalig 2 Minuten nach dem Systemstart und außerdem täglich um 3:00 Uhr für maximal 30 Minuten ausgeschaltet, um Störungen durch das Display zu reduzieren.

Anzeige21

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 benötigt, kann man die Test-LED aktivieren und das Signal beobachten. Die LED sollte dann im Sekundentakt kurz aufleuchten. Ist die LED hingegen eher eingeschaltet und scheint 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.

Anzeige22

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

Anzeige23

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

Anzeige24

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

Anzeige25

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.

Anzeige26

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.

Anzeige27

Einstellung Roll-Geschw. (Roll-Geschwindigkeit der Laufschrift): Diese Einstellung ist nur bei einer Datenverbindung zum Web-Modul 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.

Anzeige28

Einstellung Sensorfilter: Diese Einstellung ist nur bei einer Datenverbindung zum Sensormodul relevant. In der Voreinstellung aus werden alle vom Sensormodul gelieferten Sensorwerte in einem 4-Sekunden-Zyklus gemeinsam mit dem Datum und dem Wochentag angezeigt. Die beiden folgenden Tabellen zeigen anschaulich die Funktion dieser Einstellung:

ZyklusAnzeige
013.08.2015
4sDonnerstag
8sS01: 23.5°C
12sS02: 14.2°C
16sS25: 22.9°C
20sS28: 984hPa
24sS29: 47%

Tabelle 1 (Sensorfilter aus)

Ein konstruiertes Beispiel mit 2 Temperatursensoren, einem Luftdrucksensor und einem Luftfeuchtigkeitssensor kann einen Anzeigezyklus wie in der Tabelle links erzeugen. Man sieht, dass die Sensortypen richtig erkannt werden und automatisch die entsprechende Einheit ergänzt wird. Allerdings ist der Name „S01“ nicht gerade praktisch und oft braucht man auch nicht alle Sensorwerte auf der Matrixuhr. Aus diesem Grund ist die Einstellung Sensorfilter aus eher für Diagnose-Zwecke geeignet.

ZyklusAnzeige
013.08.2015
4sDonnerstag
8sAußen 14.2°C
12sInnen 23.5°C
16sInnen 47%

Tabelle 2 (Sensorfilter ein)

Diese Einstellung erlaubt mehr Gestaltungsmöglichkeiten. Mit der gleichen Sensor-Konfiguration wie oben lässt sich eine Anzeige wie in der nebenstehenden Tabelle erzeugen. Es ist 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. Zur Konfiguration des Sensorfilters dienen die 16 folgenden Einstellungen.

Anzeige29

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

Anzeige30

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.

Anzeige31

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 Zeichen und die Ziffern 0-9. Durch langes Drücken auf Ändern kann man das gewünschte Zeichen schneller erreichen.

Anzeige32

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äöüß∎

Anzeige33

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.

Anzeige34

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. Während des Einschaltens der Alarme wird der aktuelle Status als Ruhezustand angenommen und gespeichert. Anschließend wird jede Abweichung von diesem Zustand als Alarm gemeldet.

Anzeige35

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.

Anzeige36

Einstellung Tag (Kalendertag): Diese Einstellung ermöglicht das manuelle Setzen des Kalendertages, obwohl durch die automatische Synchronisierung der Matrixuhr durch das DCF77-Signal oder das Web-Modul keine Notwendigkeit besteht. Der Tag kann (wie viele andere Einstellungen auch) durch kurzes Drücken von Ändern schrittweise oder durch langes Drücken schnell erhöht werden.

Anzeige37

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

Anzeige38

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

Anzeige39

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.

Anzeige40

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.

Anzeige41

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.

Anzeige42

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.

Anzeige43

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.

Anzeige11

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

Anzeige44

Funktion Mute: Im normalen Anzeigebetrieb sowie auch während der Anzeige von Alarmen oder einer Textmeldung kann 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.

Anzeige45

Funktion Quittieren: Diese Funktion ist im Zusammenhang mit den Alarmen des Temperaturmesssystems wichtig. Hiermit lassen sich nicht mehr aktive Alarme, die auf der Anzeige unterstrichen dargestellt werden, 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.

Anzeige02

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 verbunden, dann erfolgt irgendwann eine Synchronisierung und der Hinweis verschwindet wieder. Alternativ kann man die Zeit auch manuell eingeben. In der 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.

Anzeige46

Warnhinweis Synchronisierungsausfall: Dieser Hinweis erscheint, wenn die Uhr Zeitinformationen vom DCF77-Signal oder vom Web-Modul 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 vorhanden sind. Es ist also nicht erforderlich, die Uhr jeden Tag zu stellen :-)

Symbol Datenkommunikation

Dieser Abschnitt beschäftigt sich mit den Kopplungsmöglichkeiten der Matrixuhr und dem Temperaturmesssystem. Dafür gibt 2 Möglichkeiten:

Sensormodul-Betrieb
Bei dieser Betriebsart ist eine RS-232-Verbindung zum Sensormodul erforderlich. Die Uhr wird damit eine vollwertige Komponente des Temperaturmesssystems 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 in der Beschreibung des Web-Moduls (Abschnitt Hardware und Konfiguration der Matrixuhr) beschrieben. Das ist zwar hoher Aufwand, bietet aber einen großen Komfort, da man viele Einstellungen nicht an der Uhr, sondern über ein Formular im Web-Modul 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-Modul zu hinterlassen, die dann als Laufschrift auf der Uhr erscheint. Ein DCF77-Empfänger ist bei dieser Betriebsart nicht erforderlich, die Uhr wird stündlich direkt vom Web-Modul synchronisiert.

Im folgenden Text wird auf die speziellen Einstellungen der Matrixuhr in den beiden 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 für 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 Temperaturmesssystems 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 4-Sekunden-Anzeigezyklus 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 4-Sekunden-Takt 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 Temperaturmesssystem 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

Für diese Betriebsart sind nur 2 Einstellungen wichtig. Alle Daten, die vom Web-Modul übermittelt werden sollen (Sensorwerte, Geburtstage, Alarme, Uhrzeit, Textnachricht) werden komplett im Web-Modul konfiguriert und aufbereitet.

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

Besonderheiten

Die empfangenen Sensorwerte werden in den 4-Sekunden-Anzeigezyklus direkt nach dem Datum und dem Wochentag eingefügt. Weiterhin lassen sich auch Geburtstage im Web-Modul 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-Betrieb schaltet die Anzeige bei Alarmmeldungen in den 3-zeiligen Alarmmodus um und in der unteren Zeile erscheinen dann die Alarme, welche ebenfalls im 4-Sekunden-Takt 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 Temperaturmesssystems können weitere 4 Alarme zur Überwachung von Sensorwerten definiert werden und auch diese reihen sich dann in den 4-Sekunden-Alarm-Zyklus 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-Modul. 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 Alarm-Farbe). Das passiert aber nur, wenn die Zeitsynchronisierung über das Web-Modul aktiviert ist und kein DCF77-Empfänger verwendet wird.

Das Web-Modul arbeitet intern 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: ÄÖÜäöüéß°.

Es ist übrigens möglich, das Web-Modul in die Uhr einzubauen und z.B. mit einem WLAN-Adapter zu betreiben. Damit hat man die Möglichkeit, Geburtstage zu verwalten, die Zeitsynchronisierung und auch die Textnachricht zu nutzen. Für den Anschluss von Sensoren müsste allerdings zusätzlich noch ein Sensormodul verbaut werden. Auch bei dieser Variante kann man die Komponenten ohne RS-232-Treiber (fast) direkt verbinden. Der Widerstand von 1kΩ ist als Schutz für die Anschlüsse des Raspberry Pi erforderlich, da dieser nur mit 3,3V arbeitet:

Sensormodul TX (IC2 Pin 3) → 1kΩ → Web-Modul RX (P1 Pin 10)
Web-Modul TX (P1 Pin 8) → 1kΩ → Matrixuhr RX (IC1 Pin 16)

Datenpakete

Die Matrixuhr wertet folgende vom Web-Modul über RS-232 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 ⋅⋅⋅

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:

A2:0                Der Alarm 2 kehrt in den Ruhezustand zurück.
A3:131Briefkasten   Der Alarm 3 wurde ausgelöst, der Text Briefkasten erscheint auf dem Display, der Sound 3 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.ccAbschluss 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

Mit diesem Datentyp wird die aktuelle Uhrzeit übermittelt. Diese wird vom Web-Modul kurz nach jeder vollen Stunde 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:20150813 17:00:02.42   Die Uhr wird mit dem Datum 13.08.2015, der Uhrzeit 17:00:02 mit 42 Hundertstel gestellt.

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 Display 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 RasPi. Leider waren die ersten Versuche nicht so erfolgreich. Prinzipiell funktionierte das Display am RasPi, 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 RasPi 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 RasPi 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 RasPi 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 irgend einer Form mit einem RasPi zusammenarbeiten. So entstand der Plan, den bereits vorhandenen Web-Server (Web-Modul des Temperaturmesssystems) 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 praktisch jeder die Uhr bauen und nutzen.

Nach einigen Monaten Entwicklungszeit läuft 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 RasPi 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-Script verwendet, welches als Systemdienst eingebunden und automatisch gestartet wird.

Ich glaube, die RGB-Matrix-Displays haben trotz der kleinen Schwächen mit den „Geisterpixeln“ (die übrigens auch bei der Adafruit-Bibliothek auftraten) bei meinen Bastelprojekten noch eine große Zukunft :-)


Startseite - Seitenanfang

Allgemeines - Projekt-Überblick - Links, Software - Neuigkeiten - „Klassiker“ - Galerie - Impressum

AVR-Programmierung - Multifunktionsuhr - Matrixuhr - Tischuhr - Wohnraumuhr - Wecker - LCD-Wecker - Zahnputzuhr - BigBen-Türgong - Fahrtregler - EPROM-Programmiergerät - Temperaturmesssystem - USB-RS232 Interface - Weihnachtsstern - Kleine Projekte