Cosa devi sapere per usare un real time clock DS1307
Considero molto utile avere un dispositivo che permetta di tenere traccia del tempo e della data, poiché in molti progetti, come quelli della domotica, richiedono un sistema per recuperare queste informazioni. Avere un circuito che mi garantisca, anche in mancanza di alimentazione, un riferimento temporale sicuro è fondamentale.
Tipicamente, l’integrato che viene utilizzato maggiormente, in campo hobbistico, è il DS1307. Le sue caratteristiche tecniche sono le seguenti
Caratteristiche | conteggio in secondi, minuti, ore, giorno della settimana, giorno del mese, mese, anno. |
Interfaccia | bus I2C |
RAM | 56 byte aggiuntivi di memoria utente |
Altre uscite | Possibilità di generare un onda quadra di 1Hz, 4096KHz, 8192KHz, 32768KHz |
ha un costo contenuto, circa 2.5€, è disponibile sia in package THT(Through-Hole Technology) sia in SMD, in versioni con standard industriali (temperature di esercizio da -40 a +85 °C).
Anche utilizzarlo è risultato semplice, vista la possibilità di colloquiare tramite bus I2C. Una volta realizzato il circuito seguente, scriviamo alcun istruzioni per settare i registri del DS1307 in modo da impostare la data e l’ora.
La struttura di questi registri è la seguente:
mentre le istruzioni le trovate di seguito
//includo la libreria per la //comunicazione su bus I2C #include <Wire.h> void setup() { //inizializzo la libreria Wire.begin(); //attivo la comunicazione con il DS1307 //l'indirizzo dell'RTC è 0x68 Wire.beginTransmission(0x68); //il primo byte stabilisce il registro //iniziale da scivere Wire.write((byte)0x00); //specifico il tempo e la data Wire.write((byte)0x00); //1° byte SECONDI da 0x00 a 0x59 Wire.write((byte)0x10); //2° byte MINUTI da 0x00 a 0x59 Wire.write((byte)0x80 | 0x10); //3° byte ORE da 0x00 a 0x23 Wire.write((byte)0x01); //4° byte GIORNO della settimana da 0x01 a 0x07 Wire.write((byte)0x21); //5° byte GIORNO del mese da 0x01 a 0x31 Wire.write((byte)0x03); //6° byte MESE da 0x01 a 0x12 Wire.write((byte)0x12); //7° byte ANNO 0x00 a 0x99 Wire.endTransmission(); } void loop() { delay(100); }
Per poter recuperare le informazioni è sufficiente eseguire una lettura in sequenza dei primi 7 byte, partendo dall’indirizzo 0x00
//includo la libreria per la //comunicazione su bus I2C #include <Wire.h> void setup() { //inizializzo la seriale Serial.begin(9600); //inizializzo la libreria Wire.begin(); //attivo la comunicazione con il DS1307 //l'indirizzo dell'RTC è 0x68 Wire.beginTransmission(0x68); //il primo byte stabilisce il registro //iniziale da scivere Wire.write((byte)0x00); //specifico il tempo e la data Wire.write((byte)0x00); //1° byte SECONDI da 0x00 a 0x59 Wire.write((byte)0x10); //2° byte MINUTI da 0x00 a 0x59 Wire.write((byte)0x80 | 0x10); //3° byte ORE da 0x00 a 0x24 Wire.write((byte)0x01); //4° byte GIORNO della settimana da 0x01 a 0x07 Wire.write((byte)0x21); //5° byte GIORNO del mese da 0x00 a 0x31 Wire.write((byte)0x03); //6° byte MESE da 0x00 a 0x12 Wire.write((byte)0x12); //7° byte ANNO 0x00 a 0x99 Wire.endTransmission(); } void loop() { //inizzializza la trasmissione partendo //dall'indirizzo 0x00 Wire.beginTransmission(0x68); Wire.write((byte)0x00); Wire.endTransmission(); //richiedo 7 byte dal dispositivo con //indirizzo 0x68 Wire.requestFrom(0x68, 7); //regupero i 7 byte relativi ai //corrispondenti registri byte secondi = Wire.read(); byte minuti = Wire.read(); byte ora = Wire.read(); byte giorno_sett = Wire.read(); byte giorno_mese = Wire.read(); byte mese = Wire.read(); byte anno = Wire.read(); Serial.print("Orario corrente: "); Serial.print(ora, HEX); Serial.print(":"); Serial.print(minuti, HEX); Serial.print(":"); Serial.println(secondi, HEX); Serial.print("Giorno della settimana: "); Serial.println(giorno_sett, HEX); Serial.print("Data corrente: "); Serial.print(giorno_mese, HEX); Serial.print("/"); Serial.print(mese, HEX); Serial.print("/"); Serial.println(anno, HEX); Serial.println(); delay(1000); }
La batteria tampone, tipicamente una CR2032, garantisce un back-up di circa 6 mesi.
Delocalizzare la gestione dell’orario su un chip esterno permette di concentrare le risorse dell’Arduino su altri processi e allo stesso tempo di impiegare in modo veloce e semplice il bus I2C per recuperare le informazioni di tempo e data.
Realizzare automatismi basati sul DS1307 è risultato molto economico e semplice, vi invito quindi ad acquistare direttamente il chip piuttosto che i kit già assemblati che attualmente si aggirano tra gli 8€ e i 15€.