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

Pin | Descrizione |
---|---|
Vcc | Alimentazione tra i 3.3V e i 5V |
GND | Massa |
SCL | Clock dell’interfaccia I2C |
SDA | Dati interfaccia I2C |
BAT | Possibile alimentazione di backup esterna alla batteria presente on board. |
SQW | Fornisce un segnale ad onda quadra programmabile tra 1Hz, 4kHz, 8kHz e 32kHz. |
DS | Non 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.
Board | Pin I2C (Two Wire) |
---|---|
Uno, Ethernet | A4 (SDA), A5 (SCL) |
Mega2560 | 20 (SDA), 21 (SCL) |
Leonardo | 2 (SDA), 3 (SCL) |
Due | 20 (SDA), 21 (SCL), SDA1, SCL1 |
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.
Commentati Recentemente