Das ist gar nicht so seltsam.
Weil etime (EndZeit) immer nur innerhalb der while-Loop einen neuen Wert bekommt, die while-Loop aber nur ausgeführt wird wenn etime - stime < intervall
kommt es bald mal vor, dass die while-Loop gar nicht mehr ausgeführt wird. - Überprüf das doch mal mit seriellen Ausgaben.
Das eigentliche Problem ist, dass etime - stime negativ werden kann.
Weil beide aber unsigned sind, kommt es zu einem Überlauf und das ergibt dann eine "sehr große" Zahl, die jedenfalls viel größer als intervall ist. Dadurch werden die while-Loops nicht mehr ausgeführt. Und die LEDs flackern nur noch.
Serielle Debug-Ausgaben - zu sehen ist der Überlauf. Ab diesem Moment flackern die LEDs nur noch:
stime etime Differenz (e-s)
-------------------------------------------
...
38389 38389 0
38839 38839 0
41840 41840 0
44841 44840 4294967295
44843 44840 4294967293
...
Du kannst das verhindern indem du etime öfter mal einen "plausiblen" Wert zuweist.
Zum Beispiel so:
//Linke LED aufleuchten
digitalWrite(2, HIGH);
stime = millis();
etime = stime; // <--------
while (etime - stime < intervall)
{
if (analogRead(A5) > 500)
{
Error++;
}
etime = millis();
}
digitalWrite(2, LOW);
Aber generell würde ich mir überlegen, das anders zu lösen und auf die vielen while-Loops zu verzichten.
Du hast ja schon eine "wunderbare" Schleife die heißt "loop" und die sollte so flott wie möglich durchlaufen werden... ![]()
Aber das ist natürlich auch irgendwie Geschmackssache.
Auf zusätzliche "Designprobleme" hat michael_x ja bereits hingewiesen.