Besser so -- keine while Schleife

:
unsigned long start;
void loop() {
if (startbedingung)
start = millis();
if (millis()-start < 2000) { // immer Differenz bilden, dann stört kein Überlauf von millis
mach_irgendwas(); // sollte "sofort" fertig werden, um im nächsten loop - Durchlauf gleich wieder dranzukommen
}
}
Vorteile:
- loop hängt nicht
- Startbedingung kann erneut getriggert werden, während mach_irgendwas noch beauftragt wird.
Achtung:
- wenn Startbedingung länger ansteht, wird mach_irgendwas entsprechend länger ausgeführt
Wenn etwas anderes Verhalten gewünscht, kann das natürlich auch realisiert werden,
das Prinzip "loop hängt nicht" sollte aber erhalten bleiben.