pause mit endlich automat

Hallo,

ich habe mir einen endlichen automat (zeitgesteuert) geschrieben, wobei ich eure Hilfe benötige.
Folgendes:

Mein Automat arbeit 4 Schritte ab in denen er nacheinander Alle LEDs ausschaltet mit Zeit1=3000ms.

Nun möchte ich aber eine Pause funktion einbauen, sprich, eine Variable die durch einen Schalter auf 1 oder true (is ja egal) gesetzt wird, wenn dieser schalter also gedrückt wird, soll pausiert werden, sobald ich einen anderen schalter betätige (ändern der variable auf 0 oder false), soll er wieder die Zeit da ablaufen an der stelle ich eine Pause gemacht hab.

Hätt ich in der Art etwa gelöst, wenn keine weiteren Parameter dazu kommen.

  if (stopkette == 1)
  {
    static bool pausieren = false;
    if (digitalRead(taster_1) == HIGH) {
      pausieren = true;
    }
    if (digitalRead(taster_2) == HIGH) {
      pausieren = false;
    }
    if (millis() - ZeitMillis >= ZeitIntervall && pausieren == false)
    {
      switch (PRODUKT)
      {
        case schritt1:
          ZeitIntervall = Zeit1;       //Zeit1 = 3000ms                   
          digitalWrite(10, HIGH);
          digitalWrite(11, HIGH);
          digitalWrite(12, HIGH);
          ZeitMillis = millis();
          PRODUKT = schritt2;
          break;

        case schritt2:
          ZeitIntervall = Zeit1;       //Zeit1 = 3000ms                   
          digitalWrite(10, LOW);
          digitalWrite(11, HIGH);
          digitalWrite(12, HIGH);
          ZeitMillis = millis();
          PRODUKT = schritt3;
          break;

        case schritt3:
          ZeitIntervall = Zeit1;       //Zeit1 = 3000ms
          digitalWrite(10, LOW);
          digitalWrite(11, LOW);
          digitalWrite(12, HIGH);
          ZeitMillis = millis();
          PRODUKT = schritt4;
          break;

        case schritt4:
          ZeitIntervall = Zeit1;       //Zeit1 = 3000ms
          digitalWrite(10, LOW);
          digitalWrite(11, LOW);
          digitalWrite(12, LOW);
          ZeitMillis = millis();
          PRODUKT = schritt1;
          stopkette = 0;
          break;
      }
    }
  }

Als static natürlich nur wenn es einen Funktion ist.
Aber da du nur einen Teil deines Codes zeigst, kann man nur spekulieren.

Ein einzelner Automat mit einem Stop benötigt für jeden aktiven Zustand einen gestoppten Zustand, damit die Rückkehr nach Aufhebung des Stop funktionieren kann.

Wenn man den Automaten in ein Unterprogramm verschiebt, dann kann man einen Stop ganz einfach dadurch implementieren, daß das Unterprogramm im gestoppten Zustand nicht aufgerufen wird. Beim Aufheben des Stop muß man nur noch dafür sorgen, daß ggf. unterbrochene Zeitintervalle richtig weiterlaufen.

Wenn das Zeitintervall behalten werden soll, sollte das gehen wenn man den Zustand einfach in ner Variable speichert.
In etwa so.

if (digitalRead(taster_1) == HIGH) {
pausieren = true;
millis() - ZeitMillis = pausenzeit;
}
if (digitalRead(taster_2) == HIGH) {
pausieren = false;
ZeitMillis = millis() - pausenzeit;
}

Pausieren meinst Du die angefangene Zeiten einfrieren und bei Start die Restzeit weitermachen?

Bei STOP Zeiten zwischenspeichern. Warten-Flag setzen
Auf Start kontrollieren und nichts machen
Bei START Zeiten zurückspeichern Warten Flag löschen und weiterarbeiten.

Grüße Uwe

Also hab das mit deinem Code probiert, funktioniert alles fast alles einwandfrei.
Problem ist nur genau das was ich immer hatte.

Er macht zwar an der Stelle weiter aber die gestoppte Zeit wird eben nicht gespeichert.

folgendes Szenario: ich stoppe irgendwo mit schalter1 wenn LED 1 aus und LED 2,3 an sind (schritt 2).
Dann drücke ich zb nach 10 sek. den Schalter 2 und nun springt er mir gleich in den schritt 3, da die (Zeit1:3000ms) 3sek. eben schon abgelaufen sind. Bräuchte also wenn ich Schalter 1 betätige die gestoppte Zeit und rechne diese dann minus die verstrichene Zeit die er normal hätte ohne pause gedrückt zu haben.

Denke ich da richtig? wie würde das als code aussehen?

[EDIT]: Habe gerade gelesen dass du den neuen Post geschrieben hast. Super Danke dir funktioniert :wink:
Gedacht habe ich richtig nur codetechnisch wusste ich nicht wie ich das schreiben soll :stuck_out_tongue: