Schleife nach definierter Zeit wiederholen

Chris72622:
Danke. Auch Dir nochmal, Yoghurt.. speziell für Deine Geduld!

Kein Problem. :wink:

Wie wäre es denn mit sowas:

// - Einstellungen --------------------------------------
// Anzahl der Knoepfe und Lampen
#define BUTTONCOUNT 3
// Knopf/Lampe - Angeschlossen an Pin
#define BUTTON1 2
#define BUTTON2 3
#define BUTTON3 4
#define LIGHT1  5
#define LIGHT2  6
#define LIGHT3  7
// Initiale Rundendauer in Millisekunden
#define LOOPDURATIONSTART 1000
// Faktor, um den die Runden pro Durchlauf kuerzer werden
#define LOOPFACTOR 0.9

// - Definitionen --------------------------------------
byte buttons[] = {BUTTON1, BUTTON2, BUTTON3};
byte lights[] = {LIGHT1, LIGHT2, LIGHT3};
int loopDuration = LOOPDURATIONSTART; // Rundendauer

// - Initialisierung --------------------------------------
void setup() {
	// Alle Pins fuer Knoepfe und Lampen richtig einstellen
	for (byte t=0; t<BUTTONCOUNT; t++) {
		pinMode(buttons[t], INPUT); // Knoepfe-Pins auf Eingabe stellen
		pinMode(lights[t], OUTPUT); // Licht-Pins auf Ausgabe stellen, sind dann standardmaessig aus
		digitalWrite(lights[t], LOW); // Alle Lampen einschalten, nur so zum Testen... ;)
	}
	delay(3000); // Bissl warten, dann gehts los.
}

// - Hauptroutine --------------------------------------
void loop() {
	for (byte t=0; t<BUTTONCOUNT; t++)
		digitalWrite(lights[t], LOW); // Alle Lampen ausschalten

	delay(loopDuration); // Rundenzeit warten, bevor es los geht, damit man ein Gefuehl fuer die Rundenzeit bekommt, koennte natuerlich auch per random() veraendert werden oder so.

	byte whichOne = random(BUTTONCOUNT); // Sucht sich einen der Knoepfe/Lampen fuer diese Runde zufaellig aus
	digitalWrite(whichOne, HIGH); // Diese Lampe einschalten

	long start = millis();
	while (start+loopDuration > millis()) { // Jetzt hat er die Rundenzeit lange Zeit...
		for (byte t=0; t<BUTTONCOUNT; t++) { // ...auf einen der Knoepfe zu druecken.
			if (digitalRead(buttons[t])==HIGH) {
				if (t == whichOne) { // Ist es der Richtige: Gut, naechste Runde!
					loopDuration *= LOOPFACTOR; // Naechste Runde ist kuerzer!
					return; // loop() abbrechen, wird dann wieder von vorne durchlaufen
				} else {
					break; // Ist es der Falsche: while-Schleife abbrechen, verloren.
				}
			}
		}
	}

	// Verloren! Alle Lampen an, warten, dann alles zurueckstellen und wieder anfangen.
	for (byte t=0; t<BUTTONCOUNT; t++)
		digitalWrite(lights[t], HIGH);
	delay(3000);
	loopDuration = LOOPDURATIONSTART;
}
// - Ende --------------------------------------

Das ist jetzt nur mal schnell im Text-Editor zusammengeschrieben, ich hab hier keine Entwicklunsumgebung zum Testen, daher ohne Gewähr! :blush: