Uhrzeit auf Drehspulmesswerken (made by licht tim)

Aus Fingers Wiki
Zur Navigation springen Zur Suche springen

Vorgeschichte

Vor einiger Zeit hab ich in den Weiten des WWW eine Uhr gesehen, die die Uhrzeit auf drei Drehspulmsswerken anzeigt. Je eines für die Stunden, Minuten und Sekunden. "Nette Idee" dachte ich mir damals und schob den Gedanken zu den ganzen anderen "könnte man ja mal machen" Gedanken. Durch einen glücklichen Zufall sind mir jetzt jedoch mehrere Messwerke zugelaufen. Diese haben zwar nur schwer nutzbare Skalen, bringen jedoch bei 10mA bereits den Vollausschlag.

Und so wurde der damalige Gedanke mit der Uhrzeit auf Drehspulmesswerken wieder ausgegraben und umgesetzt.


Ausgangssituation

Da sind sie nun, drei ca. 35 Jahre alte Messwerke mit eher schwer nutzbaren Skalen von 0-1500A.

Dazu gesellt sich ein DCF 77 Empfänger unbekanntem (aber wahrscheinlich ähnlichem) Alters der dem E-Schrott nur knapp entgangen ist.

Die nötige Intelligenz bring ein Attiny 2313 mit, lag auch noch rum, nachdem ich ein anderes Projekt noch im Laufe der Materialsammlung verworfen hatte.


Die Messwerke

Skalenbeleuchtung mit Heißkleber nachgerüstet

Um die die Skalen auch bei dunkler Umgebung zu erkennen, wurden LEDs eingebaut. Drei Stück in Reihe an 2,3k lässt an 12V 2mA fließen. Für die Skalenbeleuchtung vollkommen ausreichend.


Neue Skalen mit Beleuchtung


Die neuen Skalen sind einfach auf Papier ausgedruckt und um die alte Aluminium Skala gefaltet. Die LEDs haben eine Lichtfarbe von 2700 K was in diesem Fall fast wie das Licht von Glühbirnen aussieht. Was anderes hätte zu den alten Messwerken meiner Meinung nach auch nicht gepasst.



Steuerung

Zentrale des Ganzen ist ein Attiny 2313. Dieser wertet das DCF 77 Sigal aus und gibt die Uhrzeit in Form von drei 8bit PWM Kanälen aus. Die Software ist mit Bascom geschrieben, die mitgebrachte DCF Funktion (Config DCF77) erledigt die allermeiste Arbeit sodass man sich um die Entschlüsselung des DCF 77 Signals keine weiteren Gedanken machen muss. Die Uhrzeit liegt direkt als String vor. Anschließend wird der String in Bytes zerlegt und je nach Stunden und Minuten/Sekunden der Wert für die 8 Bit Soft-PWM aus zwei Tabellen (Std 0-23; Min/Sek 0-59) geholt.

Fazit an dieser Stelle: Auch ohne nennenswerte Programmierkenntnisse lässt sich sowas bewerkstelligen. Dies ist der erste Controler der ein von mir geschriebenes Programm abarbeitet, das nicht nur eine LED ein und aus schaltet. Es dauert zwar länger , aber mit der Hilfe von der Bascom-Hilfe und dem Internet kann man relativ schnell funktionierende Zeilen zusammen tippen. Auch wenn sich sicher bei einigen schon bei dem Wort Bascom die Haare aufstellen und sich nach einem Blick auf die Zeilen der Herzinfakt ankündig, meine Uhr funktioniert trotzdem und das ist das Ziel. -> An alle anderen Anfänger: nicht unterkriegen lassen, einfach machen!


Die Schaltung

Die Schaltung der Uhr ist eher übersichtlich, Spannungsversorgung mit 12V. Der DCF Empfänger bekommt direkt die 12V, für den Controller und die Messwerke werden 5V benötigt, das erledigt das bekannte "Handyladegerät" von Max, ein Stepdown mit LM2575 für 45ct. Die Messwerke werden mit einem 470 Ohm Widerstand und einem 100 Ohm Trimmer in Reihe geschaltet und so an die Ports angeschlossen. Mit den Trimmer wird die der maximale Ausschlag des Zeigers bei PWM = 100% eingestellt.



Eine Platine

Nachträglich verbesserte Platine

Da ich keine Lochrasterplatine mehr rumliegen hatte (bedenklicher Zustand, obwohl ich doch noch einen wirklich kleinen Rest gefunden und verbaut habe), dafür aber noch ein Stück Basismaterial, hab ich ein kleines Layout zusammengeklickt und mit der Toner Transfermethode und der "Grünen Suppe" eine Platine geätzt. Qualität unter aller Sau, löchrig ohne Ende, aber immerhin keine Bahn vollkommen unterbrochen. An der Deckung des Toners muss ich noch arbeiten. Für die Ströme hier (< 50mA) wird es schon reichen. Ein paar Nachträgliche Korrekturen gab es auch, die Schaltregler Platine und das kleine Relais sind stilecht Heißkleber befestigt. Eine Foto von der Unterseite erspare ich euch hier.




Das Gehäuse

Ich hab an dieses Projekt den Anspruch, dass das Endergebnis durchaus auch Wohnzimmer tauglich sein könnte. Daher muss ein gescheites Gehäuse her. Aus Buchenholz zusammen geleimt und anschließend geölt schwebt mir vor.

Gehäusebau: Das Gehäuse ist inzwischen auch fertig. Zusammen geleimt aus Buchenmultiplex. Die Seitenteile sind 10mm stark, die Frontplatte 6mm. Die Ausschnitte für die Messwerk sind ausgesägt und mit einer Feile angepasst. Bei den Seiten hab ich mich in einer Alternative zum einfach "stumpf aufeinander leimen" probiert, auf dem Foto der Rückseite ist das zu sehen. Die Teile sind einfach auf der Tischkreissäge mit Parallelanschlag gesägt. Die Rückwand ist etwas nach innen versetzt und wird an zwei Klötzchen angeschraubt. So stehen später die Stecker nicht so weit heraus. Hier wird auch die Platine angeschraubt. Nach ausgiebigem Schleifen gab es dann noch zum Schutz des Holzes und der Optik vier Schichten Leinöl.



Skalen

Die neu erstellten Skalen.

Bei den Stunden hat sich die 24 Stunden Skala nicht bewährt. Der Abstand zwischen den Strichen ist zu gering um schnell und sicher die Uhrzeit zu erkennen. Bei den Minuten und Sekunden kommt es da nicht so genau drauf an. Falls jemand identische Messwerk mit meinen Skalen nutzen möchte, die Bilder in Word oa. einfügen und mit 8,9cm Breite und 3,4cm Höhe ausdrucken. Beim Ausschneiden rechts und links jeweils ca. 2cm stehen lassen und um die Aluskala falten.


Bascom Programm

Sicher nicht schön, aber es funktioniert. Im wesentlichen ist es aus Beispiel Code zusammen kopiert und angepasst.

<syntaxhighlight lang="bascomavr">

   'Pinbelegung Attiny 2313

' --^-- 'Reset PA2|1 20|VCC 'RXD PD0|2 19|PB7 SCK 'TXD PD1|3 18|PB6 MISO 'XTAL2 PA1|4 17|PB5 MOSI 'XTAL1 PA0|5 16|PB4 OC1B ' PD2|6 15|PB3 OC1A ' PD3|7 14|PB2 OC0A ' PD4|8 13|PB1 'OC0B PD5|9 12|PB0 ' GND|10 11|PD6

'Empfangen der Uhrzeit mit der der Bascom DCF77 Funktion. Die Uhrzeit liegt als String vor, 'im Format HH:MM:SS. Zerlegen des Strings in Einzellziffern und zusammenstetzen zu bytes HH und MM und SS. 'Aus Tabelle den Wert für die PWM nehmen und die Zeit in 3 Kanälen als 8 Bit Soft-PWM ausgeben.


$regfile = "attiny2313.dat"

$crystal = 8000000

$hwstack = 100

$swstack = 100

$framesize = 100

$baud = 9600

$prog &HFF , &HC4 , &HDF , &HFF ' generated. Take care that the chip supports all fuse bytes.


'Config Dcf77 = Pind.3 , Debug = 1 , Inverted = 0 , Check = 2 , Update = 0 , Updatetime = 30 , Switchpower = 0 , Secondticks = 50 , Timer1sec = 1 , Powerlevel = 1 , Timer = 1

Config Dcf77 = Pind.3 , Timer = 1 , Timer1sec = 1 , Debug = 1 , Check = 2 , Inverted = 1


Enable Interrupts

'Timer 0 für Softpwm Config Timer0 = Timer , Prescale = 1 'Timer konfigurieren On Timer0 Timerroutine 'Timerinterrupt Subroutine zuweisen Enable Timer0 'Timer aktivieren Start Timer0 'Timer starten Timer0 = 0 'Timer vorladen

Enable Interrupts


'Ausgänge Config Portd.3 = Input Config Portd.4 = Output 'Stunden Config Portd.5 = Output 'Minuten Config Portd.6 = Output 'sekunden


'alias

Std_pin Alias Portd.4 Min_pin Alias Portd.5 Sek_pin Alias Portd.6



'Deklarationen

Dim I As Integer Dim Time_str As String * 8

Dim Ar(9) As Byte


Dim Sec_old As Byte , Dcfsec_old As Byte Dim Tmp As Byte


Dim Time_std As Byte Dim Time_min As Byte Dim Time_sek As Byte

Dim Std_10 As Byte Dim Min_10 As Byte Dim Sek_10 As Byte

Dim Pwm_std As Byte Dim Pwm_min As Byte Dim Pwm_sek As Byte

Dim Tz As Byte


'Start Werte


Sec_old = 99 : Dcfsec_old = 99 ': DCF_Debug_Timer = 0


Do

    Print Time$ ; " " ; Time(dcf_sec)
    Time_str = Time$
    Str2digits Time_str , Ar(1)                            '12345678
     'Print Ar(1)                                           'Anzahl der Zahlen
     'Print Ar(2)                                           '8
     'Print Ar(3)                                           '7
     'Print Ar(4)                                           '6, :
     'Print Ar(5)                                           '5
     'Print Ar(6)                                           '4
     'Print Ar(7)                                           '3, :
     'Print Ar(8)                                           '2
     'Print Ar(9)                                           '1


'Einzell Ziffern zusammenfassen und aus Tabelle pwm Wert holen

    Std_10 = Ar(9) * 10
    Time_std = Std_10 + Ar(8)
    Pwm_std = Lookup(time_std , Dta1)
    Min_10 = Ar(6) * 10
    Time_min = Min_10 + Ar(5)
    Pwm_min = Lookup(time_min , Dta2)
    Sek_10 = Ar(3) * 10
    Time_sek = Sek_10 + Ar(2)
    Pwm_sek = Lookup(time_sek , Dta2)



Loop

End


'Subs

Timerroutine: 'Beginn Subroutine

  Timer0 = 0
  Incr Tz
  If Tz = 255 Then Tz = 0                                  'Timerzaehler auf LED-Auflösung begrenzen
  If Tz < Pwm_std Then Std_pin = 1 Else Std_pin = 0        'Vergleich Timerzähler mit LED-Wert -> LED Ein- od. Ausschalten
  If Tz < Pwm_min Then Min_pin = 1 Else Min_pin = 0
  If Tz < Pwm_sek Then Sek_pin = 1 Else Sek_pin = 0


  Return                                                   'Ende Subroutine



'Tabellen:
                                                         'Tabelle für Stunden, 0,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11

Dta1: Data 0 , 23 , 47 , 68 , 89 , 110 , 128 , 149 , 168 , 188, Data 208 , 230 , 253 , 23 , 47 , 68 , 89 , 110 , 128 , 149 , Data 168 , 188 , 208 , 230



Dta2: 'tabelle für min und Sek , 0-59 zu 0-255 Data 0 , 4 , 9 , 13 , 17 , 22 , 26 , 30 , 35 , 39 Data 43 , 48 , 52 , 56 , 61 , 65 , 69 , 73 , 78 , 82 Data 86 , 91 , 95 , 99 , 104 , 108 , 112 , 117 , 121 , 125 Data 130 , 134 , 138 , 143 , 147 , 151 , 156 , 160 , 164 , 169 Data 173 , 177 , 182 , 186 , 190 , 194 , 199 , 203 , 207 , 212 Data 216 , 220 , 225 , 229 , 233 , 238 , 242 , 246 , 251 , 255 </syntaxhighlight>

Fertig

Und zum Schluss das Endergebnis, wie es auch beim Fingertreffen 2014 zu sehen war:

Fertige Uhr.JPG