BlinkWithoutDelay und while

Es gibt ja Blink without Delay. http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay Ich möchte bei jeder Caseänderung das eine LED einmal blinkt. Also hab ich vor den Code von BlinkWithoutDelay ein While < 2 eingebunden.

Meine Frage, wenn ich jetzt wieder eine Whileschleife habe ist doch der Arduino in der Zeit wieder nicht für zwischenzeitliche Abfragen bereit wie bei einen delay(2000).

Gibt es da eine elegantere Lösung zb das dieses Blinken in einer Nebenschleife als Interrupt ausgeführt wird?

Ich würde das Nicht-Blinken genauso angehen wie das Blinken.

  int intervalOff = 1000;
  int intervalOn = 100;
...
  if(currentMillis - previousMillis > intervalOff && ledState == LOW) {
    previousMillis = currentMillis;  
    ledState = HIGH;
    digitalWrite(ledPin, ledState);
  }
  if(currentMillis - previousMillis > intervalOn && ledState == HIGH) {
    previousMillis = currentMillis;  
    ledState = LOW;
    digitalWrite(ledPin, ledState);
  }

So oder so ähnlich. ;)

Ich bevorzuge für sowas Interrupts. Z.B. so: http://blog.blinkenlight.net/experiments/basic-effects/persistence-of-vision/

Also Interrupts fände ich bei einer Ein-LED-Blinkanwendung ohne explizite Anforderung betreffs präzises Timing ein bisschen überdimensioniert... ;)

@Rickor: Wenns Dir allerdings nur ums Ausprobieren geht: Warum nicht! XD

Wenn Du per Button einen einzelnen Ein-Aus-Zyklus einleiten willst geht das z.B. so:

Angenommen, Dein Button hängt am Pin "BUTTONPIN"... (<- Konstanten schreibt man normalerweise in Großbuchstaben)

  int intervalDebounce = 20; // Button muss mindestens so lang nicht mehr gedrueckt worden sein
  int intervalOn = 100; // So lange soll die LED blinken
...
  if(currentMillis - previousMillis > intervalDebounce && ledState == LOW && digitalRead(BUTTONPIN) == HIGH) {
    previousMillis = currentMillis;  
    ledState = HIGH;
    digitalWrite(ledPin, ledState);
  }
  if(currentMillis - previousMillis > intervalOn && ledState == HIGH) {
    previousMillis = currentMillis;  
    ledState = LOW;
    digitalWrite(ledPin, ledState);
  }

So oder so ähnlich. ;)

Ich habe das Thema mal mit einer Timerlösung erschlagen. Ist zwar sprachlich (zumindest die Initialisierung) nicht ganz Arduino-like, aber du kannst dir das ja mal anschauen. http://arduino.cc/forum/index.php/topic,30479.msg226277.html#msg226277

Deshalb benutze ich in meinem Beispiel auch mstimer2. Dann sind die Interrrupts wieder Arduino like verschalt ;)