Counter und Schrittmotor

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;
  }
}