La scorsa settimana mi sono arrivati dei DS3231 RTC Module che avevo acquistato qualche tempo fa incuriosito dalle dimensioni ridotte.
Il DS3231 RTC Module è spesso in vendita, in questo formato, per RPi ossia Raspberry Pi ma risulta un modulo RTC utilizzabile con molti microcontrollori.
In passato hai letto un articolo dedicato al DS3231 RTC Module prodotto in formato differente, più grande, e probabilmente avere un modulo basato sul DS3231 dalle dimensioni contenute potrebbe essere interessante per il tuo progetto.
La versione che ho provato è dotato di un accumulatore saldato che riduce le dimensioni totali:
ed evita di dover acquistare una batteria tampone per utilizzarlo.
Collegamento del DS3231 RTC Module
il collegamento del DS3231 RTC Module è mediante protocollo I2C per cui su arduino utilizzi i pin A4 ed A5 oltre all’alimentazione.
Important!
Ricorda che il DS3231 deve essere alilmentato a 3,3v anche se il produttore indica 5v tollerant.
Lato arduino puoi utilizzare 4 cavi: rosso +5v, nero per il Gnd, Verde su A4 e Giallo su A5:
come mostrato in figura.
Il modulo RTC possiede invece 5 pin in sequenza adatta a montare il modulo sulla Raspberri Pi nei pin 1,3,5,7,9 infatti in corrispondeza del pin 7 ( GPIO 7 ) della RPi , sul modulo, trovi un NC:
Ecco come puoi mettere i collegamenti lato DS3231 Real Time Clock Module:
Installazione della libreria per DS3231 RTC
Librerie per il DS3231 RTC module ne trovi tante sia sul web sia nel repository arduino direttamente dall’IDE.
In passato ho utilizzato la RTClib di Adafruit, ho deciso di provare una RTC library differente per questo epserimento.
Apri il Gestore librerie:
nel campo “Search” inserisci DS3231 e troverai molte librerie tra cui:
quella di NeiroN.
Installata la nuova libreria puoi aprire uno dei sue esempi e nella prima parte dello sketch elimina il commento in corrispondenza della linea:
abiliti in questo modo l’utilizzo della libreria DS3231 creando l’oggetto rtc che userai per comunicare con il modulo RTC.
Al primo tentativo di compilazione ho ricevuto un errore di compilazione legato alla presenza della doppia libreria:
che crea un conflitto in quanto l’IDE trova prima la RTClib di Adafruit e poi la nuova di NeiroN.
Rimuovi una libreria IDE arduino
Rimuovere una libreria è ancora una operazione manuale che puoi eseguire da linea di comando su Mac o Linux.
Vai al path in cui la libreria è installata, è quello segnalato dall’IDE, nel mio caso:
/Users/mauroalfieri/Documents/Arduino/libraries/
e rimuovi la cartella RTClib in modo che l’unica libreria presente sia RTClib_by_NeiroN:
chiudi e riapri l’IDE e prova a compilare nuovamente lo sketch, questa volta la compilazione andrà a buon fine.
Aprendo il monitor seriale vedrai qualcosa di simile:
hai visto subito che non solo c’è una data ed ora errata ma l’anno risulta scritto in modo errato, procedi quindi a modificare lo sketch commentando le linee 18-24:
e aggiungendo la linea 25 che comprenderai leggendo la descrizione riportata sotto.
Carica lo sketch sul DS3231 RTC Module ed apri il monitor seriale:
adesso data ed ora sono corretti, ma ricorda di sostituire lo sketch con quello originale altrimenti otterrai che ad ogni reset arduino la data e l’ora saranno reimpostate a quella iniziale.
Lo sketch DS3231 RTC Module
Di seguito lo sketch che ho caricato sul mio IDE
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib #include <Wire.h> #include "RTClib.h" //DS1307 rtc; //RTC_Millis rtc; DS3231 rtc; //PCF8563 rtc; //PCF8583 rtc; //DS1302 rtc(CE_PIN,SCK_PIN,IO_PIN); //DS1302 rtc;// CE_PIN 4, SCK_PIN 5, IO_PIN 6 as default void setup () { Serial.begin(57600); Wire.begin(); rtc.begin(); /* if (! rtc.isrunning()) { Serial.println("RTC is NOT running!"); // following line sets the RTC to the date & time this sketch was compiled rtc.adjust(DateTime(__DATE__, __TIME__)); } */ rtc.adjust(DateTime(__DATE__, __TIME__)); } void loop () { DateTime now = rtc.now(); char buf[100]; strncpy(buf,"DD.MM.YYYY hh:mm:ss\0",100); Serial.println(now.format(buf)); delay(1000); }
linee 03-04: includi le librerie Wire e RTClib necessarie al controllo del DS3231 attraverso l’I2C;
linea 08: elimina il commento “//” da questa linea per indicare che l’oggetto rtc è istanza di DS3231;
linee 15-17: usa i metodi begin() per impostare la comunicazione Seriale, I2C e RTC;
linee 18-24: sono le linee che ti permetterebbero di impostare l’orario sul DS3231 RTC module se non fosse già stato impostato; poiché il mio modulo possedeva già un orario è sttao necessario commentarle ed aggiungere la linea 25 per impostare data ed ora;
linea 25: imposti, forzatamente, la data e l’ora dell’RTC prendendo l’informazione dal computer su cui hai compilato lo sketch. Tale linea va tolta dopo il primo invio e ricaricato lo sketch per evitare che ad ogni setup venga reimpostata data ed ora sbagliata;
linea 29: crea l’istanza now di tipo DateTime ed assegnagli il valore restituito dal metodo now() della libreria RTClib;
linea 30: imposta un buffer “buf” di 100 posizioni in cui memorizzare il formato della stringa da visualizzare;
linea 31: usa il comando strncpy per copiare nella variabile buf il formato di stringa: “DD.MM.YYYY hh:mm:ss\0”;
linea 32: scrivi sul monitor seriale il risultato del metodo now.format(buf) in cui:
- now rappresenta l’istanza contenente i dati;
- buf rappresenta il formato in cui desideri visualizzare i dati;
- format è il metodo della libreria RTClib per DS3231 RTC module che formatta il dato come insicato nella stringa buf;
linea 33: attendi 1000 millisecondi prima di ripetere il loop()
Ed il risultato che ottieni è simile al seguente:
ecco il progetto montato sulla mia basetta di test:
2 commenti
Tutto è chiaro ma forse non ho capito bene qualche passaggio perchè non riesco a risolvere un problema che spiego. Nel mio circuito tutto funziona bene fino a quando il modulo RTC SD3231 rimane al suo posto. Ma, volendo avere la possibilità di usare il sistema “senza date ” e fare affidamento solo sull’istruzione millis(), nel caso in cui il modulo venga rimosso o sia mal collegato, ho usato le righe di codice:
if (!rtc.begin()) {
Serial.println(“Errore! Verifica le connesioni!”);
Serial.println(“RTC non trovato”);
}
else
{
Serial.println(“RTC trovato”);
delay(1000);
}
Se stacco l’RTC il controllo if viene superato , sul video seriale vine riportato il messaggio “RTC trovato” e poi il sistema si inchioda. Probabilmente perchè le istruzioni successive si rivolgono ad un RTC che non esiste. C’è un modo per evitare questo?
Grazie .
Autore
Ciao Salvatore,
se stacchi l’RTC mi aspetto che fallisca il controllo e che tu veda a video il messaggio “Errore! Verifica…” e successivamente “RTC non trovato” dovrei riguardare la libreria, per sicurezza, ma il messaggio di “RTC trovato” non dovrebbe comparire.