Word Clock Variante 1 - Software
Dieser Artikel soll einen Einblick in die Software, die hinter der Word Clock Variante 1 steckt, bieten. Neben einer kurzen Einführung in die Struktur und Funktionsweise der einzelnen Module, gibt es auf der entsprechenden Diskussionsseite auch die Möglichkeit Fragen zum Quellcode zu stellen bzw. Verbesserungsvorschläge einzubringen. Dies erleichtert es den Entwicklern Änderungen am Quellcode unabhängig vom mittlerweile ziemlich umfangreichen Forumsbeitrag zu diskutieren.
Modularisierung
Der Quellcode besteht im Wesentlichen aus reinem C, insofern sind entsprechende Vorkenntnisse vorteilhaft. Das Projekt ist in verschiedene Module unterteilt, die weitestgehend unabhängig voneinander sind. Die einzelnen Module lauten:
Modul | Funktion | Dateien |
---|---|---|
BASE | Grundlegende Funktionen und Makros, die von anderen Modulen benötigt werden | base.c, base.h |
COLOR_EFFECTS | Enthält Funktionen, die Farbanimationen ermöglichen | color_effects.c, color_effects.h |
DCF77 | Dekodierung und Zurverfügungstellung des DCF77 Zeitsignals | dcf77.c, dcf77.h |
DISPLAY | Verantwortlich für die Umwandlung der Zeit in ein Bitmuster, welches über die Frontplatte angezeigt werden kann | display.c, display.h, display_tix.c, display_tix.h, display_tix_patterns.h, display_wc.c, display_wc_eng.c, display_wc_eng.h, display_wc_ger3.c, display_wc_ger3.h, display_wc_ger.c, display_wc_ger.h, display_wc.h |
I2C-MASTER | Zurverfügungstellung von Funktionen, die den Umgang mit dem I2C Bus ermöglichen | i2c-master.c, i2c-master.h |
I2C-RTC | Ermöglicht den lesenden bzw. schreibenden Zugriff auf die RTC | i2c-rtc.c, i2c-rtc.h |
IRMP | Ermöglicht den Umgang mit diversen IR Fernbedienungen | irmp.c, irmp.h, irmpconfig.h |
LDR | Erfassung und Zurverfügungstellung der Helligkeit des Umgebungslichts | ldr.c, ldr.h |
MAIN | Enthält den Einstiegspunkt des Programms sowie die Applikationslogik, welche Gebrauch von den anderen Modulen macht und diese verbindet | main.c, main.h |
PWM | Generierung der PWM Signale zur Ansteuerung der RGB LEDs | pwm.c, pwm.h |
SHIFT | Ausgabe von Bitmustern an die Elektronik (Shiftregister), die die LEDs ansteuert | shift.c, shift.h |
SIMPLE_RANDOM | Einfacher Zufallsgenerator, der für den Narren-Modus im Displaymodul benötigt wird | simple_random.c, simple_random.h |
TIMER | Anlaufpunkt für Dinge, die zeitlich regelmäßig ausgeführt werden sollen | timer.c, timer.h |
UART | Zurverfügungstellung der UART Hardware, um Zeichen zu empfangen bzw. zu versenden | uart.c, uart.h |
USER | Verantwortlich für die Interaktion mit dem Benutzer, z.B. dem Anlernen der IR Befehle | user.c, user.h, usermodes.c |
WCEEPROM | Funktionen, die das persistente Ablegen und Abfragen von Informationen im bzw. aus dem EEPROM ermöglichen | wceeprom.c, wceeprom.h |
Im Folgenden soll nun die genaue Funktionsweise der einzelnen Module näher erläutert werden:
DCF77
Zur Programmierung siehe den Artikel DCF77-Funkwecker mit AVR. Im Abschnitt Programmierung ist das Funksignal dokumentiert, zusammen mit einem Beispiel (Bitstrom und Bedeutung).
Codebeispiel siehe Codesammlung DCF 77.
Softwareentwickler: Torsten Giese (wawibu)
Automatische Helligkeitsregelung
Die Helligkeit des Displays wird über einen LDR (z.B. LDR 07 von Reichelt) gesteuert.
Softwareentwickler: Rene H. (promeus)
Uhrzeit
Die Zeit wird von einer batteriegepufferten Maxim DS1307 Echtzeituhr (RTC), die über I2C mit dem Microcontroller verbunden ist, zur Verfügung gestellt. Die Batterie soll bis zu 10 Jahre halten und wird direkt auf die Platine gelötet.
Softwareentwickler: Frank M. (ukw)
IR
Es werden folgende Infrarot-Protokolle unterstützt:
Protokoll | Hersteller |
---|---|
SIRCS | Sony |
NEC | NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC, Pioneer, Toshiba, Xoro, Orion, NoName und viele weitere japanische Hersteller. |
SAMSUNG | Samsung |
SAMSUNG32 | Samsung |
MATSUSHITA | Matsushita |
KASEIKYO | Panasonic, Technics, Denon und andere japanische Hersteller, welche Mitglied der "Japan's Association for Electric Home Application" sind. |
RECS80 | Philips, Nokia, Thomson, Nordmende, Telefunken, Saba |
RECS80EXT | Philips, Technisat, Thomson, Nordmende, Telefunken, Saba |
RC5 | Philips und andere europäische Hersteller |
DENON | Denon |
RC6 | Philips und andere europäische Hersteller |
APPLE | Apple |
NUBERT | Nubert, z.B. Subwoofer System |
B&O | Bang & Olufsen (erst ab Version 1.0) |
GRUNDIG | Grundig (erst ab Version 1.0) |
NOKIA | Nokia, z.B. D-Box (erst ab Version 1.0) |
Über die automatische Erkennung des Protokolls werden die nötigen Tastatur-Befehl-Bits aus den Infrarot-Daten extrahiert - ohne Kenntnis, welche Tasten da eigentlich tatsächlich gedrückt wurden. So eine Tabelle würde den Speicher des µCs sprengen. Deshalb passiert die Zuordnung der Tasten zu WordClock-Befehlen in einer kleinen Anlernprozedur, die einmal nach dem ersten Bootvorgang ausgeführt werden muss.
Mittlerweile gibt es einen eigenen Artikel zum Infrarot-Fernbedienungsdecoder, siehe IRMP
Softwareentwickler: Frank M. (ukw)
Eine passende Fernbedienung gibt es bei DX .
Passend beschriftet werden kann die Fernbedienung mit folgenden Labels. Es gibt 2 Versionen der Scheckkartenfernbedienungen. Die erste passt für die DX Fernbedienung, diese ist etwas schmaler und länger. Einfach auf eine selbstklebende Folie drucken, ausschneiden und aufkleben.
PWM
Die PWM steuert die 3 RGB Kanäle. Damit ist freie Farbenwahl möglich.
Softwareentwickler: Frank M. (ukw)
Display
Das Display wird nicht als 10x11 Matrix sondern wortweise angesteuert. Da die LEDs RGB-LEDs sind ergibt sich daraus für die 24 Wortteile und die 4 Minutenpunkte eine 28x3-Matrix.
Die Farben sind kein Muss, in der Minimalbeschaltung können auch einfarbige LEDs zum Einsatz kommen.
Softwareentwickler: Vlad Tepesch (vlad_tepesch)
Struktur
Die display.h ist quasi die Basisklasse. Dort ist definiert, welche Schnitsstellen eine Uhr anbieten muss. Einige front-unabhängige Sachen sind hier bereits implementiert.
Von ihr abgeleitet ist die display_tix und die display_wc, wo entweder der gesamte Rest implementiert ist (TIX) oder wo weitere Ableitungen existieren (WC).
Die display_wc implementiert die Teile die alle WC-Varianten gemeinsam haben. Von ihr sind quasi die verschiedenen WC-Frontplatten abgeleitet.
Die display_wc_xxx implentieren die Eigenheiten der speziellen Version, was neben ein paar Defines nur das Mapping Zeit → Ausgabemuster (display_getTimeState) ist und das Handling der Modus-Taste ist.
Hinzufügen eigener WC-Frontplattenlayouts
Prinzipiell sind folgende Schritte notwendig:
- Kopieren und Umbenennen einer display_wc_xxx-Datei, die der eigenen Konfiguration am nächsten kommt (englisch, wenn nur eine Sprache, oder ger3 bei mehreren)
- in main.h define hinzufügen
- in display_wc.h oben das kopierte include unter Bedingung des gerade definiertne Defines hinzufügen
- anpassen des neuen headers
- Enumeration anpassen, Namen sind egal aber DWP_min1 - DWP_min4 müssen existieren. Auch sollten sie die Werte 24 - 28 haben.
Bei kleineren werden sonst die übrigen Shift-Register-ausgängen mit geschalten.
Höhere machen keinen Sinn, weil das heißen würde, das mehr Wörter als SR-Kanäle da sind. - display_getMinuteMask und display_getHoursMask so anpassen, das alle Minuten, bzw Stundenkanäle gesetzt werden
- display_getTimeSetIndicatorMask gibt die Bitmaske zurück, die bei Zeiteingabe 0 Minuten visualisieren soll (da sonst nix blinkt)
- display_getNumberDispalyState muss eine übergebene Zahl in ein Bild umwandeln, dass die übergebene Zahl erahnen lassen kann.
- Modus-Taste - am einfachsten nur Einträge in e_WcGerModes anpassen. Die Schaltung kann behalten werden. Man beachte, dass es doppelt so viele Modi gibt, wie in der Enumeration, da jeweils das Es_ist abgeschalten werden kann. Ist das nicht gewünscht, muss das Define DISPLAY_DEACTIVATABLE_ITIS auf 0 gestellt.
- Enumeration anpassen, Namen sind egal aber DWP_min1 - DWP_min4 müssen existieren. Auch sollten sie die Werte 24 - 28 haben.
- anpassen der mapping-funktion Zeit → Ausgabemuster (display_getTimeState)
- komplett im Code oder mit look-Up-Tables
- Es sollte natürlich der aktuell ausgewählte Modus (g_displayParams->mode) berücksichtigt werden
Benutzer-Interaktion
Mit der Fernbedienung ist folgendes möglich:
- Einmaliges Anlernen der Fernbedienung
- Anpassen der automatischen Helligkeitssteuerung
- Einstellen des Farbprogramms (Übergänge etc)
- Stellen der Uhr (wenn kein DCF77-Modul angeschlossen)
Softwareentwickler: Vlad Tepesch (vlad_tepesch)