//set pin numbers
//const won't change
const int ledPin = A1; //led welche Anzeigt ob der Timer läuft
const int redPin = A3; //einzeige damit der läufer weis er darf nicht laufen (wie eine ampel)
const int greenPin = A2; //Der läufer kann jetzt laufen
const int ldrPin = A0; //Photoresistor
const int buttonPin = 7; //button zum starten des Startvorgangs
const int buzzerPin = A4; //buzzer als aukustischen Siganal für den Läufer
const int sirene = A5; //warning wenn jemand vor 10s durch das Ziel läuft #usainBolt, so schnell kann ja auch keiner die 100m laufen (Kein normaler)
const int laser = 8; //laser für die Lichtschranke
int value = LOW; // previous value of the LED
int buttonState; // variable to store button state
int lastButtonState; // variable to store last button state
int blinking; // condition for blinking - timer is timing
long interval = 100; // blink interval - change to suit
long previousMillis = 0; // variable to store last time LED was updated
long startTime ; // start time for stop watch
long elapsedTime ; // elapsed time for stop watch
int fractional; // variable used to store fractional part of time
void setup()
{
Serial.begin(115200);
pinMode(ledPin, OUTPUT); // sets the digital pin as output
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH);
pinMode(ldrPin, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(sirene, OUTPUT);
pinMode(laser, OUTPUT);
}
void endOfRace(){
blinking = false; //Prozedur das der lauf beendet wurde
digitalWrite(buzzerPin, HIGH);
delay(100);
digitalWrite(buzzerPin, LOW);
digitalWrite(greenPin, LOW);
}
void Startvorgang100m(){ //Prozedur das der Start los geht, Es blinkt... und so
int x = random(1500, 5000);
digitalWrite(ledPin, HIGH);
delay(50);
digitalWrite(ledPin, LOW);
delay(50);
digitalWrite(ledPin, HIGH);
delay(50);
digitalWrite(ledPin, LOW);
digitalWrite(redPin, HIGH);
delay(3000);
digitalWrite(redPin, LOW);
digitalWrite(buzzerPin, HIGH);
delay(100);
digitalWrite(buzzerPin, LOW);
delay(100);
digitalWrite(buzzerPin, HIGH);
digitalWrite(redPin, HIGH);
delay(100);
digitalWrite(buzzerPin, LOW);
digitalWrite(redPin, LOW);
delay(1000);
digitalWrite(buzzerPin, HIGH);
digitalWrite(redPin, HIGH);
delay(75);
digitalWrite(buzzerPin, LOW);
digitalWrite(redPin, LOW);
delay(75);
digitalWrite(buzzerPin, HIGH);
digitalWrite(redPin, HIGH);
delay(75);
digitalWrite(buzzerPin, LOW);
digitalWrite(redPin, LOW);
delay(75);
digitalWrite(buzzerPin, HIGH);
digitalWrite(redPin, HIGH);
delay(75);
digitalWrite(buzzerPin, LOW);
digitalWrite(redPin, LOW);
delay(75);
digitalWrite(buzzerPin, HIGH);
digitalWrite(redPin, HIGH);
delay(75);
digitalWrite(buzzerPin, LOW);
digitalWrite(redPin, LOW);
Serial.println(x);
delay(x);
digitalWrite(buzzerPin, HIGH);
delay(291); // da der schall natürlich versetzt kommen muss als die Grüne LED
digitalWrite(greenPin, HIGH);
}
void messen100m(){
buttonState = digitalRead(buttonPin); // read the button state and store
int ldrStatus = analogRead(ldrPin); //read the status of the LDR value
if (buttonState == LOW && lastButtonState == HIGH && blinking == false && ldrStatus >=800){ // check for a high to low transition
Startvorgang100m();
Serial.println("START");
startTime = millis(); // store the start time
blinking = true; // turn on blinking while timing
delay(5); // short delay to debounce switch
lastButtonState = buttonState; // store buttonState in lastButtonState, to compare next time
delay(700);
digitalWrite(buzzerPin, LOW);
}
else if (ldrStatus <=900 && blinking == true){ // wenn ledPin leuchtet und der Photoresistor
einen Wert über 900 misst, dann kann die
Zeit erst gestoppt
elapsedTime = millis() - startTime; //nun wird die Zeit halt gespeichert
if (elapsedTime >=10000){ //wenn die Ziellinie über 10sec überquert wird, dann zählt dies
als richtige Zeit und der Timer wird gestoppt
elapsedTime = millis() - startTime; // store elapsed time
endOfRace();
lastButtonState = buttonState; // store buttonState in lastButtonState, to compare next time
// routine to report elapsed time
Serial.print( (int)(elapsedTime / 1000L)); // divide by 1000 to convert to seconds - then cast to an int to print
Serial.print("."); // print decimal point
// use modulo operator to get fractional part of time
fractional = (int)(elapsedTime % 1000L);
// pad in leading zeros - wouldn't it be nice if
// Arduino language had a flag for this? :)
if (fractional == 0)
Serial.print("000"); // add three zero's
else if (fractional < 10) // if fractional < 10 the 0 is ignored giving a wrong time, so add the zeros
Serial.print("00"); // add two zeros
else if (fractional < 100)
Serial.print("0"); // add one zero
Serial.println(fractional); // print fractional part of time
} else if (elapsedTime <=10000 && ldrStatus <=900 && blinking == true){ //wenn die Ziellinie
in unter 10sec
überquert wird,
dann zählt dies
nicht als Zeit,
und ein Alarm
ertönt für den
der auf der
Ziellinie seht
digitalWrite(sirene, HIGH);
delay(2000);
digitalWrite(sirene, LOW);
}
}
else{
lastButtonState = buttonState; // store buttonState in lastButtonState, to compare next time
}
// blink routine - blink the LED while timing
// check to see if it's time to blink the LED; that is, the difference
// between the current time and last time we blinked the LED is larger than
// the interval at which we want to blink the LED.
if ( (millis() - previousMillis > interval) ) {
if (blinking == true){
previousMillis = millis(); // remember the last time we blinked the LED
// if the LED is off turn it on and vice-versa.
if (value == LOW)
value = HIGH;
else
value = LOW;
digitalWrite(ledPin, value);
}
else{
digitalWrite(ledPin, LOW); // turn off LED when not blinking
}
}
}
void hallo(){ //nicht wichtig, nur das wenn ich den Wert von meinem Photoresistor lesen will
int ldrStatus = analogRead(ldrPin);
Serial.println(ldrStatus);
}
void loop()
{
digitalWrite(laser, HIGH);
messen100m();
//hallo();
}