funzione visualizzazione orario

Ciao a tutti,
nel mio sistema il tempo giornaliero è espresso in secondi totali (per semplicità di gestione delle varie attuazioni), ex:
08:30 --> 30600 s

volevo costruire una funzione che mi permetta di visualizzare a display l'orario scritto non in secondi ma nel formato standard, ex:

time=30600;
lcd.print(function(time)); ----> visualizza a display 08:30.

mi aiutate a costruirla?

grazie.

Puoi farlo in 3 modi:

  1. funzione a cui passi 4 parametri, il primo il tempo in secondi, mentre gli altri 3 saranno in risposta le singole parti dell'ora, hh,mm,ss che poi stamperai con varie print
void Sec2Time(unsigned long sec,byte *phh, byte *pmm, byte *pss)
{ byte hh,mm,ss;
  hh = sec/3600UL;    // quante ore
  sec = sec-hh*3600UL;  
  mm = sec/60;           // quanti minuti
  ss = sec-mm*60;  
  *phh=hh;               // scrivo i valori calcolati all'esterno della funzione
  *pmm=mm;
  *pss=ss;
}

La userai così:

time=30600;
Sec2Time(time,hh,mm,ss);
// ----> visualizza a display 08:30:00
lcd.print(hh);
lcd.print(':');
lcd.print(mm);
lcd.print(':');
lcd.print(ss);

P.S. codice non testato, scritto al volo

nid69ita , rispondi sempre a me perchè ho anch'io la foto del gatto??? :slight_smile: :slight_smile:
grazie!

volevo evitare di mettere nel corpo del programma la sequenza di lcd.print poichè sto costruendo un menù per il settaggio del sistema via display e tastierino, e volevo accorpare tutto in un unica funzione, non so se mi sono spiegato....

cioè nel corpo del programma tra i vari case inserire solo lcd.print(function(time));
poi il resto lo deve fare la funzione...

  1. tre funzioni distinte per prendere solo ora,minuti e secondi Sec2HH, Sec2MM e Sec2SS
    Le userai così:
time=30600;
// ----> visualizza a display 08:30:00
lcd.print( Sec2HH(time) );
lcd.print(':');
lcd.print( Sec2MM(time) );
lcd.print(':');
lcd.print( Sec2SS(time) );

.

  1. funzione che calcola HH:MM:SS come testo è un pò più complicato. Devi avere un piccolo buffer (array di testo) da passare alla funzione per contenere il testo
    La userai così:
time=30600;
// ----> visualizza a display 08:30:00
char buf[9];  // 8 caratteri + fine stringa
Sec2Ora(time,buf,sizeof(buf));
lcd.print( buf );
void Sec2Ora(unsigned long ptime, char pbuf[],byte lpen)
{ byte hh,mm,ss; 
  // calcola le singole parti come sopra
  ...
  //
  snprintf(pbuf,plen,"%02d:%02d:%02d",hh,mm,ss);
}

Matt86:
nid69ita , rispondi sempre a me perchè ho anch'io la foto del gatto??? :slight_smile: :slight_smile:
grazie!
volevo evitare di mettere nel corpo del programma la sequenza di lcd.print poichè sto costruendo un menù per il settaggio del sistema via display e tastierino, e volevo accorpare tutto in un unica funzione, non so se mi sono spiegato....
cioè nel corpo del programma tra i vari case inserire solo lcd.print(function(time));
poi il resto lo deve fare la funzione...

Si, ma è un pò complicato. Cioè non tanto come codice ma il problema è che bisogna creare un buffer temporaneo dinamicamente dentro la funzione e siccome la memoria SRAM di Arduino è poca c'e' il rischio di riempirla e avere grossi problemi come capita con la libreria String.

Si potrebbe fare una cosa "bruttina" partendo da esempio 3 che diventa 4 caso

  1. funzione che calcola HH:MM:SS come testo è un pò più complicato. Devi avere un piccolo buffer (array di testo) da passare alla funzione per contenere il testo e il buffer stesso viene passato alla print
    La userai così:
time=30600;
// ----> visualizza a display 08:30:00
char buf[9];  // magari dichiarato tra le variabili globali una unica volta, la userai per tutte le Sec2Ora che chiamerai
lcd.print( Sec2Ora(time,buf,sizeof(buf)) );
char * Sec2Ora(unsigned long ptime, char * pbuf, byte plen)
{ byte hh,mm,ss; 
  // calcola le singole parti come sopra
  ...
  //
  snprintf(pbuf,plen,"%02d:%02d:%02d",hh,mm,ss);
  return(pbuf)
}