Time running before on switch

#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(
    0x27, 16, 2);  // double check your LCD address first using: i2C_scanner

int analogOutPin1 = A1;  // finish line beam lane 1 on A1 PIN
int analogOutPin2 = A2;  // finish line beam lane 2 on A2 PIN

const int ledPin1 = 11;  // lane 1 winning LED on D11 PIN
const int ledPin2 = 12;  // Lane 2 winning LED in D12 PIN
int StartSwitch = 2;

int sensorValueFinish1 = 0;
int sensorValueFinish2 = 0;
int StartState = 0;

int sensorThresh = 500;  // Sets the trigger sensing threshold of the IR
                         // receivers. ~1000 = high

unsigned long timeLane1;  // finish line lane 1
unsigned long timeLane2;  // finish line lane 2
float StartTime = 0;
float ET1 = 0;
float ET2 = 0;

void setup() {
  Serial.begin(9600);
  pinMode(StartSwitch, INPUT);
  pinMode(ledPin1, OUTPUT);  // lane 1
  pinMode(ledPin2, OUTPUT);  // lane 2
  digitalWrite(ledPin1, HIGH);
  digitalWrite(ledPin2, HIGH);
  delay(2000);
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  StartTime = 0;

  lcd.begin(16, 2);
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("MARI BRAMBAK");
  lcd.setCursor(0, 1);
  lcd.print("By: KUHOWC");
  delay(6000);
  lcd.setCursor(0, 1);
  lcd.print("Ready to race...");
}

void loop() {
  StartState = digitalRead(
      StartSwitch);  // Check state of start gate. 0 = closed & 1 = open.
  if (StartState == 0) {
    StartTime = 0;
    ET1 = 0;
    ET2 = 0;
  }

  StartState = digitalRead(
      StartSwitch);  // if start gate is trigger, race started. 1 = open.
  if (StartState == 1 && StartTime == 0) {
    StartTime =
        micros();  // use micro seconds since the races can be that close!
  }

  // read the analog in value of IR's:
  sensorValueFinish1 = analogRead(analogOutPin1);
  sensorValueFinish2 = analogRead(analogOutPin2);

  // remove "//" from below for Debugging and checking actual sensor values.
  // You may have to adjust sensorThresh value for better accuracy.
  // The sensors should read around 900-1000 then go "low" (less than 400) when
  // a car passes through the beam.
  Serial.println(StartTime);
  Serial.println(StartState);
  Serial.print("Sensor Finish1 = ");
  Serial.println(sensorValueFinish1);
  Serial.print("Sensor Finish2 = ");
  Serial.println(sensorValueFinish2);
  delay(50);

  // wait/check for the Finish Line sensors to be triggered

  if (sensorValueFinish1 < sensorThresh && ET1 == 0) {
    timeLane1 = micros();
    ET1 = timeLane1 - StartTime;
    ET1 = ET1 / 1000000;
  }

  if (sensorValueFinish2 < sensorThresh && ET2 == 0) {
    timeLane2 = micros();
    ET2 = timeLane2 - StartTime;
    ET2 = ET2 / 1000000;
  }

  if (ET1 < ET2 && ET1 != 0 &&
      ET2 != 0)  // Set winner Lane 1, turn on winner LED
  {
    digitalWrite(ledPin1, HIGH);
  }

  if (ET1 > ET2 && ET2 != 0 &&
      ET1 != 0)  // Set winner Lane 2, turn on winner LED
  {
    digitalWrite(ledPin2, HIGH);
  }

  if (ET1 > 0 && ET2 > 0)  // Race is over, display times for both lanes. //
                           // both cars have to finish to display times.
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("L1");
    lcd.setCursor(4, 0);
    lcd.print("ET:");
    lcd.setCursor(6, 0);
    lcd.print(ET1, 4);
    if (digitalRead(ledPin1) == HIGH) {
      lcd.setCursor(12, 0);
      lcd.print("WIN");
    }
    lcd.setCursor(0, 1);
    lcd.print("L2");
    lcd.setCursor(4, 1);
    lcd.print("ET:");
    lcd.setCursor(6, 1);
    lcd.print(ET2, 4);
    if (digitalRead(ledPin2) == HIGH) {
      lcd.setCursor(12, 1);
      lcd.print("WIN");
    }
    delay(100);
    digitalWrite(ledPin1, LOW);  // turn off lane winner LED
    digitalWrite(ledPin2, LOW);  // turn off lane winner LED
    timeLane1 = 0;
    timeLane2 = 0;
    StartTime = 0;
    ET1 = 0;
    ET2 = 0;
  }`Preformatted text`

Please always use code tags (this button in the editor window "</>") when posting code.

Your code to start the timer

  StartState = digitalRead(StartSwitch); //if start gate is trigger, race started. 1 = open.
  if (StartState == 1 && StartTime == 0)
  {
    StartTime = micros(); //use micro seconds since the races can be that close!
  }

... will be true as soon as the program starts. There is nothing to stop the rest of your code running after that.

Rather than looking for a HIGH or LOW value from the start button, you should look for a change from HIGH to LOW, or LOW to HIGH to detect a button press/release.

2 Likes

i make this. copy from youtuber mike freda.
done upload but time running before on the switch.
i hope anyone can solve..

Version 2 Layout.pdf (34.2 KB)

 // Time when start gate is open.
// First car to break IR beam is the lane winner
// Displays Elapsed time and winner on a 16x2 LCD.
// times resets when start gate is closed.
// Calculated time is in microseconds and gets converted to Seconds when
// displayed. Races can be that close. Uses Gikfun 5mm 940nm IR LED's emitters
// and receivers: EK8443

<#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(
    0x27, 16, 2);  // double check your LCD address first using: i2C_scanner

int analogOutPin1 = A1;  // finish line beam lane 1 on A1 PIN
int analogOutPin2 = A2;  // finish line beam lane 2 on A2 PIN

const int ledPin1 = 11;  // lane 1 winning LED on D11 PIN
const int ledPin2 = 12;  // Lane 2 winning LED in D12 PIN
int StartSwitch = 2;

int sensorValueFinish1 = 0;
int sensorValueFinish2 = 0;
int StartState = 0;

int sensorThresh = 500;  // Sets the trigger sensing threshold of the IR
                         // receivers. ~1000 = high

unsigned long timeLane1;  // finish line lane 1
unsigned long timeLane2;  // finish line lane 2
float StartTime = 0;
float ET1 = 0;
float ET2 = 0;

void setup() {
  Serial.begin(9600);
  pinMode(StartSwitch, INPUT);
  pinMode(ledPin1, OUTPUT);  // lane 1
  pinMode(ledPin2, OUTPUT);  // lane 2
  digitalWrite(ledPin1, HIGH);
  digitalWrite(ledPin2, HIGH);
  delay(2000);
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  StartTime = 0;

  lcd.begin(16, 2);
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("MARI BRAMBAK");
  lcd.setCursor(0, 1);
  lcd.print("By: KUHOWC");
  delay(6000);
  lcd.setCursor(0, 1);
  lcd.print("Ready to race...");
}

void loop() {
  StartState = digitalRead(
      StartSwitch);  // Check state of start gate. 0 = closed & 1 = open.
  if (StartState == 0) {
    StartTime = 0;
    ET1 = 0;
    ET2 = 0;
  }

  StartState = digitalRead(
      StartSwitch);  // if start gate is trigger, race started. 1 = open.
  if (StartState == 1 && StartTime == 0) {
    StartTime =
        micros();  // use micro seconds since the races can be that close!
  }

  // read the analog in value of IR's:
  sensorValueFinish1 = analogRead(analogOutPin1);
  sensorValueFinish2 = analogRead(analogOutPin2);

  // remove "//" from below for Debugging and checking actual sensor values.
  //             You may have to adjust sensorThresh value for better accuracy.
  //             The sensors should read around 900-1000 then go "low" (less
  //             than 400) when a car passes through the beam.
  Serial.println(StartTime);
  Serial.println(StartState);
  Serial.print("Sensor Finish1 = ");
  Serial.println(sensorValueFinish1);
  Serial.print("Sensor Finish2 = ");
  Serial.println(sensorValueFinish2);
  delay(50);

  // wait/check for the Finish Line sensors to be triggered

  if (sensorValueFinish1 < sensorThresh && ET1 == 0) {
    timeLane1 = micros();
    ET1 = timeLane1 - StartTime;
    ET1 = ET1 / 1000000;
  }

  if (sensorValueFinish2 < sensorThresh && ET2 == 0) {
    timeLane2 = micros();
    ET2 = timeLane2 - StartTime;
    ET2 = ET2 / 1000000;
  }

  if (ET1 < ET2 && ET1 != 0 &&
      ET2 != 0)  // Set winner Lane 1, turn on winner LED
  {
    digitalWrite(ledPin1, HIGH);
  }

  if (ET1 > ET2 && ET2 != 0 &&
      ET1 != 0)  // Set winner Lane 2, turn on winner LED
  {
    digitalWrite(ledPin2, HIGH);
  }

  if (ET1 > 0 && ET2 > 0)  // Race is over, display times for both lanes. //
                           // both cars have to finish to display times.
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("L1");
    lcd.setCursor(4, 0);
    lcd.print("ET:");
    lcd.setCursor(6, 0);
    lcd.print(ET1, 4);
    if (digitalRead(ledPin1) == HIGH) {
      lcd.setCursor(12, 0);
      lcd.print("*WIN*");
    }
    lcd.setCursor(0, 1);
    lcd.print("L2");
    lcd.setCursor(4, 1);
    lcd.print("ET:");
    lcd.setCursor(6, 1);
    lcd.print(ET2, 4);
    if (digitalRead(ledPin2) == HIGH) {
      lcd.setCursor(12, 1);
      lcd.print("*WIN*");
    }
    delay(100);
    digitalWrite(ledPin1, LOW);  // turn off lane winner LED
    digitalWrite(ledPin2, LOW);  // turn off lane winner LED
    timeLane1 = 0;
    timeLane2 = 0;
    StartTime = 0;
    ET1 = 0;
    ET2 = 0;
  }
}
type or paste code here

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.