DS3231 RTC Module

La scorsa settimana mi sono arrivati dei DS3231 RTC Module che avevo acquistato qualche tempo fa incuriosito dalle dimensioni ridotte.

DS3231 Real Time Clock Module 3 3 V 5 V con batteria Per

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:

DS3231 Real Time Clock Module Back

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.

Lato arduino puoi utilizzare 4 cavi: rosso +5v, nero per il Gnd, Verde su A4 e Giallo su A5:

DS3231 Real Time Clock Module Back arduino connect

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:

DS3231 Real Time Clock Module Back connect

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:

DS3231 Real Time Clock Module llibrary manager

 

nel campo “Search” inserisci DS3231 e troverai molte librerie tra cui:

DS3231 Real Time Clock Module library list

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:

Time Clock Module compiled

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:

DS3231 Real Time Clock Module library conflict

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:

DS3231 Real Time Clock Module remove RTClib old

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:

DS3231 Real Time Clock Module serial error

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:

DS3231 Real Time Clock Module modify sketch

e aggiungendo la linea 25 che comprenderai leggendo la descrizione riportata sotto.

Carica lo sketch sul DS3231 RTC Module ed apri il monitor seriale:

DS3231 Real Time Clock Module Serial correct

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:

DS3231 Real Time Clock Module Serial correct

ecco il progetto montato sulla mia basetta di test:

DS3231 RTC Module

 

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/ds3231-rtc-module.html

2 commenti

    • salvatore il 30 Luglio 2019 alle 16:10
    • Rispondi

    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 .

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.