# Wie zeitliche Abläufe ohne delay() einfach gestalten?

**URL:** <https://forum.arduino.cc/t/wie-zeitliche-ablaufe-ohne-delay-einfach-gestalten/121407>\
**Category:** Deutsch\
**Created:** [September 22, 2012, 5:36pm UTC](https://forum.arduino.cc/t/wie-zeitliche-ablaufe-ohne-delay-einfach-gestalten/121407 "2012-09-22T17:36:05Z")\
**Posts on this page:** 15\
**Page:** 1

<div class="post-metadata">

**Author:** ![BlueGene](https://avatars.discourse-cdn.com/v4/letter/b/34f0e0/32.png) [@BlueGene](https://forum.arduino.cc/u/BlueGene)\
**Post date:** [September 22, 2012, 5:36pm UTC](https://forum.arduino.cc/t/wie-zeitliche-ablaufe-ohne-delay-einfach-gestalten/121407/1 "2012-09-22T17:36:05Z")

</div>

Hallo,  
ich bin grad am programmieren meines Arduino Uno für eine Kameraschiene.

Jedoch bin ich grad auf das Problem gestoßen, dass ich die zeitlichen Abläufe nicht über die delay()-Funktion machen kann, da beispielsweise so keine Tasteneingaben mehr möglich sind.

Mein Ablauf schaut wie folgt aus:

- Taster schaltet die Funktion ein
- Ausgang A (Motor) wird für eine bestimmte Zeit 1 eingeschaltet
- Nach Ablauf dieser Zeit 1, wird eine Verzögerung Zeit 2 aktiviert
- Nach Ablauf von Zeit 2 wird Ausgang B (DSLR) für eine bestimmte Zeit 3 aktiviert
- Nach Ablauf von Zeit 3 folgt eine Verzögerung von Zeit 4 und das Programm wiederholt sich

Ich bin Arduino-Anfänger und habe zunächst die delay()-Funktion als Verzögerung eingesetzt. Da jedoch immer ein delay aktiviert ist, kann ich keine Eingaben über meine Taster machen.

Wie kann ich am einfachsten die o.g. Funktion realisieren? Ich hatte mir schon die BlinkWithoutDelay und ein paar timer-Libraries angeschaut. Jedoch zwar nichts dabei, was bei mehreren Timern einigermaßen übersichtig bzw. einfach aussau.

---

<div class="post-metadata">

**Author:** ![olikraus](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/olikraus/32/214084_2.png) [@olikraus](https://forum.arduino.cc/u/olikraus)\
**Post date:** [September 22, 2012, 6:01pm UTC](https://forum.arduino.cc/t/wie-zeitliche-ablaufe-ohne-delay-einfach-gestalten/121407/2 "2012-09-22T18:01:11Z")

</div>

Am besten vergegenwärtigt man sich das Verhalten des Controllers mit einem Endlichen Zustandsautomaten ([Endlicher Automat – Wikipedia](http://de.wikipedia.org/wiki/Endlicher_Automat)). Bedingungen für Zustandswechsel sind dann nicht nur externe Ereignisse, sondern könnten dann auch abgelaufene Zeitperioden sein. Beispiel: Ausgangszustand sei A. Nach 5 Sekunden soll Zustand B eingenommen werden: Bei betreten von Zustand A berechnet man die neue Zielzeit aus der aktuellen Zeit plus 5 Sekunden. Wenn die Zielzeit erreicht ist, wird der Zustand auf B gewechselt.

Grüße,  
Oliver

---

<div class="post-metadata">

**Author:** ![uwefed](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/uwefed/32/213736_2.png) [@uwefed](https://forum.arduino.cc/u/uwefed)\
**Post date:** [September 22, 2012, 6:47pm UTC](https://forum.arduino.cc/t/wie-zeitliche-ablaufe-ohne-delay-einfach-gestalten/121407/3 "2012-09-22T18:47:51Z")

</div>

Schau Dir mal das Beispiel [http://arduino.cc/en/Tutorial/BlinkWithoutDelay](http://arduino.cc/en/Tutorial/BlinkWithoutDelay) an  
Grüße Uwe

---

<div class="post-metadata">

**Author:** ![BlueGene](https://avatars.discourse-cdn.com/v4/letter/b/34f0e0/32.png) [@BlueGene](https://forum.arduino.cc/u/BlueGene)\
**Post date:** [September 23, 2012, 1:51pm UTC](https://forum.arduino.cc/t/wie-zeitliche-ablaufe-ohne-delay-einfach-gestalten/121407/4 "2012-09-23T13:51:24Z")

</div>

Das BlinkWithoutDelay-Beispiel hatte ich mir schon angeschaut.

Ich als absoluter Programmier-Anfänger, weiß aber nicht, wie ich z.B. unterschiedliche Zeiten für das Ein/Aus einstellen kann. Das Beispiel schaltet ja die LED 1 Sekunde aus, und 1 Sekunde ein. Ich bräuchte aber beispielsweise 1 Sekunden ein und 5 Sekunden aus.

Außerdem verstehe ich nicht, wie ich mehrere dieser Timer aktiviere und benutze.

Für eine normales Ein/Aus mag das Beispiel zwar geeignet sein. Sobald aber mehrere Timer genutzt werden sollen, finde ich, dass das Beispiel viel zu wenig beschrieben ist.

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [September 23, 2012, 2:52pm UTC](https://forum.arduino.cc/t/wie-zeitliche-ablaufe-ohne-delay-einfach-gestalten/121407/5 "2012-09-23T14:52:19Z")

</div>

Mach dir eine Time Mashine. Siehe hier, zweites Post von Oben von meiner wenigkeit.  
[http://arduino.cc/forum/index.php/topic,123929.0.html](http://arduino.cc/forum/index.php/topic,123929.0.html)

---

<div class="post-metadata">

**Author:** ![uwefed](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/uwefed/32/213736_2.png) [@uwefed](https://forum.arduino.cc/u/uwefed)\
**Post date:** [September 23, 2012, 6:29pm UTC](https://forum.arduino.cc/t/wie-zeitliche-ablaufe-ohne-delay-einfach-gestalten/121407/6 "2012-09-23T18:29:27Z")

</div>

Das BlinkWithoutDelay-Beispiel funktioniert folgendermaßen.  
Die Funktion millis() gibt die Millisekunden zurück, die vergangen sind seitdem Arduino eingeschaltet oder resetiert wurde.

Du speicherst die Startzeit ab un kontrolliest durch subtrahieren der Startzeit von der jetztzeit ob die Wartezeit schon vorbei ist.  
Wenn Du mehrere solche Abläufe kontrollieren willst ( 2 LED unterschiedlich blinken) dann verwende mehrere variablen für die Startzeiten.

Zu Deinem Problem: Ich bräuchte aber beispielsweise 1 Sekunden ein und 5 Sekunden aus. Ändere das [http://arduino.cc/en/Tutorial/BlinkWithoutDelay](http://arduino.cc/en/Tutorial/BlinkWithoutDelay) BEispiel folgendermaßen:

```arduino
intervallon = 1000;
intervalloff = 5000;

...

void loop()
{
    unsigned long currentMillis = millis();
 
  if(ledState == HIGH && currentMillis - previousMillis > intervalon ) {
    previousMillis = currentMillis;  
    ledState = LOW;
    digitalWrite(ledPin, ledState);
  }
  if(ledState == LOW && currentMillis - previousMillis > intervaloff) {
    previousMillis = currentMillis;  
    ledState = HIGH;
    digitalWrite(ledPin, ledState);
  }
}

```

Grüße Uwe

---

<div class="post-metadata">

**Author:** ![michael\_x](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/michael_x/32/628623_2.png) [@michael\_x](https://forum.arduino.cc/u/michael_x)\
**Post date:** [September 23, 2012, 8:58pm UTC](https://forum.arduino.cc/t/wie-zeitliche-ablaufe-ohne-delay-einfach-gestalten/121407/7 "2012-09-23T20:58:03Z")

</div>

... und außerdem brauchst du wohl eine Variable, die dir sagt in welchem Schritt du grade bist.

```cpp
int Schritt;
unsigned long Dauer; 
unsigned long previousMillis;
...

void loop () 
{
    unsigned long currentMillis = millis();

   ...
   if (  currentMillis  - previousMillis > Dauer )  
   {
      Schritt++;  // nächster Schritt
      switch (Schritt) 
           {
                 case 1:
                   // Motor Ein
                    Dauer = 5000; // sec warten
                    break;
      
                case 2:
                   // Motor aus
                    Dauer = 1000; // Pause zeit 2
                    break;

              // ....  Beliebig weitere Schritte definieren

              default:
                   Schritt = 0;
                   Dauer = 1;     // Schrittfolge wieder von vorn
           }
          previousMillis = currentMillis; // "Delay" neu starten
   }

   // hier evtl. Tasterabfragen, um die Schrittfolge zu ändern oder Wartezeiten abzubrechen o.ä.

}

```

Edit: hoppla, Code Tag vergessen ; )

---

<div class="post-metadata">

**Author:** ![uwefed](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/uwefed/32/213736_2.png) [@uwefed](https://forum.arduino.cc/u/uwefed)\
**Post date:** [September 23, 2012, 9:25pm UTC](https://forum.arduino.cc/t/wie-zeitliche-ablaufe-ohne-delay-einfach-gestalten/121407/8 "2012-09-23T21:25:16Z")

</div>

> michael\_x:  
> ... und außerdem brauchst du wohl eine Variable, die dir sagt in welchem Schritt du grade bist.

Die hatte ich ja:  
ledState

Grüße Uwe

---

<div class="post-metadata">

**Author:** ![michael\_x](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/michael_x/32/628623_2.png) [@michael\_x](https://forum.arduino.cc/u/michael_x)\
**Post date:** [September 23, 2012, 9:36pm UTC](https://forum.arduino.cc/t/wie-zeitliche-ablaufe-ohne-delay-einfach-gestalten/121407/9 "2012-09-23T21:36:41Z")

</div>

> Die hatte ich ja:  
> ledState

Schon richtig, aber das Problem mit "Blink without Delay" ist, dass die Leute sagen: prima, aber an/aus Blinken reicht mir nicht...  
Und eine "State-Machine" ist auch richtig, aber abschreckend ...

---

<div class="post-metadata">

**Author:** ![BlueGene](https://avatars.discourse-cdn.com/v4/letter/b/34f0e0/32.png) [@BlueGene](https://forum.arduino.cc/u/BlueGene)\
**Post date:** [September 26, 2012, 1:49pm UTC](https://forum.arduino.cc/t/wie-zeitliche-ablaufe-ohne-delay-einfach-gestalten/121407/10 "2012-09-26T13:49:14Z")

</div>

@Michael: Vielen Dank, dein Code ist genau das was ich gesucht habe, funktioniert genauso wie ich es wollte.

Jedoch habe ich da noch eine Frage:  
Die Funktion soll nur dann ablaufen, wenn der Einschalter auf 1 steht und der Endlageschalter auf 0. Sobald sich einer dieser Werte ändert, soll der Ablauf gestoppt werden.

Mein Ansatz mit der if-Bedingung:

```cpp
 if (endlageValue == 0 && einaus == 1)
{
...
}

```

Wenn ich den Endschalter betätigt (=1) und Einschalter(einaus=1), passiert nichts. Wenn ich den Endschalter loslasse, startet die Funktion. Also genau so wie ich es will. Wenn jedoch die Funktion abläuft und ich den Endschalter oder Einschalter betätige, dann läuft die Funktion immer noch weiter bzw. wird am momentanen Schritt gestoppt und der Schritt läuft im Dauermodus.

Was muss ich ändern, damit die Funktion beim Ändern der Bedingungen sich resettet bzw. stoppt?

---

<div class="post-metadata">

**Author:** ![uwefed](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/uwefed/32/213736_2.png) [@uwefed](https://forum.arduino.cc/u/uwefed)\
**Post date:** [September 26, 2012, 2:29pm UTC](https://forum.arduino.cc/t/wie-zeitliche-ablaufe-ohne-delay-einfach-gestalten/121407/11 "2012-09-26T14:29:44Z")

</div>

Hofdiener, bringe er mir die Kristallkugel. 😉 😉  
BlueGene bitte den gesamten modifizierten Sketch.  
Grüße Uwe

---

<div class="post-metadata">

**Author:** ![BlueGene](https://avatars.discourse-cdn.com/v4/letter/b/34f0e0/32.png) [@BlueGene](https://forum.arduino.cc/u/BlueGene)\
**Post date:** [September 26, 2012, 2:42pm UTC](https://forum.arduino.cc/t/wie-zeitliche-ablaufe-ohne-delay-einfach-gestalten/121407/12 "2012-09-26T14:42:27Z")

</div>

Das Posten der Definition der Variablen und des setup kann ich verzichten, oder ist das auch von Bedeutung?

```cpp
void loop()
{
  unsigned long currentMillis = millis();

 if (modus == 1 && einaus == 1)
  {
    if (endlageValue==0)
    {
      if (currentMillis  - previousMillis > Dauer )  
      {
        Schritt++;  // nächster Schritt
        switch (Schritt) 
        {
        case 1:
          analogWrite(motoreinaus, 255);// Motor - Leistung 100%
          digitalWrite(rechtslauf, LOW);// Motor - Rechtslauf aus
          digitalWrite(linkslauf, HIGH);// Motor - Linkslauf ein
          digitalWrite(led4, LOW);
          Dauer = 1000; // sec warten
          break;

        case 2:
          analogWrite(motoreinaus, 127);// Motor - Leistung 50%
          digitalWrite(led2, HIGH); 
          Dauer =1000; // Pause zeit 2
          break;

        case 3:
          digitalWrite(led2, LOW);
          digitalWrite(led3, HIGH);
          analogWrite(ein, 255); // Motor - Leistung 100%
          Dauer = 1000;
          break;

        case 4:
          digitalWrite(led3, LOW);
          digitalWrite(linkslauf, LOW);// Motor - Linkslauf aus
          digitalWrite(motoreinaus, LOW);// Motor Aus
          digitalWrite(led4, HIGH);
          Dauer=1000;
          break;

        default:
          Schritt = 0;
          Dauer = 1;     // Schrittfolge wieder von vorn
        }
        previousMillis = currentMillis; // "Delay" neu starten
      }  //  if (currentMillis  - previousMillis > Dauer )  
    }   // if (endlageValue==0)
  } //   if (modus == 1)
} // loop-Ende

```

---

<div class="post-metadata">

**Author:** ![michael\_x](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/michael_x/32/628623_2.png) [@michael\_x](https://forum.arduino.cc/u/michael_x)\
**Post date:** [September 26, 2012, 3:26pm UTC](https://forum.arduino.cc/t/wie-zeitliche-ablaufe-ohne-delay-einfach-gestalten/121407/13 "2012-09-26T15:26:45Z")

</div>

> Wenn ... ich den Endschalter ... betätige, dann läuft die Funktion immer noch weiter

ja klar, das hast du so programmiert:

```arduino
...
  if (endlageValue==0)
    {
        ....
    }  // if (endlageValue==0)
  } //  if (modus == 1)
} // loop-Ende

```

-- Was soll er machen, wenn der Endlage-Schalter erreicht ist ?  
-- Und wo würdest du das einbauen ?

2 Fragen, die du selbst beantworten musst, bzw. können solltest .

Falls es dir zur 2. Frage hilft:  
`if (bedingung) { ... }` gibt es auch als` if (bedingng) { ... } else { ... }`

---

<div class="post-metadata">

**Author:** ![BlueGene](https://avatars.discourse-cdn.com/v4/letter/b/34f0e0/32.png) [@BlueGene](https://forum.arduino.cc/u/BlueGene)\
**Post date:** [September 26, 2012, 4:18pm UTC](https://forum.arduino.cc/t/wie-zeitliche-ablaufe-ohne-delay-einfach-gestalten/121407/14 "2012-09-26T16:18:05Z")

</div>

Danke nochmal, jetzt funktioniert endgültig wie es soll (hoff ich mal^^)

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [May 6, 2021, 12:49pm UTC](https://forum.arduino.cc/t/wie-zeitliche-ablaufe-ohne-delay-einfach-gestalten/121407/15 "2021-05-06T12:49:36Z")

</div>

Closed on May 6, 2021, 12:49pm UTC


