Cronometro TM1637

Come dicevo la gestione di millis() è errata.

Ho provato a cominciare a correggere lo sketch. Vedi se capisci quello che ho scritto. Chiedi quello che non ti è chiaro.

#include <TM1637Display.h>
#define CLK1 12
#define DIO1 11
#define CLK2 10
#define DIO2 9
TM1637Display display1(CLK1, DIO1);
TM1637Display display2(CLK2, DIO2);

unsigned long t_parz_a, t_parz_b, t_tot;
//==SOSTITUISCI QUESTE RIGHE===================================================
unsigned long t0_a = 0, t0_b = 0;
//==CON QUESTE=================================================================
unsigned long t0_a, t0_b;
int numero_a, numero_b;         //secondi crono_a, secondi crono_b
//=============================================================================


void setup() {
  display1.setBrightness(7, true);
  display2.setBrightness(7, true);
//==INSERISCI QUESTE RIGHE=====================================================
  numero_a = 0;         //inizializza crono_a
  numero_b = 0;         //inizializza crono_b
  t0_a = millis();      //inizializza inizio secondo crono_a
  t0_b = millis();      //inizializza inizio secondo crono_b
  t_tot = millis();     //inizializza inizio tempo totale
//=============================================================================
}


void loop() {

  trip_a = a * dist;                                 // [m]
  trip_b = b * dist;                                 // [m]
  odo = c * dist / 1000;                             // [km]

//==SOSTITUISCI QUESTE RIGHE===================================================
  t_parz_a = (millis() - t0_a) / 1000;               // [s]
  t_parz_b = (millis() - t0_b) / 1000;               // [s]
//==CON QUESTE=================================================================
  if (millis() - t0_a >= 1000) {
    t0_a = millis();      //inizializza inizio secondo crono_a
    numero_a++;           //incrementa il numero dei secondi del crono_a
  }
  if (millis() - t0_b >= 1000) {
    t0_b = millis();      //inizializza inizio secondo crono_b
    numero_b++;           //incrementa il numero dei secondi del crono_b
  }
//=============================================================================
//==ELIMINA QUESTA RIGA========================================================
  t_tot = millis() / 1000;                           // [s]
//=============================================================================

  //v_act = (dist / delta_t) * 3600 * 1000 * 1000;     // [km/h]
//==SOSTITUISCI QUESTA RIGA====================================================
  v_med = odo / (t_tot / 3600);                        // [km/h]
//==CON QUESTA=================================================================
  v_med = odo / ((millis() - t_tot) / 3600);                        // [km/h]
//=============================================================================

//Su questa parte non so aiutarti perché non hai postato l'intero sketch e
//non so cosa siano trip_a, odo, v_med, a, b. c, etc. Se cerco di compilarlo
//mi da una serie di indefiniti

  Serial.print(trip_a);
  Serial.print(" ");
  Serial.print(odo);
  Serial.print(" ");
  Serial.print(v_med);
  Serial.println(" ");

  if (digitalRead(switch_1) == LOW) {                           // visualizza le distanze su schermo 1 e 2
    display2.showNumberDec(odo);

    if (digitalRead(switch_4) == LOW) {                         // visualizza trip_a su schermo 1
      display1.showNumberDec(trip_a);
    }

    if (digitalRead(switch_4) == HIGH) {                        // visualizza trip_b su schermo 1
      display1.showNumberDec(trip_b);
    }
  }

  if (digitalRead(switch_1) == HIGH) {                          // visualizza i tempi su schermo 1 e 2

    //                                                          // esempio 4429 secondi
//==SOSTITUISCI QUESTE RIGHE===================================================
    float numero = t_tot / 3200.0;                              // numero = 4429 / 3200 = 1.23
    int ore = numero;                                           // ore = 1
    numero = (numero - ore) * 60.0;                             // numero = 0.23 * 60 = 13.8
    int minuti = numero;                                        // minuti = 13

    //                                                          // esempio ore = 1  min = 13
    float i = ore / 10.0;                                       // i = 0.1
    int ore_dec = i;                                            // ore_dec = 0
    i = (i - ore_dec) * 10.0;                                   // i = 1.0
    int ore_uni = i;                                            // ore_uni = 1
    float j = minuti / 10.0;                                    // j = 1.3
    int minuti_dec = j;                                         // minuti_dec = 1
    j = (j - minuti_dec) * 10.0;                                // j = 3.0
    int minuti_uni = j;                                         // minuti_uni = 3

    int disp = ore_dec * 1000 + ore_uni * 100 + minuti_dec * 10 + minuti_uni;
//==CON QUESTE=================================================================
    unsigned long numero_tot = (millis() - t_tot) / 1000;       // numero_tot = secondi totali
    int ore = numero_tot / 3200;                                // ore = 1
    int minuti = numero_tot % 3200 / 60;                        // minuti = 13

    int disp = ore * 100 + minuti;
//=============================================================================
    display2.showNumberDecEx(disp, 0b11100000, true);

//============================================================================
//SE HAI CAPITO IL MECCANISMO, PROVA AD ANDARE AVANTI DA SOLO
//============================================================================

    if (digitalRead(switch_4) == LOW) {                         // visualizza t_parz_a su schermo 1


}

Non ho potuto controllare quello che ho scritto. Potrebbero esserci errori.

Ciao,
P.