Ich habe jetzt noch alles in Grad umgeschrieben und getestet. (Stunden analog)
void minutenRing() {
byte second, minute, hour;
static byte altMinuten = 0, posMinuten = 0;
enum class Schritt : byte {REF_MIN_KELLE, REF_MIN_GEFUNDEN, REF_M, REF_SUCHEN, WARTEN, MIN_KELLE_RUNTER, M_ZEIT, MIN_KELLE_RAUF};
static Schritt schritt = Schritt::REF_MIN_KELLE;
switch (schritt) {
case Schritt::REF_MIN_KELLE:
StepMinKelle.write(180);
schritt = Schritt::REF_MIN_GEFUNDEN;
debugln("Referenzpunkt Minutenkelle suchen"); // Bewegung Kelle starten.
break;
case Schritt::REF_MIN_GEFUNDEN:
if (!digitalRead(refMinKellPin)) { // Wenn Referenzpunkt erreicht, Bewegung anhalten und Nullpunkt setzen.
StepMinKelle.setZero();
StepMinKelle.write(-1);
debugln("Referenzpunkt Minutenkelle gefunden");
schritt = Schritt::REF_M;
}
break;
case Schritt::REF_M:
debugln("Referenzpunkt Minuten suche");
StepMinuten.write(390);
schritt = Schritt::REF_SUCHEN;
break;
case Schritt::REF_SUCHEN:
if (!digitalRead(refMinPin)) {
StepMinuten.setZero(NULLPOSMINUTEN);
StepMinuten.write(1);
}
if (!StepMinuten.moving() && !StepMinKelle.moving()) {
debugln("Referenzpunkt Minuten gefunden");
schritt = Schritt::WARTEN;
}
break;
case Schritt::WARTEN:
if (!StepMinuten.moving() && !StepMinKelle.moving())
{
digitalWrite(8, HIGH);
}
if (!Zeitlesen.running()) {
Zeitlesen.setTime( PAUSE );
readDS3231time(&second, &minute, &hour);
displayTime(second, minute, hour);
posMinuten = minute / 5;
//posMinuten = second / 5; // nur zum Testen
if (altMinuten != posMinuten) {
// Ereignis: Zeitpunkt für den Bewegungsablauf ist gekommen
// Aktion: Ablauf starten mit der Kellenbewegung
debug("altMinuten: "); debug(altMinuten); debug('\t'); debug("posMinuten: "); debug(posMinuten); debug('\n');
altMinuten = posMinuten;
debugln("Kelle runter");
digitalWrite(8, LOW); // Stepperspulen anschalten
StepMinKelle.write(0); // Minutenkelle runter
schritt = Schritt::MIN_KELLE_RUNTER;
}
}
break;
case Schritt::MIN_KELLE_RUNTER:
if (!digitalRead(refMinKellPin)) { // Referenzieren der Minutenkelle/Hochdrücker im Betrieb
StepMinKelle.setZero();
}
if (!StepMinKelle.moving()) {
// Ereignis: die Minutenkelle ist unten
// Aktion: Beweegung des Minutenrings starten
if (posMinuten == 0) {
StepMinuten.write(360);
schritt = Schritt::M_ZEIT;
}
else {
StepMinuten.write(30 * posMinuten);
debug("Minuten-Winkel: "); debug(30 * posMinuten); debug('\t');
schritt = Schritt::M_ZEIT;
}
}
break;
case Schritt::M_ZEIT:
if (!StepMinuten.moving() )
{ // Ereignis: Bewegung des Rings beendet
// Aktion: Kelle hochfahren
StepMinKelle.write(-59); // Minutenkelle hoch
if (posMinuten == 0) StepMinuten.setZero();
debug('\n');
debugln("Kelle rauf");
schritt = Schritt::MIN_KELLE_RAUF;
}
break;
case Schritt::MIN_KELLE_RAUF:
if (!StepMinKelle.moving())
{ // Ereignis: die Minutenkelle ist oben
// Aktion: Stepper abschalten
digitalWrite(8, HIGH);
schritt = Schritt::WARTEN;
}
break;
}
}