Delay or not Delay
Um es gleich vorweg zu sagen, es kommt drauf an…
Es gibt durchaus Situationen, da tun Delay's nicht weh, ja im Gegenteil müssen sogar sein, um die Funktion zu gewährleisten. Beispielsweise beim Debuggen. Da ist ein Delay in der Hauptloop manchmal die einzige Möglichkeit, sinnvoll die Ausgabemenge zu reduzieren.
Das Problem mit dem Delay ist aber, daß in dem Augenblick, wo man delay() aufruft, der gesamte Rest der Anwendung (mit Ausnahme der Interrupts) angehalten wird. Und jetzt stellen wir uns mal folgendes Szenario vor. Wir haben da eine Hecht. Das ist ein kleines SAR Boot mit Jetantrieb. Und wir setzen den Arduino z.B. für die Klappensteuerung und den Motor ein. Und weil da ja noch genug Platz im Controller ist, bauen wir noch das Blinklicht mit ein. Geblinkt wird natürlich schön mit delay(500).
d.h. Aber das während dieser halben Sekunde keinerlei Motorsteuerung mehr möglich ist. Da wir wegen möglicher Störungen eine Mittelwertbildung über den Motorkanal machen, kann es sein, daß unser Modell mit ca. 2-3 Sekunden Verzögerung auf das Gas reagiert. Und rums ist das Boot an Land.
Aber wie können wir blinken ohne delay zu benutzen? Na, machen wir's, wie delay selber auch und werten den Systemzähler aus. Mit millis() bekommen wir den aktuellen Stand des Systemzählers. Und wenn wir jetzt blinken sollen, dividieren wir den Wert / 1000 und besorgen uns davon den Rest.
Ist der Rest < 500, dann schalten wir die Blinklampe ein, ist der Rest >= 500 schalten wir das ganze wieder aus. Programmtechnisch sieht das so aus:
/* läßt die Board LED blinken, wenn man Pin 1 an Masse legt. Ohne delay. */ const byte LED = 13; const byte TASTE = 1; void setup() { pinMode(LED, OUTPUT); pinMode(TASTE, INPUT_PULLUP); } void loop() { if (digitalRead(TASTE) == 0) { // blinker ist eingeschaltet if ((millis() % 1000) < 500) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } } else { digitalWrite(LED, LOW); } }