Here is my first project:
I own this Solari flip clock but it is a secondary clock, not a stand alone. So it needs a signal to drive the electric motor.
This motor drive the minute dot, all the remaining flip number and text is driven by gear and mechanic.
Each 2 minutes, a position sensor is on, so I drive the motor for the first minute (about 400ms) and wait for the sensor information for the other minute.
I have an Uno and a shield with a relay to drive the 220V motor.
/*
Horloge "suiveuse" à palettes type Solari, un fin de course passe
à 1 toutes les 2 secondes, son information sert à recaler
le pilotage du moteur.
Pilotage d'un relais 5V pour le moteur, avec transistor NPN 2N2222
voie 2 puis résistance de 10k sur Base,
bobine entre + et Collecteur
Emetteur au 0V
diode 1N4001 anti retour en parallèle sur bobine relais
Moteur de l'horloge 220V sur le contact NO du relais
*/
int relais = 2;// pilotage du moteur de l'horloge
int fdc = 3; //fin de course toutes les 2 minutes
int long valeur;
unsigned long tempsactuel;
int long decalage;
int long correction = 0;
void setup(){
pinMode(relais, OUTPUT);// voie 2 en sortie
pinMode(fdc, INPUT);// voie 3 en entrée
// test Serial.begin(9600);
}
void loop() {
// première minute
tempsactuel=millis();
digitalWrite(relais, HIGH); // relais piloté
delay(400); // temps nécessaire pour faire un demi tour
digitalWrite(relais, LOW); // relais au repos
delay(59600 + correction); // attente pour faire une minute
// test Serial.println("une minute");
// deuxième minute avec utilisation du fin de course
digitalWrite(relais, HIGH); // relais piloté
valeur=0; // attente du fin de course
while(valeur==0){
valeur = digitalRead (fdc);
Serial.println(valeur);
}
digitalWrite(relais, LOW); // relais au repos
// recalage sur l'horologe "millis"
decalage = millis()-tempsactuel;
if (decalage<120000){ //si il ne s'est pas écoulé 2 minutes
delay(120000 - decalage); // attente pour complèter
correction = 0; // pas de correction sur la première minute
}
else{ // si il s'est écoulé plus de 2 minutes
correction = 120000 -decalage; //correction nécessaire sur la première minute
if (correction <-59600 ){ // ne peut dépasser cette valeur
correction =-59600; // pour éviter un "delay" négatif
}
}
// test Serial.println(millis() % 60000);
// test Serial.println(decalage);
// test Serial.println(correction);
}
As it is only for demo purpose, I don't care about the "49 days limit" for the millis.