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.