Oggi vedremo come far funzionare questo interessante modulo, ovvero il MH Real-Time Clock Modules 2 DS1302 che, come ci dice il nome stesso, è basato sul chip DS1302, che fornisce la data e l’ora attuali ad Arduino. Un semplice orologio, direte voi, ma indispensabile quando si voglia tenere traccia del tempo che scorre.
Il vantaggio di questo modulo è che può mantenere l’ora anche per più anni, quindi anche se lo staccheremo dall’Arduino, se con la sua batteria CR2032, manterrà la corretta data.
Utilizzeremo per il funzionamento la libreria DS1302.h di rinkydinkelectronics.com scaricabile dal loro sito. Per installare una libreria vi rimando a questo articolo.
I collegamenti
VCC – 5v
GND – GND
CLK(SCLK) – Pin digitale 4
DAT(I/O) – Pin digitale 3
RST(CE) – Pin digitale 2
Sketch Serial_Easy
Vedremo ora l’esempio DS1302_Serial_Easy incluso nella libreria commentato nei passaggi più importanti.
// DS1302_Serial_Easy // Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved // web: http://www.RinkyDinkElectronics.com/ // // A quick demo of how to use my DS1302-library to // quickly send time and date information over a serial link // // I assume you know how to connect the DS1302. // DS1302: CE pin -> Arduino Digital 2 // I/O pin -> Arduino Digital 3 // SCLK pin -> Arduino Digital 4 #include <DS1302.h> // Init the DS1302 DS1302 rtc(2, 3, 4); void setup() { // Set the clock to run-mode, and disable the write protection rtc.halt(false); rtc.writeProtect(false); // Setup Serial connection Serial.begin(9600); // The following lines can be commented out to use the values already stored in the DS1302 rtc.setDOW(SUNDAY); // Set Day-of-Week to FRIDAY rtc.setTime(10, 13, 0); // Set the time to 12:00:00 (24hr format) rtc.setDate(17, 06, 2018); // Set the date to August 6th, 2010*/ } void loop() { // Send Day-of-Week Serial.print(rtc.getDOWStr()); Serial.print(" "); // Send date Serial.print(rtc.getDateStr()); Serial.print(" -- "); // Send time Serial.println(rtc.getTimeStr()); // Wait one second before repeating :) delay (1000); }
13 Inclusione della libreria DS1302.h
16 Creazione dell’oggetto rtc di tipo DS1302 con costruttore parametrico. I tre parametri sono i numeri dei pin utilizzati.
21-22 Tolgono la modalità ‘sola lettura’
25 Metodo dell’oggetto Serial necessario per la comunicazione via seriale
28-30 PRESTARE ATTENZIONE Queste tre righe servono ad impostare sull’orologio la data che vogliamo dargli. Una volta caricato lo sketch la data verrà impostata (modificatelo con la data attuale), a quel punto commentate queste tre righe ponendo un // davanti, in questo modo le volte successive non reimposterà la data ma utilizzerà quella precedentemente settata. Consiglio, al fine di una regolazione al secondo, di caricare lo sketch con un orario di un minuto in avanti e di aprire la comunicazione via seriale nell’esatto momento in cui scatta il minuto. L’avvio della porta seriale riavvierà l’Arduino e quindi l’orario coinciderà esattamente con quello reale.
36 Stampa del giorno della settimana
40 Stampa della data
44 Stampa dell’ora
Sketch Serial_Hard
Vediamo ora il secondo esempio chiamato DS1202_Serial_Hard
// DS1302_Serial_Hard // Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved // web: http://www.RinkyDinkElectronics.com/ // // A quick demo of how to use my DS1302-library to // retrieve time- and date-date for you to manipulate. // // I assume you know how to connect the DS1302. // DS1302: CE pin -> Arduino Digital 2 // I/O pin -> Arduino Digital 3 // SCLK pin -> Arduino Digital 4 #include <DS1302.h> // Init the DS1302 DS1302 rtc(2, 3, 4); // Init a Time-data structure Time t; void setup() { // Set the clock to run-mode, and disable the write protection rtc.halt(false); rtc.writeProtect(false); // Setup Serial connection Serial.begin(9600); // The following lines can be commented out to use the values already stored in the DS1302 /* rtc.setDOW(FRIDAY); // Set Day-of-Week to FRIDAY rtc.setTime(12, 0, 0); // Set the time to 12:00:00 (24hr format) rtc.setDate(6, 8, 2010); // Set the date to August 6th, 2010 */ } void loop() { // Get data from the DS1302 t = rtc.getTime(); // Send date over serial connection Serial.print("Today is the "); Serial.print(t.date, DEC); Serial.print(". day of "); Serial.print(rtc.getMonthStr()); Serial.print(" in the year "); Serial.print(t.year, DEC); Serial.println("."); // Send Day-of-Week and time Serial.print("It is the "); Serial.print(t.dow, DEC); Serial.print(". day of the week (counting monday as the 1th), and it has passed "); Serial.print(t.hour, DEC); Serial.print(" hour(s), "); Serial.print(t.min, DEC); Serial.print(" minute(s) and "); Serial.print(t.sec, DEC); Serial.println(" second(s) since midnight."); // Send a divider for readability Serial.println(" - - - - - - - - - - - - - - - - - - - - -"); // Wait one second before repeating :) delay (1000); }
Le prime righe sono uguali al primo codice.
19 Dichiarazione dell’oggetto t di tipo Time. Questo oggetto è una struttura adatta a contenere la data, l’ora, etc.
41 Inizializzazione di t con l’assegnazione del metodo getTime() dell’oggetto rtc. In pratica la data attuale contenuta nell’RTC viene passata alle variabili contenute all’interno della struttura t.
44-61 Stampa delle variabili di t tramite le classiche Serial.Print()
Spero che questo tutorial su come usare il modulo MH Real Time Clock Modules 2 DS1302 con Arduino vi sia stato utile. Per dubbi, domande o altro rimango a disposizione.
Grazie,
Alessandro
Il settaggio corretto della data quale è?
giorno, mese, anno
mese, giorno anno
//rtc.setDate(11, 28, 2018); // Set the date to August 6th, 2010
Ciao Flavio, effettivamente non l’ho scritto. rtc.setDate(17, 06, 2018); giorno, mese, anno.
Se ti serve altro chiedi pure.
Alessandro
Quando carichi lo sketch con l’orario impostato un minuto avanti poi avvii il monitor seriale nel preciso momento in cui sei sincronizzato, e fino qui ok, l’orologio comincia a contare dal momento che apri il monitor seriale. Poi si mettono le // per commentare le tre righe di codice relative ai settaggi di orario data formato ora e si ricarica lo sketch nuovamente, è corretto?
Esattamente! Se fai così dovresti spaccare il secondo! Fammi sapere se hai problemi.
Il monito seriale mi fa vedere questo, faccio copia e incolla:
Wednesday 28.11.2018 — 12:38:23
Monday 14.08.2012 — 09:22:12
Wednesday 28.11.2018 — 12:38:25
812:38:25 50.44.2006 — 04:14:09
Wednesday 28.11.2018 — 12:38:27
Monday 14.08.2012 — 09:22:14
Wednesday 28.11.2018 — 12:38:29
Monday 14.08.2012 — 09:22:18
Wednesday 28.11.2018 — 12:38:31
812:38:31 50.44.2006 — 04:14:12
Wednesday 28.11.2018 — 12:38:33
Monday 14.08.2012 — 09:22:20
Wednesday 28.11.2018 — 12:38:35
812:38:35 50.44.2006 — 04:14:13
Uhm strano. Immagino tu stia usando il primo sketch. Hai fatto qualche modifica?
Si, sto usando il primo sketch.
No, nessuna modifica.
Comunque,
questa riga è corretta Wednesday 28.11.2018 — 12:38:23
mentre questa non centra nulla Monday 14.08.2012 — 09:22:12
Sì, avevo notato. Una riga giusta e una sbagliata. Il modulo è identico a quello nella foto vero?
Si, il modulo è identico.
Ciao! Non so se sia il tuo vecchio commento che si è finalmente sbloccato o se tu abbia veramente scritto. In ogni caso è una anomalia che non so da cosa possa dipendere. Mi incolleresti il codice di tutto lo sketch su pastebin.com?
Buongiorno Alessandro,
grazie per la spiegazione esaustiva.
Esiste un modo per far apparire il giorno della settimana in Italiano? Lunedì, martedì….ecc.
Ho fatto una ricerca in rete, ma niente. Ho provato anche a riscrivere il DS1302.h sostituendo i vari #define con LUNEDI 1 ecc. ma niente.
Grazie
Ciao Fabio, dovresti aprire i file della libreria e guardare il metodo getDOWStr() come è stato scritto. Se ci sono i nomi in inglese lì dovrebbe essere possibile modificarli. Fammi sapere.