Non capisco, sto cercando di creare un timer ore, minuti, secondi, e dopo aver caricato il file sull’arduino il conteggio dei secondi parte, ma arriva a 31 poi si ferma, in verita dovrei fare un deconteggio per i minuti, partendo da un valore x pre impostato, ma questa era una prova, tanto per capire come farlo, e mi sono inbattuto in questo, qualcuno sa darmi una mano?
int secondo = 0;
int a = 1000;
int minuto = 0;
int ora = 0;
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
void setup() {
}
void loop()
{
if(millis()==(a+1000))
{
secondo++;
a = millis();
lcd.begin(20, 4);
// Print a message to the LCD.
lcd.print(secondo);
}
if(secondo==60)
{
minuto++;
secondo=0;
lcd.setCursor(0, 1);
lcd.print(minuto);
}
if(minuto==60)
{
ora++;
minuto=0;
}
if(ora==24)
{
ora=0;
}
}
Il “lcd.begin(20, 4);” va nel setup(); forse si blocca perché lo chiami troppe volte.
non scrivere “if(millis()==(a+1000))”
se per caso salta proprio quel millisecondo a+1000 Ti aspetta il programma 49 giorni e qualche ora per avere la condizione corretta.
meglio “if(millis()>=(a+1000))”
Ciao Uwe
Sempre piu strano, ho modificato il prog facendo visualizzare anche il valore di millis()/1000 quindi ogni secondo, e mentre il mio conteggio dei secondi si ferma a 31 il valori di millis non si ferma e continua ad essere incrementato.
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int secondo = 0;
int a = 1000;
int minuto = 0;
int ora = 0;
void setup() {
lcd.begin(20, 4);
lcd.print("Timer Test");
}
void loop() {
lcd.setCursor(0, 1);
lcd.print(millis()/1000);
if(millis()>=(a+1000))
{
secondo++;
a = millis();
lcd.setCursor(0, 3);
// Print a message to the LCD.
lcd.print(secondo);
}
if(secondo==60)
{
minuto++;
secondo=0;
lcd.setCursor(5, 3);
lcd.print(minuto);
lcd.setCursor(0, 3);
lcd.print(secondo);
}
}
Non vorrei si fermass a 31 per il semplice fatto che stai usando un integer per memorizzare mills (int a). Un integer accetta dati da -32768 a +32767.
Quindi 31=31000/1000 e 32=32000/1000.
Con millis si lavora in genere con unsigned long per contenere tutto il valore di millis.
molto semplice. a è un INT, tra l'altro signed, quindi con valori da -36536 a +36536 (più o meno, noin ricordo esattamente.)
invece millis è un unsigned long, supera tranquillamente il miliardo.
ora, dici che ti blocchi dopo una trentina di secondi: quindi, guartda caso, intorno a millis() == 30.000! quindi è un problema di overflow!
dichiara a come unsigned long e tutto dovrebbe funzionare.
uwefed:
* non scrivere "if(millis()==(a+1000))"
se per caso salta proprio quel millisecondo a+1000 Ti aspetta il programma 49 giorni e qualche ora per avere la condizione corretta.
meglio "if(millis()>=(a+1000))"
Ciao Uwe
ottima idea, però a questo punto, mio caro vic_20, devi gestire lo sfaso:
non devi aumentare i secondi di uno, ma di (millis()-a)/1000, ed a non sarà più uguale a millis(), ma a millis() - (millis()-a)%1000.
certo, a questo punto cambia anche if(secondo==60) in if(secondo>=60), secondo lo stesso principio, e la stessa cosa per ore etc...
altro consiglio: non leggere millis() ogni volta, altrimenti anche lì crei un piccolo sfaso, leggilo una volta a inizio loop e poi usa il valore salvato.
edit: preceduto da leo, che ha dato i valori per gli int corretti :-)