Buongiorno,
come da titolo sto cercando di visualizzare un cronometro su un display TM1637.
Nonostante la poca esperienza, dopo un po' di riflessione ho scritto il codice, che a livello matematico funziona correttamente.
L'unico problema che riscontro è che la visualizzazione non è "fluida": spesso i secondi rallentano per poi avanzare rapidamente, addirittura saltando un numero! Come se il processore fosse troppo "impegnato" nello svolgere i calcoli, che non sembrano però così impegnativi!
Esempio:
invece di procedere con 45:12 45:13 45:14 45:15 45:16
visualizzo magari 45:12 45:13 45:13 45:15 45:16
Come posso risolvere l'inconveniente?
Allego parte del codice, in quanto in realtà il cronometro è solo una piccola parte di un codice molto più strutturato.
Grazie
#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;
unsigned long t0_a = 0, t0_b = 0;
void setup() {
display1.setBrightness(7, true);
display2.setBrightness(7, true);
}
void loop() {
t_parz_a = (millis() - t0_a) / 1000; // [s]
t_parz_b = (millis() - t0_b) / 1000; // [s]
t_tot = millis() / 1000; // [s]
// esempio 429 secondi // esempio 43 secondi
float numero = t_parz_a / 60.0; // numero = 429 / 60 = 7.15 // numero = 0.716
int minuti = numero; // minuti = 7 // minuti = 0
numero = (numero - minuti) * 60.0; // numero = 0.15 * 60 = 9.0 // numero = 43.0
int secondi = numero; // secondi = 9 // secondi = 43
// esempio min = 32 sec = 27 // esempio min = 5 sec = 9
float i = minuti / 10.0; // i = 3.2 // i = 0.5
int minuti_dec = i; // minuti_dec = 3 // minuti_dec = 0
i = (i - minuti_dec) * 10.0; // i = 2.0 // i = 5.0
int minuti_uni = i; // minuti_uni = 2 // minuti_uni = 5
float j = secondi / 10.0; // j = 2.7 // j = 0.9
int secondi_dec = j; // secondi_dec = 2 // secondi_dec = 0
j = (j - secondi_dec) * 10.0; // j = 7.0 // j = 9.0
int secondi_uni = j; // secondi_uni = 7 // secondi_uni = 9
int disp = minuti_dec * 1000 + minuti_uni * 100 + secondi_dec * 10 + secondi_uni;
display1.showNumberDecEx(disp, 0b11100000, true);
}