Projektvorstellung

TEXTUHR auf Arduino-Basis


Diese Seite ist veraltet und wird nicht mehr aktualisiert/gepflegt.
Die neue, verbesserte Version der Uhr gibts HIER


Die Idee:

Die Grundidee stammt nicht von mir. Irgendwann habe ich so eine ähnliche (zugegeben: viel hübschere) Uhr im Internet gesehen. Die erste Reaktion war: HABEN WILL! Als ich den Preis von mehreren hundert Euro sah, verfolg diese Begeisterung. Aber ganz vergessen habe ich das Ding nicht. Mitte 2012 fing ich an, mich mit Arduino zu beschäftigen. Beim Lesen des Buches "Die elektronische Welt mit Arduino entdecken" von Erik Bartmann (Pflichtlektüre!) fiel mir die Uhr wieder ein. In dem Buch wird sehr ausführlich beschrieben, wie man mehrere LEDs mittels Schieberegister ansteuern kann. Also war nur noch die Frage zu klären, wo die Zeit herkommen soll... im Internet fand ich schließlich eine Library, mit der ein DCF77-Funkuhrmodul per Arduino ausgelesen werden kann.

 

 


Das Gehäuse:

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.

Aus Platzgründen wird um 12 Uhr eine "ZWO" vor die "ELF" geschaltet - schon haben wir eine "ZWOELF".


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:

Elektronik:

Software:


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.