Interfacciare modulo DS1307 con Arduino

Interfacciare modulo DS1307 con Arduino
Interfacciare modulo DS1307 con Arduino

In questo articolo ti mostro come interfacciare un modulo RTC (Real Time Clock) DS1307 con Arduino.

Spesso e volentieri, quando lavoriamo con Arduino, la gestione del tempo inteso come data ed ora corrente non è di fondamentale importanza.
Abbiamo funzioni per conoscere e gestire la durata del tempo fino all’ordine dei micro secondi ma una volta spento l’Arduino tutto viene perso. Ecco che il modulo DS1307 conosciuto anche come Tiny RTC module può venirci in aiuto.

DS1307 Tiny RTC Module

Prende il nome dal chip DS1307 installato sopra, che è effettivamente colui che si occupa della gestione del tempo. Si collega ad Arduino tramite l’ormai nota interfaccia I2C (Two Wire) e sfrutta una batteria CR2032 per mantenere le informazioni in memoria.

Dalle dimensioni veramente ridotte questo componente si presta per molti progettini che hanno a che fare con il tempo, come ad esempio orologi, data logger, timer ed allarmi.

In questo articolo mi limiterò a trattare una configurazione base senza scendere troppo nei dettagli e senza sfruttare al massimo le sue potenzialità. Per quello ho già in mente un altro progetto.

DS1307 Pinout

Come ho già detto il modulo sfrutta l’interfaccia I2C, quindi troveremo on board i soliti pin per il clock e lo scambio dati, rispettivamente SCL e SDA. Può essere alimentato con tensioni dai 3.3V ai 5V il che lo rende ancora più versatile. Oltre a questi pin ve ne sono altri (non sfruttati in questo esempio).

Modulo RTC DS1307
PinDescrizione
VccAlimentazione tra i 3.3V e i 5V
GNDMassa
SCLClock dell’interfaccia I2C
SDADati interfaccia I2C
BATPossibile alimentazione di backup esterna alla batteria presente on board.
SQWFornisce un segnale ad onda quadra programmabile tra 1Hz, 4kHz, 8kHz e 32kHz.
DSNon tutti sanno che il modulo presenta la predisposizione per un sensore di temperatura a bordo. Questo pin fornisce il segnale del sensore.

Codice

Anche in questo caso mi sono avvalso di una libreria Adafruit molto completa ed aggiornata. Se non l’hai già installata puoi cercarla con il termine RTCLib da gestione librerie.

Il codice come sempre è ampiamente commentato e di facile comprensione, unica cosa che potrà sembrarti strana sarà la comparsa di due nuove variabili fin ora mai sfruttate nei miei progetti. Parliamo di __DATE__ e __TIME__ che in fase di compilazione dello sketch vengono popolate con la data e l’orario corrente del pc.

/*
   Interfacciare modulo DS1307 con Arduino

   Autore  : Andrea Lombardo
   Web     : http://www.lombardoandrea.com
   Post    : https://wp.me/p27dYH-PA
*/

//Inclusione libreria
#include "RTClib.h"

//Creo istanza modulo DS1307
RTC_DS1307 rtc;

void setup () {

  //Avvia comunicazione seriale
  Serial.begin(9600);

  //Aspetto che venga aperto il Serial Monitor prima di andare avanti
  while (!Serial) {
    //elimina questo ciclo while in produzione
  }

  //Inizializza comunicazione I2C con il modulo
  rtc.begin();

  /*
    Quando il modulo viene acceso per la prima volta o risulta essere sconfigurato
    a causa della perdita della memoria (esempio batteria scarica)
    questo metodo restituisce false
  */
  if (!rtc.isrunning()) {
    Serial.println("Setto data e ora corrente:");
    Serial.println(F(__DATE__));
    Serial.println(F(__TIME__));

    /*
      Il metodo adjust serve a settare la nuova data ed il nuovo orario
      nel modulo.
    */
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }

}

void loop () {

  /*
    Il metodo now() restituisce un oggetto di tipo DateTime
    che grazie ai suoi metodi restituisce le varie parti
    della data/ora.
  */
  DateTime adesso = rtc.now();

  Serial.println("Data e ora corrente: ");
  Serial.print(prefixaZero(adesso.day()));
  Serial.print("/");
  Serial.print(prefixaZero(adesso.month()));
  Serial.print("/");
  Serial.print(adesso.year());
  Serial.print(" ");
  Serial.print(prefixaZero(adesso.hour()));
  Serial.print(":");
  Serial.print(prefixaZero(adesso.minute()));
  Serial.print(":");
  Serial.print(prefixaZero(adesso.second()));
  Serial.print(" ");
  /*
    Ho utilizzato una forma "contratta" per dire:
    Se il metodo isPM() restituisce True scrivi "PM", altrimenti scrivi "AM"
  */
  Serial.println(adesso.isPM() ? "PM" : "AM");
  Serial.println("- - - - - - - - - - -");

  delay(1000);
}

/*
  Ho creato una funzione per aggiungere lo zero iniziale
  a tutti i numeri inferiori di 10 perché mi piacciono di più

  ATTENZIONE:
  Naturalmente questa funzione restituisce una stringa e non
  un numero, quindi se dovete effettuare operazioni matematiche
  usate il valore originale.

  Questa potrebbe essere comoda per stampare valori sul display per esempio
*/
String prefixaZero(uint8_t numero) {
  if (numero < 10) {
    return "0" + String(numero);
  }
  return String(numero);
}

Lo schema

Anche in questo caso lo schema è semplicissimo, unica cosa da tenere a mente sono i pin SDA e SCL che nel caso di altre versioni di Arduino, possono essere differenti dai pin A4 e A5.

BoardPin I2C (Two Wire)
Uno, EthernetA4 (SDA), A5 (SCL)
Mega256020 (SDA), 21 (SCL)
Leonardo2 (SDA), 3 (SCL)
Due20 (SDA), 21 (SCL), SDA1, SCL1
Pin I2C varie versioni di Arduino
Collegare modulo DS1307 con Arduino
Schema di collegamento modulo DS1307

Conclusioni

Questo è solo un piccolo esempio di come realizzare una configurazione di base.
Grazie a questo modulo potremo costruire applicazioni che implicano l’utilizzo di date e orari, come ad esempio orologi, timer, data logger (e un’altra cosa che per adesso non vi dico perché se avrò tempo sarà un futuro progetto interessante).

In un prossimo articolo vedremo come è possibile regolare l’orario non solo tramite l’IDE di Arduino ma anche a progetto ultimato e quindi svincolato dal programmatore del PC.

A fine pagina trovi il link per scaricare il pacchetto con codici e schemi di collegamento. Come sempre ti ricordo che acquistando prodotti Amazon passando attraverso i link del mio sito, io percepisco una piccola commissione (parliamo di centesimi) in buoni regalo. Questi buoni sommati alle eventuali donazioni PayPal, servono a mantenere attivo il sito web e ad acquistare nuovi componenti.


Potrebbero interessarti anche...

Available for Amazon Prime