Projektvorstellung
TEXTUHR auf Arduino-Basis
| Die 
        Idee:  
 |   |  | 
| 
 Ich zähle mich nach wie vor zu den handwerklich eher Minderbegabten. Umso stolzer bin ich auf das doch recht ansehnliche Gehäuse. Es besteht im westentlichen aus schwarzen Kunststoffplatten, die mittels Cuttermesser und Hobel zugeschnitten, mit meinem Lieblingsspielzeug "Dremel" gebohrt und mit geeignetem Kleber zusammengeklebt wurden. Die Frontplatte ist aus zwei 
        Scheiben Plexiglas® (einfaches "Bastlerglas" wäre auch 
        möglich, soll aber mit der Zeit leicht milchig werden). Zwischen 
        den Scheiben sind eine bedruckte Folie mit den Texten, eine Schicht Butterbrotpapier 
        und zwei Schichten sehr feiner schwarzer Stoff eingeklemmt, damit das 
        Licht diffuser wird. |  komplettes Gehäuse offen (es ist fünf nach eins!) |  Die Frontplatte | 
Elektronik und Aufbau:
  
  Ich habe mich für einen DFRduino nano als Controller entschieden, da er 
  sehr preisgünstig angeboten wird und weniger Platz braucht als ein "großer" 
  Arduino. Sicher könnte man auch ein Shield für den UNO bauen, aber 
  "damals" hatte ich mich mit dem Erstellen von Platinen noch nicht 
  beschäftigt. Die Elektronik sieht mit den vielen Litzen auf dem ersten 
  Blick recht chaotisch aus, aber das verschwindet ja hinter der getönten 
  Scheibe :-)

  Die Elektronik mit DCF-Modul (rechts)
Die Platine habe ich ohne 
  Schaltplan gelötet (ja, das würde ich heute nicht mehr tun...), darum 
  kann ich einen solchen hier auch nicht veröffentlichen. Aber ich habe das 
  Projekt kurz in Fritzing "nachgebaut" und kann zumindest eine Breadboard-Version 
  präsentieren:
  Diese ist (wie alles hier!) "ohne Gewähr", weil aus dem Kopf 
  nachgemalt...

Die blauen Leitungen führen 
  zu den LEDs mit Vorwiderständen. Pin15 vom linken 74HC595 ist im Sketch 
  Shifter-Pin 0, dann folgen Pin1-7, dann Pin15 vom mittleren IC, Pin1-7 vom mittleren... 
  usw...
  Die drei Adern rechts führen zum DCF77-Modul.
Der Sketch (das "Programm"):
| 
#include <Shifter.h>
#include "DCF77.h"
#include "Time.h"
#define DCF_PIN 2	         // Connection pin to DCF 77 device
#define DCF_INTERRUPT 0		 // Interrupt number associated with pin
#define SER_Pin 10 //SER_IN
#define RCLK_Pin 9 //L_CLOCK
#define SRCLK_Pin 8 //CLOCK
#define NUM_REGISTERS 3 
time_t time;
DCF77 DCF = DCF77(DCF_PIN,DCF_INTERRUPT);
long lastsync=0;
long diffsync=0;
int anzsyncs=0;
Shifter shifter(SER_Pin, RCLK_Pin, SRCLK_Pin, NUM_REGISTERS);
void setup() {
//  Serial.begin(9600); 
  DCF.Start();
}
void loop() {
  delay(1000);
  if (diffsync>10800 || lastsync==0) // alle 3 Stunden oder wenn noch kein Sync...
  {
    time_t DCFtime = DCF.getTime(); // Check if new DCF77 time is available
    if (DCFtime!=0)
    {
      setTime(DCFtime);
      lastsync=DCFtime;
      anzsyncs+=1;
    }
  }	
  diffsync=now()-lastsync;
  zeitzuled(hour(),minute());
}
void zeitzuled(int h, int m)
{
  shifter.clear();
  if (lastsync!=0){
    if(m> 2 && m< 8) {shifter.setPin(1, HIGH); shifter.setPin(5, HIGH);}                            //  5 nach
    if(m> 7 && m<13) {shifter.setPin(2, HIGH); shifter.setPin(5, HIGH);}                            // 10 nach
    if(m>12 && m<18) {shifter.setPin(3, HIGH); shifter.setPin(5, HIGH);}                            // viertel nach
    if(m>17 && m<23) {shifter.setPin(2, HIGH); shifter.setPin(4, HIGH); shifter.setPin(6, HIGH);}   // 10 vor  halb
    if(m>22 && m<28) {shifter.setPin(1, HIGH); shifter.setPin(4, HIGH); shifter.setPin(6, HIGH);}   //  5 vor  halb
    if(m>27 && m<33) shifter.setPin(6, HIGH);                                                       //         halb 
    if(m>32 && m<38) {shifter.setPin(1, HIGH); shifter.setPin(5, HIGH); shifter.setPin(6, HIGH);}   //  5 nach halb 
    if(m>37 && m<43) {shifter.setPin(2, HIGH); shifter.setPin(5, HIGH); shifter.setPin(6, HIGH);}   // 10 nach halb
    if(m>42 && m<48) {shifter.setPin(3, HIGH); shifter.setPin(4, HIGH);}                            // viertel vor
    if(m>47 && m<53) {shifter.setPin(2, HIGH); shifter.setPin(4, HIGH);}                            // 10 vor
    if(m>52 && m<58) {shifter.setPin(1, HIGH); shifter.setPin(4, HIGH);}                            //  5 vor
    if(m>17) h++;                                                    // nach minute 17 std +1 anzeigen
    if(h==0) h=12;
    if(h>12) h=h-12;                                                 // 24h-Format -12
    if(h<11) shifter.setPin(h+6, HIGH);                              // StundenPins 1-10
    if(h==11) {shifter.setPin(17, LOW); shifter.setPin(18,HIGH);}    // ELF
    if(h==12) {shifter.setPin(17, HIGH); shifter.setPin(18, HIGH);}  // ZWO-ELF
  }
  if(lastsync==0) shifter.setPin(19, HIGH);                        // rote LED vor erstem sync
  if(lastsync!=0) shifter.setPin(0, HIGH);                         // ES IST ab erstem sync
  if(lastsync!=0 && second() % 2 ==0) shifter.setPin(20, HIGH);    // sekundenblinker 0, sobald sync
  if(lastsync!=0 && second() % 2 ==1) shifter.setPin(21, HIGH);    // sekundenblinker 1, sobald sync
  if(diffsync>11400) shifter.setPin(22, HIGH);                     // gelbe LED (letzer sync über 3 std 10 minuten her)
  shifter.write();
//Debug-Teil:
/*  Serial.print(lastsync);
  Serial.print ("\t");
  Serial.print(now());
  Serial.print ("\t");
  Serial.print (diffsync);
  Serial.print ("\t");
  Serial.print (hour());
  Serial.print (":");
  Serial.print (minute());
  Serial.print (":");
  Serial.println (second());
*/
}
    
 | 
Der Sketch sollte sich 
    fast von selbst erklären. Im loop-Teil wird erstmal eine Sekunde gewartet. 
    Wenn der letzte Sync länger als drei Stunden her ist oder noch nicht 
    stattgefunden hat, versucht der Aruino, eine Zeit vom DCF77-Modul zu bekommen 
    und gibt diese dann über das Unterprogramm zeitzuled() 
    auf die LEDs aus.
    Dabei wird Pin0 ("ES IST") erst nach erfolgtem Sync aktiviert und 
    über die Pins 1-18 die Zeit angezeigt. Pin19 steuert die rote LED, die 
    nur leuchtet, wenn noch keine Zeit empfangen wurde (das rote auf den Bildern 
    ist die PowerLED vom Arduino!). Pin22 steuert die gelbe LED an, wenn das Signal 
    auf sich warten lässt. Die beiden grünen LEDs wechseln im Sekundentakt, 
    um ein wenig mehr "Leben" in die Sache zu bringen. Anfangs war das 
    auch der Indikator, ob die Uhr noch läuft - inzwischen läuft sie 
    seit Wochen ohne Unterbrechung durch.
Material-Liste:
Gehäuse:
- Kunststoffplatten: Otto Wolff Protex Light 3mm schwarz, z.B. bei Bauhaus
- passender Kleber, z.B. Pattex Repair Extreme
- Plexiglasplatte(n), waren in passender Größe in der "Restekiste" vom Bauhaus
- bedruckbare Folie (je nach Drucker für Inkjet oder Laser), z.B. AveryZweckform 2503
- Butterbrotpapier (Küchenfund :-))
- schwarzer Stoff
Elektronik:
- Arduino UNO oder nano - ich hab einen DFRduino nano 328 genommen
- 2 Stück Buchsenleisten 2,54mm je 15polig, um den Arduino nicht direkt auf die Platine löten zu müssen.
- 3 Stück Schieberegister 74HC595
- optional: 3 Stück IC-Sockel für die Schieberegister
- Netzteil zwischen 7 und 12 Volt - eins mit 9V lag noch rum
- passende Buchse fürs Netzteil, z.B. 2,1mm zum Einbau ins Gehäuse
- LEDs in der gewünschten Farbe (hier weiß) mit möglichst großem Öffnungswinkel bzw. mir konkaver Linse. z.B. die hier
- eine rote, eine gelbe, zwei grüne Status-LEDs
- passende Vorwiderstände zu den LEDs
- evtl. passende Menge Lüsterklemmen (siehe Text)
- DCF77-Modul
- 1 Widerstand 10kΩ als Pullup für das DCF77 Modul
- diverse Litzen
- Platine: Lochrasterplatine oder selbst geätzt.
Software:
- Standard-Arduino IDE
- DCF77-Library von Thijs Elenbaas
Ausblick, ToDo und bekannte Probleme:
Falls jemand Vorschläge hat oder Fehler findet, darf er/sie sich gerne melden!
Alle in erwähnten 
  Marken- und Warenzeichen oder Produktnamen sind Eigentum ihrer jeweiligen Inhaber.
  Für die Inhalte externer Links sind die jeweiligen Seitenbetreiber verantwortlich.
  Keine Haftung für eventuelle Schäden.