Problema en proyecto slot

Buenas, soy nuevo en este foro y me gustaría preguntaros acerca un par de dudas que me surgen en un nuevo proyecto en el que me he embarcado.
Compré una placa de Arduino UNO hace un año o así pero no me habías puesto con ella hasta ahora. Llevo un par de días dándole duro al tema pero me he estancado con algunos fallos.

Aviso de que apenas tengo idea de Arduino, por si acaso alguna parte de mi código es un insulto jajaja me disculpo.

Quiero hacer un cronómetro y cuentavueltas de slot pero únicamente para uso casero, por lo que quiero que sea rápido, sencillo y autónomo. Mi idea es que se encienda un semáforo, después inicie el cronómetro y detecte el paso de cada vuelta, mostrando en una pantalla LCD tanto el tiempo como la vuelta, registrando el tiempo de cada vuelta y el tiempo final en completar 10 vueltas, (en casa siempre solemos jugar a 10 vueltas).

Como no tengo apenas idea de Arduino, he copiado un poco de distintos hilos que he encontrado por internet, y de algunos de esta página, como este Gestor de carreras de Scalextric - Español - Arduino Forum. Una instalación así me valdría, el problema lo tengo en que en ese post falta la imagen del esquema eléctrico jeje.

Yo de momento, he elaborado un semáforo bastante sencillo, y un cronómetro que aún no se detiene al paso de cada vuelta pero porque quiero antes hacerlo funcionar a la perfección.

Mis dos principales problemas en este momento son:
-No se como conectar un pulsador a algún pin de Arduino de forma correcta para luego hacer que al pulsar marque el paso de vuelta. Aunque parece sencillo he intentado la instalación de muchas maneras y no consigo que funcione.
-El programa del semáforo funciona y el del cronometro también, pero al unir ambos en un loop, solo se está encendiendo constantemente el semáforo y no se activa el cronómetro.

Imagino que son fallos de principiante jaajja.

Os dejo el código que llevo y la instalación a ver si me podéis ayudar. Gracias de antemano.

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);

int rojo1 =  13; //Pin led rojo1 
int rojo2 =  6; //Pin led rojo2
int rojo3 =  5; //Pin led rojo3
int rojo4 =  4; //Pin led rojo4
int verde =  2; //Pin led verde
int intervalo =  1000; //Intervalo de la secuencia 1 segundo

int horas = 0;
int minutos = 0;
int segundos = 0;
int decimas = 0;
long milisegundos = 0;

void setup(){
  
 pinMode(rojo1, OUTPUT);
 pinMode(rojo2, OUTPUT);
 pinMode(rojo3, OUTPUT);
 pinMode(rojo4, OUTPUT);
 pinMode(verde, OUTPUT);
  
 Serial.begin(9600);
 lcd.begin(16,2);
}

void semaforo(){
  
  digitalWrite(rojo1, HIGH); //Encendido secuencial de los rojos
  delay(intervalo);
  digitalWrite(rojo2, HIGH);
  delay(intervalo);
  digitalWrite(rojo3, HIGH);
  delay(intervalo);
  digitalWrite(rojo4, HIGH);
  delay(intervalo);
  
  digitalWrite(rojo1, LOW); //Apagado de los rojos
  digitalWrite(rojo2, LOW);
  digitalWrite(rojo3, LOW);
  digitalWrite(rojo4, LOW);
  delay(intervalo);
  
  digitalWrite(verde, HIGH); //Encendido del verde
  delay(intervalo*2);
  digitalWrite(verde, LOW); //Apagado del verde
  }

void cronometro(){
 
 milisegundos = millis();
 if(milisegundos % 100 == 0){ //Only enter if it has passed tenth of a second
   decimas++;
   if(decimas == 10){ //When it has passed 10 tenths of a second it count one second
     decimas = 0;
     segundos++;
   }
   if(segundos == 60){ //When it has passed 60 seconds it count one minute
     segundos = 0;
     minutos++;
      }

   //Print Time
   lcd.setCursor(0,0);
   if(minutos < 10){
     lcd.print("0");
   }
   lcd.print(minutos);
   lcd.print(":");
   lcd.setCursor(3,0);
   if(segundos < 10){
     lcd.print("0");
   }
   lcd.print(segundos);
   lcd.print(":");
   lcd.setCursor(6,0);
   lcd.print(decimas);
 }
}

void loop(){
  lcd.clear();
  lcd.print("     BUENA");
  lcd.setCursor(0, 1);
  lcd.print("    CARRERA!");
  delay(2000);
  semaforo(); 
  lcd.clear();
  cronometro();
 }

hola yo estoy igual acabo de empezar mi idea es poner unos finales de carrera bajo la pista, si has conseguido avanzar algo estaría muy agradecido si lo compartes, gracias.-

vizcocho97:
No se como conectar un pulsador a algún pin de Arduino de forma correcta para luego hacer que al pulsar marque el paso de vuelta. Aunque parece sencillo he intentado la instalación de muchas maneras y no consigo que funcione.

Haces una conexión a una lcd, pero no sabes usar un botón... :confused:
Es tan sencillo como colocar el botón y ver su estado con digitalRead();

vizcocho97:
-El programa del semáforo funciona y el del cronometro también, pero al unir ambos en un loop, solo se está encendiendo constantemente el semáforo y no se activa el cronómetro.

A tener en cuenta cosas de tu código:

  1. Usar delays, mala idea.
  2. Mezclar ejemplos sin entenderlos, peor idea aún.

vizcocho97:
Imagino que son fallos de principiante jaajja.

¿Y no es mejor construir la casa por los cimientos y no por el tejado? ¿No es mejor aprender lo básico antes de haber hecho copy and paste de un ejemplo de una pantalla lcd y que ahora estés así?

Te pongo un ejemplo a mi manera.

  1. Uso 3 leds, no 5, (no dejarás pines digitales libres a tu manera cuando pongas los sensores, salvo que uses otro arduino)
  2. Desconozco que sensor usarás para detectar el paso por vuelta, como comentaste el botón, ese mismo componente usé.
  3. Te recuerdo que es un ejemplo, programa y haz el circuito a tu manera.

#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);

boolean empezar = false, 
esta_escrito = false;
unsigned long tiempo;
byte 
/*pines*/  
boton = 8,
rojo = 11, amarillo = 12, verde = 13,
/*contadores*/
cont_semaforo = 3, seg = 0, minu = 0;

void setup() {
  Serial.begin(9600);
  pinMode(rojo, OUTPUT);
  pinMode(amarillo, OUTPUT);
  pinMode(verde, OUTPUT);
  
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  tiempo = millis();
}

void loop() {

  if(millis() - tiempo >= 1000){
    tiempo = millis();
    if(!empezar){ 
      digitalWrite(rojo,     (cont_semaforo == 3) ? HIGH : LOW);
      digitalWrite(amarillo, (cont_semaforo == 2) ? HIGH : LOW);
      digitalWrite(verde,    (cont_semaforo == 1) ? HIGH : LOW);
            
      lcd.clear();
      lcd.setCursor(5, 1);
      lcd.print(String(cont_semaforo));
            
      if(cont_semaforo == 0){
        empezar = true;
        lcd.clear();
      }
      cont_semaforo--;
    }
    else{
      seg++;
      if(seg == 60){
        seg = 0;
        minu++;
      }
    }
  }

  if(empezar){ 
    if(digitalRead(boton)){
      if(!esta_escrito){
        esta_escrito = true;
        lcd.clear();
        lcd.setCursor(5, 1);
        String str_seg = (seg < 10) ? "0"+String(seg) : String(seg);
        String str_min = (minu < 10) ? "0"+String(minu) : String(minu);
        lcd.print(str_min+":"+str_seg);
      }
    }
    else{
      esta_escrito = false;
      lcd.clear();
    }
  }
}

Un saludo, cualquier duda, pregunta.