Stoppuhr mit Lichtschranke und mehreren Läufern

Guten Abend,
ich bräuchte Hilfe bei meinem Code, indem ich mit meiner Lichtschranke die Zeit von mehreren Läufern stoppen will.

Ich habe es geschafft von einem Läufer sie Zeit zu stoppen allerdings nicht von mehrern :expressionless:

Ich dachte eigentlich es wäre einfach jedoch zerbrech ich mir gerade den Kopf.

Die Zeit Starte ich mit mit einem Knopf, und stoppe die mit einer Laserichtschranke, welche ich selbst gabaut habe. (mit einer Photoresistor....)

Ich wäre seehr dankbar wenn jemand mir helfen will.

Danke ich vorraus.

StoerOsterried:
Ich habe es geschafft von einem Läufer sie Zeit zu stoppen allerdings nicht von mehrern :expressionless:

Ich behaupte mal, das geht nicht, weil eine eindeutige Zuordnung von Unterbrechungen zu Läufern nicht möglich ist.

Ich möche ja auch keine Zuordung machen, sonder nur stoppen. Oder was meinen Sie?

Bei deinem Vorhaben brauchst du für jeden Läufer eine eigene Lichtschranke.
Ich wüsste nicht, wie du sonst die Zeiten der einzelnen Läufer auseinander halten willst.

Hier ist das "Du" üblich.

Beim Start startet die Zeitmessung. Dann wird bei jeder Unterbrechung der Lichtschranke die abgelaufene Zeit gespeichert, das wäre möglich. Nur welche Aussagekraft hätten diese Zeiten? Abgesehen von irgendwelchen Körperteilen, die die Lichtschranke unterbrechen, könnten auch zwei Läufer sehr nah beieinander einlaufen, so daß die Lichtschranke zwischen ihnen unterbrochen bleibt.

Letztlich willst Du Zeiten einzelnen Läufern zuordnen, was nicht geht.

Ersmal danke fü die Antworten,

ich dachte mir halt,
ich starte den Timer,
bei der ersten Unterbrechung wird die Zeit ausgegeben/gespeichert, (der Timer läuft weiter)
falls in den nächsten 10 Sekunden eine weitere unterbrechungen geschieht, dann wird der timer erneut gespeichert, aber nur wenn zwischen der ersten Zeit und der zweiten Zeit mind. 0.2Sekunden unterschied herrscht.

Und falls zwei Läufer so nah zusammen ins Ziel laufen, dass sie nicht einzeln erkannt werden, kann gleich sagen die sind gleich schnell.

Und wegen den Körperteilen, das kann gar nicht geschehen, da ich mit Spieglen praktisch eine Wan aus lasern gemacht, das immer das erste Körperteil erkannt wird

Habe ich das verständlich ausgedrückt?

Jonah

O....das verstehe ich jetzt.

Nur wenn wir uns deinen Sketch ansehen sollen, dann mach den erst mal hübsch.
Sauber formatieren und alle überflüssigen Leerzeilen raus. Dann ist der auch lesbar.
Das kannst du auch noch nachträglich an dem geposteten Sketch machen.

Hi

Noch ist mir nicht aufgefallen, WO Du die Zeit ausgibst - sehe aber VIELE delay() im ganzen Code verteilt - während der Arduino wartet, passiert sonst Nichts - auch kein 'huch, Da ist ja Wer ...'.

Dein Sketch liest sich anstrengend, bitte entferne die unnötigen Leerzeilen.
Zur Trennung von Bereichen lasse ich Leerzeilen gelten, aber nicht zwei/drei Stück nach einer Zeile Code.

Wenn Du bisher die erste Unterbrechung erfassen und ausgeben kannst - was hindert Dich/Deinen Sketch daran, genau diese Unterbrechung ein 2.tes Mal zu erkennen und ebenfalls die aktuelle Zeit als Grundlage der Laufzeit herzunehmen?

Du musst nur irgendwie sehen, daß Du aus dem Lauf-Modus wieder raus kommst - ggf. die Läufer zählen und eine Dead-Time, wann wohl wirklich Keiner mehr kommen wird.

MfG

Hallo,

Du legst Dir ein Array an , sagen wir mal für 50 Läufer , Jedesmal wenn deine Lichschranke unterbrochen wird speicherst Du die Zeit ab und erhöhst den Index fur das Array um eins.

wenn startknopf gedrückt  startzeit=millis()

wenn Lichtschranke erkannt 
messzeit[i] = millis()-startzeit;
i++ ;

in diesem Teil darf natürlich kein delay und keine Schleife sein, sein sonst erkennst Du die Lichtschranke nicht.

Heinz

//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();
   


}

okay, viele dank erstmal für die Antworten. Ich habe jetzt nochmal den Sktech überarbeitet und ihn weitestegehend kommentiert. Auch habe ich sachen in ein void geschrieben.

Ein array ist auch eine überlegung Wert.

Das Ding ist nur ich habe den sktech ursprünglisch aus einem anderen Sktech Arduino Playground - Stopwatch , welchen ich auch nur so zu 90% verstanden habe (das zeug mit dem buttonState....)
ich habe ihn dann so modifiezert das er geht aber nicht schön ist.

PS: Ich konnte den Sketch nicht mehr oben ändern da er dann mehr als 900 Zeilen oder lang ist

Mfg Jonah