Hallo zusammen,
da meine Uhr schon seit Monaten läuft, will ich hiermit das fertige Projekt vorstellen, evtl. hilft das ja jemandem weiter.
Manches würde ich mittlerweile, mit etwas mehr gesammelter Erfahrung vermutlich anders lösen, dennoch läuft das Ganze und das ist ja das Wichtigste.
Die Schaltung im Groben:
Stromversorgung:
Trafo sec.2x12V in Reihe also ca. 24V
gleichgerichtet und geglättet zum L293 als Schaltspannung der Uhr
und zum Spannungsregler 5V als Stromversorgung des Arduino und des L293
Arduino:
Der Arduino in Minimalkonfiguration
basiert hierauf: http://arduino.cc/en/Main/Standalone
Uhrsteuerung:
Die H-Brücke l293 gibt an die beiden Anschlüsse der Nebenuhr jede Minute einen kurzen Impuls von 24V mit wechselnder Polarität ab.
Mit dem Schalter kann man die Uhr stellen:
Kurz drücken gibt einen, gedrückt halten gibt mehrere Impulse nacheinander ab.
Das Ganze ist jetzt in einer Plastikkiste verstaut.
Zur Genauigkeit:
Als die Schaltung noch auf meinem Steckbrett aufgebaut war bin ich schier verzweifelt,
da die Uhr mal zu schnell, mal zu langsam gelaufen ist (nach ein paar Stunden war sie schon einige Minuten daneben).
Ich habe dann versucht das über die Programmierung auszugleichen, was aber nicht funktionierte.
Irgendwann war mir das egal und ich hab die Platine geäzt, gelötet und angeschlossen - und siehe da es funktioniert.
Ich muss jetzt die Uhr schon hin und wieder mal nachstellen - allerdings eher im Monatsrhythmus, was für mich akzeptabel ist.
Eine ganz gute Anleitung zum Ätzen der Platine gibt es hier:
http://www.analog-synth.de/selberaetzen/selberaetzen.htm
ich hab das im Copyshop auf Klarsichtfolie drucken lassen und dann doppelt genommen.
Belichter ist bei mir eine uralte Höhensonne.
Hier dann noch der Code:
#include <Bounce.h>
#include <Time.h>
int freigabePin = 6; // ehemals D9
int motorPin1 = 5;
int motorPin2 = 3; // ehemals D6
int knopfPin = 2;
// Instantiate a Bounce object with a 5 millisecond debounce time
Bounce bouncer = Bounce( knopfPin,5 );
// Motorsteuerung
int impulsdauer = 350;
int richtung = 0;
// Zeitsteuerung
long previousTime = now(); // in Sekunden
int impulsabstand = 60; // in Sekunden
long currentTime = now(); // in Sekunden
void setup() {
// Serial.begin(9600); // debuggingleiche
pinMode(freigabePin,OUTPUT);
pinMode(motorPin1,OUTPUT);
pinMode(motorPin2,OUTPUT);
pinMode(knopfPin,INPUT);
}
void loop() {
UmfallenTask();
BounceTask();
}
// ruft nach Ablauf von "impulsabstand" -1 Sekunden (zählt ab 0) den "RepeatTask()" auf.
void UmfallenTask(){
long currentTime = now();
if(currentTime - previousTime > impulsabstand-1) {
previousTime = currentTime;
RepeatTask();
}
}
// auf Knopfdruck wird:
// - "RepeatTask()" aufgerufen - um eine Minute weiterzustellen
// - "previousTime = currentTime" gesezt, um den Neuen Startpunkt eines Zyklus zu setzen ("MinutenNeustart")
void BounceTask(){
bouncer.update ( );
int value = bouncer.read();
if ( value == HIGH) {
RepeatTask();
//long currentTime = now();
previousTime = now();
// minutenCount=0;
// stundenCount=0;
}
}
// hier wird der Uhrantriebsmotor um eine halbe Umdrehung gedreht
void RepeatTask(){
switch(richtung){
case 0:
digitalWrite(freigabePin,HIGH);
digitalWrite(motorPin1,HIGH);
digitalWrite(motorPin2,LOW);
delay(impulsdauer);
digitalWrite(freigabePin,LOW);
richtung=1;
break;
case 1:
digitalWrite(freigabePin,HIGH);
digitalWrite(motorPin1,LOW);
digitalWrite(motorPin2,HIGH);
delay(impulsdauer);
digitalWrite(freigabePin,LOW);
richtung=0;
break;
}
}
Und hier ein Paar Fotos und das Fritzing Projekt:
fritzing.rar (67.4 KB)