Das Problem hat mit dem Überlauf nach 49 Tagen nichts zu tun.
Der Stolperstein ist hier:
...
while (etime - stime < intervall)
{
if (analogRead(A5) > 500)
{
ErrorSignal();
}
etime = millis(); // <-------- A) etime wird millis() zugewiesen
}
digitalWrite(4, LOW);
//Mittlere LED aufleuchten
digitalWrite(3, HIGH);
stime = millis(); // <------- B) stime wird millis() zugewiesen
while (etime - stime < intervall) // <------- C) Rechnung: etime - stime
{
...
Bei A) wird etime millis() zugewiesen, danach gibt es mehrere Anweisungen.
Bei B) wird stime millis() zugewiesen.
Zwischen A) und B) vergeht etwas Zeit. Nicht viel und wohl deutlich weniger als 1 Millisekunde.
Deshalb haben in vielen Fällen etime und stime den gleichen (millis-) Wert und die Differenz (Punkt C) ist dann Null.
Es kann aber passieren, dass Punkt A) gerade zu einem Moment erreicht wird, sehr knapp bevor millis() um 1 weiterzählt. Dann ist etime um eins kleiner als stime und die Rechnung etime minus stime (Punkt C) wird "eigentlich" negativ (genauer: -1), weil das aber unsigned-long-Variablen sind, können diese keine negativen Werte haben. Es kommt zu einem "Überlauf" und statt -1 ergibt sich der Wert 4294967295.
Und weil das deutlich größer als intervall ist werden die while-Loops nicht mehr ausgeführt - nie mehr, weil etime keinen neuen Wert mehr zugewiesen bekommt.
Edit: Erst nach etwa 49 Tagen (nach dem Überlauf von millis) ist stime wieder kleiner als etime.
Aber so lange warten wohl nur die wenigsten Spieler ![]()
Das ist wohl eine Race Condition.