Cronometro 2 lineas

hola a todos!!
tengo un problemita y quisiera ver quien puede ayudarme
tengo un sketch que funciona muy bien en un carril o linea y necesito añadir otra línea.
como le hago para que sea 2 cronos en 2 carriles y una sola secuencia de luces osea
terminando la secuencia de luces (semaforo) inicien los 2 cronometros y al llegar a la meta cada cronometro marque su propio tiempo, espero alguien pueda ayudarme






//    pin 9-11 valieron arduino mega
#define pinStageSensor        8

#define pinFinishSensor       10


#define pinLedStage           3
#define pinLedKuning1         4  //led amarillo
#define pinLedKuning2         5  //led amarillo
#define pinLedKuning3         6  //led amarillo
#define pinLedHijau           7  //led verde
#define pinLedMerah          A0  //led rojo

#define photodiodaOn          LOW

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

enum statusRace {
  standby,
  preStage,
  stage,
  kuning1,     //led amarillo
  kuning2,     //led amarillo
  kuning3,     //led amarillo
  hijau,       //led verde
  merah,       //led rojo

};


LiquidCrystal_I2C lcd(0x27, 20, 4);
uint32_t microsWaktuReaction, microsWaktuFoot, microsWaktuFinish;
uint32_t microsPhotodioda;
uint32_t millisStage;
byte statusRace = standby;
bool statusStage;

void setup() {
  //pinMode(pinPreStageSensor, INPUT_PULLUP);
  pinMode(pinStageSensor, INPUT_PULLUP);
  //pinMode(pinFootSensor, INPUT_PULLUP);
  pinMode(pinFinishSensor, INPUT_PULLUP);

  //pinMode(pinLedPreStage, OUTPUT);
  pinMode(pinLedStage, OUTPUT);
  pinMode(pinLedKuning1, OUTPUT);
  pinMode(pinLedKuning2, OUTPUT);
  pinMode(pinLedKuning3, OUTPUT);
  pinMode(pinLedHijau, OUTPUT);
  pinMode(pinLedMerah, OUTPUT);

  Serial.begin(9600);

  Wire.begin();
  Wire.beginTransmission(0x27);
  if (Wire.endTransmission())
  {
    lcd = LiquidCrystal_I2C(0x3F, 20, 4);
  }
  lcd.init();

  lcd.backlight();
  lcd.print("Pro Timer");
  lcd.setCursor(0, 1);
  lcd.print("V.2");
  delay(3000);

  lcd.clear();
  lcd.print("ARMADO...");

}

void loop() {


 

  if (digitalRead(pinStageSensor) == photodiodaOn)
  {
    digitalWrite(pinLedStage, HIGH);
    if (statusRace <= preStage)
    {
      millisStage = millis() + 5000;
      statusRace = stage;
      statusStage = true;
      lcd.clear();
      lcd.print("ALINEADO");
    }
  }
  else if (statusStage && (statusRace < hijau))      //led verde
  {
      statusRace = merah;                       //led rojo
      digitalWrite(pinLedMerah, HIGH);            //led rojo
      lcd.clear();
      lcd.print("FALTA");
  }
  else
  {
    digitalWrite(pinLedStage, LOW);
  }

  if (statusRace != merah)               //led rojo
  {
    switch (statusRace)
    {
      case preStage:
      case stage:
        if (millisStage < millis())
        {
          lcd.clear();
          lcd.print("1");
          digitalWrite(pinLedKuning1, HIGH);      //amarillo1
          millisStage = millis() + 400;
          statusRace++;
        }
        break;
      case kuning1:
        if (millisStage < millis())
        {
          lcd.clear();
          lcd.print("2");
          digitalWrite(pinLedKuning1, LOW);       //amarillo1
          digitalWrite(pinLedKuning2, HIGH);       //amarillo2
          millisStage = millis() + 400;
          statusRace++;
        }
        break;
      case kuning2:
        if (millisStage < millis())
        {
          lcd.setCursor(0, 0);
          lcd.print("3");
          digitalWrite(pinLedKuning2, LOW);           //amarillo2
          digitalWrite(pinLedKuning3, HIGH);           //amarillo 3
          millisStage = millis() + 400;
          statusRace++;
        }
        break;
      case kuning3:
        if (millisStage < millis())
        {
          lcd.setCursor(0, 0);
          lcd.print("Start ");
          digitalWrite(pinLedKuning3, LOW);            //amarillo3
          digitalWrite(pinLedHijau, HIGH);             //verde
          millisStage = millis() + 400;
          statusRace++;

          microsPhotodioda = micros();
        }
        break;
      case hijau:
        break;
      case merah:
        break;
    }

    if (statusRace == hijau)             //verde
    {
      if (statusStage)
      {
        while (digitalRead(pinStageSensor) == photodiodaOn);
      }
      else
      {
        while (digitalRead(pinStageSensor) != photodiodaOn);
        while (digitalRead(pinStageSensor) != photodiodaOn);
        while (digitalRead(pinStageSensor) == photodiodaOn);
      }



      microsWaktuReaction = micros() - microsPhotodioda;

      float waktuReaction = 1.0 * microsWaktuReaction / 1000000;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("R.Time : ");
      lcd.print(waktuReaction);
      lcd.print(" s");
      Serial.print("waktuReaction =");
      Serial.println(waktuReaction);

      

      //waktu finish
      while (digitalRead(pinFinishSensor) != photodiodaOn);
      microsWaktuFinish = micros() - microsPhotodioda;

      float waktuFinish = 1.0 * microsWaktuFinish / 1000000;
      lcd.setCursor(0, 1);
      lcd.print("F.Time : ");
      lcd.print(waktuFinish);
      lcd.print(" s");
      Serial.print("waktuFinish =");
      Serial.println(waktuFinish);

      

      digitalWrite(pinLedHijau, LOW);          //verde

      statusStage = false;
      statusRace = standby;

    }
  }



}

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

Primero que nada, no se entiende (o al menos yo no entiendo) cual es tu problema, trata de explicarte mejor.

Segundo, adjunta el código según las Normas del Foro, punto 7.
No nos obligues, para poder ayudarte, a bajar el código y verlo con otro programa cuando podríamos verlo directamente en el navegador.

1 Like

buenas tardes, gracias por responder, mi problema es, necesito poner un cronometro para cada carril y no se como hacer, este scketch funciona a la perfección inicia el conteo después de la secuencia de luces y me marca los tiempos que requiero en un carril.
pero como le hago para que sea 2 cronos en 2 carriles y una sola secuencia de luces osea
terminando la secuencia de luces (semaforo) inicien los 2 cronometros y al llegar a la meta cada cronometro marque su propio tiempo, gracias espero haber sido mas explicito

ya lo subi

Ahora si se entiende perfectamente. :+1:

A primera vista el código está desarrollado para (y alrededor de) un solo sensor, para usarlo con 2 o más habría que replantearlo casi desde cero.

Espera otras opiniones porque puedo estar equivocado.

Saludos

PD: Hay que aprender malayo para recordar a lo que hace referencia cada una de las variables que no están nombradas en inglés. :rofl:

1 Like

Moderador:
Por favor, lee las Normas del foro.
Además, si posteas en el foro en inglés usa idioma inglés para expresarte.
Si escribes en español debes usar el foro Arduino en español.
No pongas titulos usando la palabra Ayuda, se considera un título INUTIL.
Punto 5. Piensa un título y descriptivo. Léelo detenidamente. Ya lo edité por ti, pero queda acentado.
Son 3 faltas, las cometidas. Código sin etiquetas, mal titulo y usar español en foro en inglés. Ten mas cuidado la próxima vez.
Respuestas a esto por privado.

El tema es que copias un programa y quieres que nosotros hagamos la tarea por ti, no entiendo para que se meten en cosas que estan mas allá de sus capacidades.

Lo primero seria que intentes por tu cuenta, no es tarea fácil.

Este es mi mejor intento:
Quieres que detecte dos carriles.
El arranque esta dado por esto

if (statusStage)      {
            while (digitalRead(pinStageSensor) == photodiodoOn);
        }
        else {
            while (digitalRead(pinStageSensor) != photodiodoOn);
            while (digitalRead(pinStageSensor) != photodiodoOn);
            while (digitalRead(pinStageSensor) == photodiodoOn);
        }
        microsEndReaction = micros() - microsPhotodiodo;

Asi que eso queda como esta y si un auto se demora lo siento.

El final de 1 carril esta dado por

 while (digitalRead(pinFinishSensor) != photodiodoOn);

Intentemos detectar dos acciones cargando en memoria los resultados.

        //tiempo de finalización
        int raceCar = 0;
        while (digitalRead(pinFinishSensor) != photodiodoOn && raceCar >= 2 ) {
              microsEndFinish[raceCar++] = micros() - microsPhotodiodo;
        }      
        // ahora tendras dos tiempos 
        // microsEndFinish[0] y microsEndFinish[1]
        float endFinish = (float) microsEndFinish[0] / 1000000UL;
        // Lo aconsejable seria tener un display de 4 lineas, con 2 necsitarás que 
        // cambie para poder ver los valores
 
1 Like

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