Perche ???

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;
     }
     }

2 cose:

  • 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

provo subito........poi vedo

grazie

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 :-)

leo72: Non vorrei si fermass a 31 per il semplice fatto che stai usando un integer per memorizzare mills (int a). ...

Ups; non sono stato attento. Ciao Uwe

Grazie a tutti ora funziona perfettamente, a presto!