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

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...
- 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) );
.
- 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???

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