Zeitmessung mit Arduino-Stoppuhr

Um meine etwaigen Fortschritte im Umgang mit den Renntrucks für mich besser erfassen zu können, habe ich auf der Rennstrecke "Klöngrax" im Start-Ziel-Bereich mithilfe einer IR-Sendediode und eines entsprechenden IR-Transistors eine Lichtschranke installiert. Wird die Lichtschranke unterbrochen, mißt ein Arduino die Zeit bis zur nächsten Unterbrechung.

Dies wird als Rundenzeit angegeben, ebenso werden die gefahrenen Runden angezeigt und die schnellste Rundenzeit.

Bei einer neuen schnellsten Runde ertönt ein kurzes Piepsen, so daß man beim Fahren nicht ständig auf die Anzeige schauen muß.

 

 

Alles wurde wie folgt verkabelt:



Die Signale der Lichtschranke werden über eine 6,3mm Klinkenbuchse zum Arduino übertragen. Dieser läßt sich direkt auf die Platte der Rennstrecke stecken oder mittels Spiralkabel anschließen.

Als Spannungsversorgung dient eine kleine Powerbank.

Sämtliche Werte sind nach einem Reset oder Spannungsverlust gelöscht, es wird also nix gespeichert.

Bei der Umsetzung meiner Idee einer Stoppuhr erhielt ich von meinem Arbeitskollegen Uwe Zipf tatkräftige Unterstützung beim folgenden Arduino-Sketch. Vielen Dank dafür.


// Michls Rennuhr
// In Betrieb / ausgeliefert
// Mit schnellster Runde
// Rundenzähler
// Unbegrenzter Rundenzahl
// Kommaverschiebung
// LCD 16/4 16 Zeichen/4 Zeilen
// Interrupteingang an Pin3 für Lichtschranke
// Interrupt auf steigende Flanke wenn die
// Lichtschranke durchfahren wird.
// LED Kontrolleuchte für LED an Pin 13
// Kontrollsignal für schnellste Runde an Pin 12 > 250 mS

#include <LiquidCrystal.h>
LiquidCrystal lcd(9, 8, 7, 6, 5, 4); // diese Arduino-Pins werden benutzt
int LCDout=0, runde=-1, start=1;
unsigned long zeit0=0, zeit1=0;
long print1=0, print2=0;

void setup() //***********************************************************
{
  lcd.begin(16, 4); // set up the LCD's number of columns and rows:
  lcd.print("Michls Rennuhr");
  lcd.setCursor(0, 1);
  lcd.print("Version V2.0"); // ******* Versionsanzeige ******
  lcd.setCursor(0,2);
  lcd.print("11.10.2017 UZ");
 
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  digitalWrite(2, HIGH); // Pullup aktivieren
  attachInterrupt(1, LedOn, RISING); // Aufruf Unterprogramm void LedOn
}
 void LedOn() // Unterprogramm bei Interrupt *****************************
{
  if (start == 1)
  {
    zeit0 = millis();
    zeit1 = 0;
    print1 = 0;
    print2 = 0;
  }
  if (start == 0)
  {
   zeit1 = millis();
   print1 = (zeit1 - zeit0)/10;
   zeit0 = zeit1;
  }
 if (runde == 0)
  {
   print2 = print1; // Wertsetzung für die erste Runde
  }
  digitalWrite(13, HIGH);  
  LCDout = 1;
  //runde = (runde + 1);
  runde++;
  zeit1 = millis();
  start = 0;
}

void loop() //************************************************************
{
  if (LCDout == 1)
  {
  lcd.clear();
  // LCD 1. Zeile *********************************
  lcd.setCursor(0,0);
  lcd.print("Michls  Rennuhr");
  // LCD 2. Zeile *********************************
  lcd.setCursor(0,1);
  lcd.print("Rundenzeit:");
  if (print1 < 1000)
  {
    lcd.print(" ");
  }
  lcd.print((print1) /100);
  lcd.print(",");
  lcd.print((print1) %100);
  // LCD 3. Zeile *********************************  
  lcd.setCursor(0,2);
  lcd.print("Rundenzahl:");
  if (runde < 10)
  {
    lcd.print(" ");
  }
  lcd.print(runde);
  // LCD 4. Zeile *********************************
  lcd.setCursor(0,3);
  lcd.print("Schnellste:");
  if (print1 < print2)
  {
    print2 = print1;
    // Signalausgabe
    digitalWrite(12, HIGH);
    delay (250);
    digitalWrite(12, LOW);
  }
  if (print2 < 1000)
  {
    lcd.print(" ");
  }
  lcd.print((print2) /100);
  lcd.print(",");
  lcd.print((print2) %100);
  }
  LCDout = 0;
  digitalWrite(13, LOW);  
}


 

Mit dieser Stoppuhr lassen sich nur die Rundenzeiten für ein Fahrzeug ermitteln, es ist von mir nur zum Trainieren allein zu Hause gedacht. Sollen die Zeiten mehrer Fahrzeuge gleichzeitig ermittelt werden, dann kommt das zum Einsatz.