Aiuto per l'uso della libreria Time

Ciao a tutti, :slight_smile:
per motivi che non sto a raccontare, ho abbandonato per più di un anno un progettino che stavo portando avanti insieme ad un amico ("mechrekt" su questo forum) che consisteva in un piccolo controller per acquari (l’ennesimo penseranno molti) costituito a grandi linee da un Diplay (HD44780 + PCF8574), un RTC (DS1307), 5 tasti letti anch’essi attraverso un PCF8574, una scheda relè pilotata con shiftregister e un paio di sensori di temperatura, nulla di eccezionale tanto che io neofito alle primissime armi con arduino ero riuscito insieme a mechrekt a scrivere uno sketch che attraverso una serie di menù e sottomenù settava ora e date dell’RTC, orari di accensione e spegnimento di due linee di strip led con effetto di fading per alba e tramonto separati e altre piccole subroutine, all’epoca l’IDE era lo 022.

Tre giorni fa ho finalmete ripreso tutto in mano, scaricato il nuovo IDE e con sorpresa mi accorgo che sono cambiate molte cose, quella che più mi sta a cuore però per il momento è la libreria Time.h, prima usavo con successo la vecchia DS1307.h

Da tre giorni cerco di capire da solo come funziona, ed in parte ora mi è chiaro come acquisire il tempo dall’RTC, ma come inviargli i dati attraverso “time_t t” proprio non lo capisco, continuo a cercare di capire l’esempio della libreria “TimeRTCSet” ma proprio non capisco:

time_t e t sono variabili fisse della libreria?

Che tipo di variabili sono?

Se nella mia procedura acquisivo i dati per aggiornare giorno, mese, anno, ora e minuti utilizzando/leggendo i tasti che preme l’utente (io), come faccio a raggrupparli tutti in time_t t?

Qualcuno per favore ha la pazienza di spiegarmi o risolvere i miei dubbi?
A parte gli esempi della libreia, sapete dove posso acquisire per studio altri esempi?

O provato a leggere i post nei forum stranieri, ma le lingue non sono il mio forte :blush:.
Grazie in anticipo a chiunque vorrà dedicarmi del tempo :).

Riccardo

Intanto di quale libreria stiamo parlando? Di questa?
http://arduino.cc/playground/Code/Time

Ma ti servono tutte le funzioni di quella libreria? Se devi gestire solo un DS1307 esistono librerie più semplici e magari già aggiornate alla versione 1.x dell'IDE.

Cmq time_t è un unsigned long, forse tiene il timestamp.

Si la libreria è proprio quella, ed in effetti la sua funzione now(), mi permetterebbe di semplificare a se a costo di una copiosa riscrittura, una buona fetta del mio sketch.
Io in effetti poi usavo come libreria la DS1307.h, ma non ho trovato nessun aggiornamento.

Se time_t è unsigned long e contiene il timestamp, allora io dovrei convertire i miei dati in timestamp ed inviarli all'RTC giusto?

Se è veramente così allora nel mio caso questa libreria complica un pochino le cose...

Ad ogni modo grazie.

Riccardo

Tempo fa usai la lib RTClib di Adafruit:

Andava bene ed era semplice nell'uso. Se devi solo leggere/modificare l'ora del DS1307 potrebbe bastarti.

In effetti è un tentativo da fare,
ma prima dovrei verificare che sia compatibile con l'IDE versione 1.0.1, quindi riscrivere le mie procedure in base ai nuovi comandi ed alla fine mi troverei cmq con una libreria vecchia che a buon bisogno se esce l'IDE 1.0.2 smette anchessa di funzionare...
Ecco perché vorrei comunque capire come funziona la libreria Time.h, è pur sempre un'approfondimento personale.

Grazie

Riccardo

Comunque la libreria DS1307.h e' stata aggiornata
http://www.escortoutcall.org/bbs/forum.php?mod=viewthread&tid=745&page=1

Qui il link diretto http://bricofoy.free.fr/forums/arduino/DS1307.zip

Grazie infinite,
io non l'avevo trovata,
domani la provo di sicuro, ma scusate se insisto, la Time.h vorrei proprio capirla...

Grazie anche a te.

Riccardo

riciweb:
scusate se insisto, la Time.h vorrei proprio capirla...

Non possiamo metterci a studiare il codice completo per poi rispiegartelo a te :wink:
Al max chiedi i punti del codice poco chiari che vediamo di dargli un'occhiata.

Se nella mia procedura acquisivo i dati per aggiornare giorno, mese, anno, ora e minuti utilizzando/leggendo i tasti che preme l’utente (io), come faccio a raggrupparli tutti in time_t t?

la libreria dice questo :
setTime(hr,min,sec,day,mnth,yr); // alternative to above, yr is 2 or 4 digit yr (2010 or 10 sets year to 2010)

poi per passare il dato al DS1307
RTC.set(t);

leo72:
Non possiamo metterci a studiare il codice completo per poi rispiegartelo a te :wink:

Ci mancherebbe,
quello ch proprio non mi è chiaro è appunto come viene usato e come si compone "time_t" e "t"

Nell'esempio della libreria "TimeRTCSet", nel void loop appare:

if(Serial.available())
  {
     time_t t = processSyncMessage();
     if(t >0)
     {
        RTC.set(t);   // set the RTC and the system time to the received value
        setTime(t);          
     }
  }

Esattamente non capisco la riga:

time_t t = processSyncMessage();

"time_t" da quello che mi dici dovrebbe essere una unsigned long, ma con la "t" davanti cosa significa?
Foste che sia "time_t" che "t" sono uguali a "processSyncMessage()" ?

Poi anche su "processSyncMessage()" ho diversi dubbi:

#define TIME_MSG_LEN  11   // time sync to PC is HEADER followed by unix time_t as ten ascii digits
#define TIME_HEADER  'T'   // Header tag for serial time sync message

time_t processSyncMessage() {
  // return the time if a valid sync message is received on the serial port.
  while(Serial.available() >=  TIME_MSG_LEN ){  // time message consists of a header and ten ascii digits
    char c = Serial.read() ; 
    Serial.print(c);  
    if( c == TIME_HEADER ) {       
      time_t pctime = 0;
      for(int i=0; i < TIME_MSG_LEN -1; i++){   
        c = Serial.read();          
        if( c >= '0' && c <= '9'){   
          pctime = (10 * pctime) + (c - '0') ; // convert digits to a number    
        }
      }   
      return pctime; 
    }  
  }
  return 0;
}

All'inizio: time_t processSyncMessage() :astonished:

poi: time_t pctime = 0; ma "pctime" non è definita da nessuna parte, appare all'improvviso e non capisco :blush:

ed ancora: pctime = (10 * pctime) + (c - '0') ; // convert digits to a number Sempre più oscuro sommo dei numeri a dei caratteri? :cold_sweat:

brunello:
la libreria dice questo :
setTime(hr,min,sec,day,mnth,yr); // alternative to above, yr is 2 or 4 digit yr (2010 or 10 sets year to 2010)

poi per passare il dato al DS1307
RTC.set(t);

Quindi setTime(t); e setTime(hr,min,sec,day,mnth,yr); si equivalgono????

Ragazzi, sono veramente sempre più confuso, insieme a mechrekt abbiamo scritto 1800 righe di codice "funzionante" ed ora almeno per ciò che mi riguarda, mi domando come ci sia riuscito... =( =( =( =(

Veramente un grazie di cuore a tutti per l'aiuto che mi state dando.

Riccardo

riciweb:
Esattamente non capisco la riga:

time_t t = processSyncMessage();

"time_t" da quello che mi dici dovrebbe essere una unsigned long, ma con la "t" davanti cosa significa?
Foste che sia "time_t" che "t" sono uguali a "processSyncMessage()" ?

La prima cosa per capire una libreria è.... studiarsela :wink:
Se avessi aperto tutti i file, avresti trovato in time.h la seguente riga:

typedef unsigned long time_t;

Come vedi, l'autore ridefinisce un tipo personale time_t dichiarandolo di tipo unsigned long.
A questo punto, time_t t significa esattamente unsigned long t.

All'inizio: time_t processSyncMessage() :astonished:

poi: time_t pctime = 0; ma "pctime" non è definita da nessuna parte, appare all'improvviso e non capisco :blush:

Come sopra. time_t è un nuovo tipo per cui può essere usato per tipizzare una variabile o il tipo di dati restituito da una funzione.

ed ancora: pctime = (10 * pctime) + (c - '0') ; // convert digits to a number Sempre più oscuro sommo dei numeri a dei caratteri? :cold_sweat:

Quando usi le virgolette singole, cioè ', il carattere contenuto al loro interno viene interpretato secondo il suo codice ASCII. '0' equivale al valore 48 perché il carattere 0 equivale al valore ASCII 48.

Quindi setTime(t); e setTime(hr,min,sec,day,mnth,yr); si equivalgono????

Non si equivalgono. Accettano 2 serie di parametri differenti. Se hai il timestamp, puoi passargli quello e la funzione estrarrà l'anno, il mese, il giorno, l'ora eccc.... da esso. Se hai i dati già calcolati, puoi passargli quelli.

Ragazzi, sono veramente sempre più confuso, insieme a mechrekt abbiamo scritto 1800 righe di codice "funzionante" ed ora almeno per ciò che mi riguarda, mi domando come ci sia riuscito... =( =( =( =(

Veramente un grazie di cuore a tutti per l'aiuto che mi state dando.

Riccardo

Piccola considerazione personale. Ti mancano le basi del linguaggio. Non puoi pensare di fare qualcosa di più complesso senza avere un minimo di conoscenze del C. Ti consiglio di scaricarti una di quelle guide gratuite online in italiano e di leggertela bene :wink:

Ciao Leo,
ti ringrazio veramente di cuore, in effetti la tua considerazione personale è veramente opportuna e giusta, quando ho scoperto Arduino, ho pensato con supponenza (ora me ne rendo conto), che scarse basi di programmazione imparate a scuola quando ancora esisteva il Pascal, sarebbero state più che sufficienti, farò come mi consigli...
Già in passato mi sei stato di grande aiuto con i puntatori e anche all'epoca il mio problema era sempre lo stesso: conoscenza troppo elementare della programmazione.
Non posso prorpio più ignorare la cosa e mi metto al lavoro, qualcosa ce l'ho, ma se hai qualche dritta di sicuro è ben accetta.

Grazie ancora.

Riccardo

Una vale l'altra, personalmente ne ho trovate una decina, più o meno complete. Alla fine, il linguaggio è quello.

PS:
se mi parli di aver fatto a scuola il Pascal, mi sa che siamo coetanei... :stuck_out_tongue:

Io sono del 70, a scuola usavamo il pascal 4,0 era più o meno nel giurassico... XD
Frequentavo il Fermi di Roma e in laboratorio avevamo gli olivetti m240 con monitor ai fosfori verdi, il massimo per lo storage erano i dischi da 5,25 a ripensarci mi viene la pelle d'oca.

Fine OT

Scusate e grazie ancora Leo.