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.