Categories: Arduino

MH Real Time Clock Modules 2 DS1302, un orologio per Arduino

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

Arduino e il modulo MH Real Time Clock Modules 2 DS1302

 

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

Lettura della seriale

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

Alessandro Oppo

Alessandro è un milanese che vorrebbe scappare da Milano, è appassionato di informatica ma vorrebbe vivere senza telefono, è un artigiano eppure vorrebbe robotizzare tutto, impara una cosa e già vorrebbe studiare dell’altro. Autodidatta da sempre, gli piace sbattere la testa finché tutto non funziona come vuole lui, spesso ci riesce anche! Visita il suo blog personale alexoppo.com Il motto che si ripete dentro la testa è: “Se ci sono riusciti gli altri ci posso riuscire anche io”.

View Comments

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

  • 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

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

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

Recent Posts

Ponti sospesi: cosa abbiamo sbagliato? cosa si potrebbe fare?

Poco prima di Natale ho avuto la fortuna di poter partecipare a un evento chiamato…

11 mesi ago

Siamo quel che facciamo? – racconto breve

Armando quel giorno era particolarmente stanco. Tutto, per quanto andasse bene, sembrava metterlo sotto pressione.…

1 anno ago

Il limite è sempre la mente – Racconto breve

Armando guardò l’orologio e vide il proprio riflesso sul quadrante bianco. Il riflesso però non…

1 anno ago

L’ultimo giorno del carcere – Racconto breve

I muri sono muri, lo sono sempre, anche quando le porte sono aperte. Era la…

1 anno ago

Riflessioni sul carcere

Pochi di noi riflettono sull’esistenza nella nostra società del carcere. Il carcere è la concretizzazione…

1 anno ago

Come dovremmo dialogare secondo me

Spesso intraprendiamo delle conversazioni e delle chiacchierate piuttosto inconsapevolmente. Voglio dire che non siamo molto…

1 anno ago