Chris72622:
Danke. Auch Dir nochmal, Yoghurt.. speziell für Deine Geduld!
Kein Problem. ![]()
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! ![]()