Pages: [1]   Go Down
Author Topic: Aiuto per l'uso della libreria Time  (Read 1259 times)
0 Members and 1 Guest are viewing this topic.
Rome
Offline Offline
Sr. Member
****
Karma: 9
Posts: 371
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti,  smiley
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 smiley-red.
Grazie in anticipo a chiunque vorrà dedicarmi del tempo smiley.

Riccardo
Logged

Riccardo

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Rome
Offline Offline
Sr. Member
****
Karma: 9
Posts: 371
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Riccardo

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tempo fa usai la lib RTClib di Adafruit:
https://github.com/adafruit/RTClib
Andava bene ed era semplice nell'uso. Se devi solo leggere/modificare l'ora del DS1307 potrebbe bastarti.
Logged


Rome
Offline Offline
Sr. Member
****
Karma: 9
Posts: 371
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Riccardo

Tuscany
Offline Offline
Edison Member
*
Karma: 68
Posts: 1995
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Rome
Offline Offline
Sr. Member
****
Karma: 9
Posts: 371
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Riccardo

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

scusate se insisto, la Time.h vorrei proprio capirla...
Non possiamo metterci a studiare il codice completo per poi rispiegartelo a te  smiley-wink
Al max chiedi i punti del codice poco chiari che vediamo di dargli un'occhiata.
Logged


Tuscany
Offline Offline
Edison Member
*
Karma: 68
Posts: 1995
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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);
Logged

Rome
Offline Offline
Sr. Member
****
Karma: 9
Posts: 371
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non possiamo metterci a studiare il codice completo per poi rispiegartelo a te  smiley-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:

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

Code:
#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()  smiley-eek

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

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




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...  smiley-cry smiley-cry smiley-cry smiley-cry

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

Riccardo
Logged

Riccardo

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-wink
Se avessi aperto tutti i file, avresti trovato in time.h la seguente riga:
Code:
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.

Quote
All'inizio: time_t processSyncMessage()  smiley-eek

poi:        time_t pctime = 0;  ma "pctime" non è definita da nessuna parte, appare all'improvviso e non capisco  smiley-red
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.

Quote
ed ancora: pctime = (10 * pctime) + (c - '0') ; // convert digits to a number Sempre più oscuro sommo dei numeri a dei caratteri?  smiley-roll-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.


Quote
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.

Quote

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...  smiley-cry smiley-cry smiley-cry smiley-cry

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  smiley-wink
Logged


Rome
Offline Offline
Sr. Member
****
Karma: 9
Posts: 371
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Riccardo

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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...  smiley-razz
Logged


Rome
Offline Offline
Sr. Member
****
Karma: 9
Posts: 371
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Io sono del 70, a scuola usavamo il pascal 4,0 era più o meno nel giurassico...  smiley-lol
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.
Logged

Riccardo

Pages: [1]   Go Up
Jump to: