// Defines
#define LED_G 8
#define LED_R 9
#define TASTER 10
#define MAX 20
//Globale Variablen
unsigned int rArray[MAX];
unsigned int counter;
// Initialisierung
void setup() {
pinMode(LED_G, OUTPUT);
pinMode(LED_R, OUTPUT);
pinMode(TASTER, INPUT_PULLUP);
Serial.begin(9600);
counter = 0;
}
// Schaltet die rote LED ein (grün aus). Nach Ablauf der Wartezeit in
//Sekunden, wird die grüne LED eingeschaltet (rot aus).
void schalteLEDs( int Wartezeit)
{
digitalWrite(LED_G, LOW);
digitalWrite(LED_R, HIGH);
delay(Wartezeit*1000);
digitalWrite(LED_G, HIGH);
digitalWrite(LED_R, LOW);
}
// Liefert die Reaktionszeit(ms) vom Einschalten der grünen LED, bis
// zum Drücken des Tasters
unsigned long reaktionszeit()
{
unsigned long start, ende;
start=millis();
while (digitalRead(TASTER)==HIGH);
//tue nichts
ende=millis();
return(ende-start);
}
//Berechnet den Durchschnittswert über alle Reaktionszeiten größer
//Null im Array und gibt ihn als Rückgabewert ans Hauptprogramm.
unsigned int durchschnittszeit()
{
int summe = 0;
int zaeler = 0;
for (int i = 0; i < MAX; i++)
{
if (rArray[i] > 0)
{
summe += rArray[i];
zaeler ++;
}
}
return (summe/zaeler);
}
// Endlosschleife
void loop()
{
int zufallszahl;
unsigned long aktZeit;
unsigned long avgZeit;
unsigned long maximum = 0;
int stelle = 0;
// Erzeuge Zufallszahl von 3-9
zufallszahl = random(3,10);
// schalteLEDs - Funktion aufrufen
schalteLEDs( zufallszahl);
// reaktionszeit - Funktion aufrufen
aktZeit = reaktionszeit();
// Speichere Reaktionszeit
rArray[counter] = aktZeit;
counter ++;
// ermittle Durchschnittszeit
avgZeit = durchschnittszeit();
// Array gefüllt?
if (counter >= MAX)
{
for (int i = 0; i < MAX; i++)
{
if (rArray[i] > maximum)
{
maximum = rArray[i];
stelle = i;
}
}
rArray[stelle] = rArray[MAX-1];
counter --;
}
Serial.print("Reaktionszeit(ms): ");
Serial.println(aktZeit);
Serial.print("--- Avg(ms): ");
Serial.println(avgZeit);
for (int i=0; i<MAX; i++)
{
Serial.print(rArray[i]);
Serial.print(", ");
}
}