RTC DS3231 sketch test

L’articolo RTC DS3231per arduino hai letto come impostare l’ora sul RTC DS3231 attraverso il monitor seriale.

RTC DS3231 arduino connesso

Hai notato che non ho commentato lo sketch che puoi usare in quanto è un operazione preliminare che devi eseguire se vuoi leggere l’ora corretta sul DS3231 ma non è uno sketch che avrebbe senso modificare in un progetto.

In questo articolo potrai leggere, nel classico stile del blog, l’analisi riga per riga dello sketch che puoi usare come test del DS3231 con la libreria di JChristensen già scaricata per i impostare l’ora sul tuo RTC DS3231.

Riprendiamo i collegamenti

Prima di iniziare i test dello sketch riprendo l’immagine che hai già avuto modo di vedere nell’articolo precedente e che mostra come collegare l’RTC DS3231 ad arduino:

RTC DS3231 arduino pin

come vedi ti bastano 4 collegamenti 2 per l’alimentazione a 3,3v e Gnd e 2 per il protocollo I2C sui pin SDA ed SCL.

RTC DS3231 sketch test

Lo sketch di test per l’RTC DS3231 disponibile nella libreria che hai scaricato si chiama TimeRTC.ino e lo trovi tra fli esempi della libreria stessa:

/*
 * TimeRTC.pde
 * Example code illustrating Time library with Real Time Clock.
 * This example is identical to the example provided with the Time Library,
 * only the #include statement has been changed to include the DS3232RTC 
 * library.
 */

#include <DS3232RTC.h> //http://github.com/JChristensen/DS3232RTC
#include <Time.h>      //http://www.arduino.cc/playground/Code/Time  
#include <Wire.h>      //http://arduino.cc/en/Reference/Wire

void setup(void)
{
    Serial.begin(9600);
    setSyncProvider(RTC.get);   // the function to get the time from the RTC
    if(timeStatus() != timeSet) 
        Serial.println("Unable to sync with the RTC");
    else
        Serial.println("RTC has set the system time");      
}

void loop(void)
{
    digitalClockDisplay();  
    delay(1000);
}

void digitalClockDisplay(void)
{
    // digital clock display of the time
    Serial.print(hour());
    printDigits(minute());
    printDigits(second());
    Serial.print(' ');
    Serial.print(day());
    Serial.print(' ');
    Serial.print(month());
    Serial.print(' ');
    Serial.print(year()); 
    Serial.println(); 
}

void printDigits(int digits)
{
    // utility function for digital clock display: 
    // prints preceding colon and leading 0
    Serial.print(':');
    if(digits < 10)
        Serial.print('0');
    Serial.print(digits);
}

iniziando dalle prime linee dopo i commenti trovi le linee 09-11: includi le librerie necessarie alla gestione del sensore DS3231 ( DS3232.h e Time.h ) ed alla comunicazione I2C ( Wire.h);

linea 16: richiami l’ora impostata nel RTC DS3231 con la funzione setSyncProvider(RTC.get) che ha il compito di recuperare dall’RTC il valore relativo alla data e l’ora;

linee 17-20: se il timeStatus è diverso dal timeSet non sei riuscito a sincronizzare l’ora con quella presente nell’RTC e li scrivi sul monitor seriale; al contrario puoi scivere a video che la sincronizzazione è avvenuta;

linea 25: all’interno del loop() quello che avviene è molto semplice, richiami la funzione digitalClockDisplay() con cui visualizzi il valore di data ed ora corrente nel monitor seriale;

linea 26: attendi un tempo di 1 secondo prima di richiamare nuovamente la funzione loop();

linea 29: definisci la funzione digitalClockDisplay();

linea 32: scrivi sul monitor seriale il valore restituito dalla funzione hour() della libreria DS32232.h che indica l’ora correntemente settata nel tuo RTC DS3231;

linea 33: scrivi sul monitor seriale il valore dei minuti correnti passando dalla funzione printDigits() che è definita alla linea 44;

linee 34-41: continua a scrivere sul monitor seriale i valori relativi a tutti gli altri parametri della data e dell’ora;

linea 44: definisci la funzione printDigits() richiamata alla linea 33;

linea 48: scrivi sul monitor seriale “:” in modo che dopo l’ora siano printati i “:” ( senza virgolette );

linee 49-50: controlla che il valore di digits sia inferiore a 10 in tal caso la linea 50 scrive sul monitor seriale uno “0” ( senza virgolette ) in questo modo avrai sempre i minuti composti da due digits ( 01,02, .. 09,10,11 … 59,60 )

linea 51: finalmente scrivi sul monitor seriale il valore di digits corrente;

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/rtc-ds3231-sketch-test.html

13 comments

1 ping

Skip to comment form

    • Massimo on 17 settembre 2015 at 19:27
    • Reply

    ciao Mauro,
    sono poco esperto, ma sono curioso del funzionamento del Ds3231. Se vorrei far fare una certa azione ad arduino, ad un certo orario, come si potrebbe modificare lo sketch?

    1. Ciao Massimo,
      puoi usare gli esempi che ho scritto per il DS1307 ed adattare solo le chiamate per il DS3231

    • lino grieco on 8 luglio 2016 at 23:19
    • Reply

    ciao mauro…ti scrivo anche qui…
    io ho la mega 2560 e mi sono accorto che sui pin digit ci sono pin digit
    SDA e SCL….
    ho collegato i cavi del DS3231 a questi e gli altri GND E 3,3 VOLTS

    ho lanciato il tuo sketch e va tutto bene….
    la data che scorre e il primo gennaio 2000 e mi dice di settare la data;
    ho caricato tutte le librerie possibili DS3232RTC-master, Time-master e provato tutti gli esempi che
    ho trovato dentro….
    provo a settare la data come dici tu……ma niente da fare….
    che faccio?

    1. Ciao Lino,
      intendi che non la imposta o ti da qualche altro tipo di errore?

        • lino grieco on 13 luglio 2016 at 15:55
        • Reply

        tutto ok…grazieeeee!!!

    • antonio on 13 luglio 2016 at 16:51
    • Reply

    Buonasera, sono antonio, possiedo un arduino nano un ds3231 e vorrei realizzare un semplice timer che ogni 48 ore mi dia un uscita qualsiasi alta per 1 ora, poi il processo continua all’infinito, grazie.

    1. Ciao Antonio,
      hai letto i miei articoli su come realizzare una sveglia con arduino o una centralina di irrigazione ?
      Puoi prendere spunto da quelli ed adattarli al tuo RTC, non ha senso riscrivere tutti gli articoli per ogni tipo di RTC esistente.

    • Fabrizio on 5 febbraio 2017 at 16:03
    • Reply

    non riesco a far funzionare le librerie indicate nello sketch le ho scaricate e messe nella cartella librerias del compilatore ma quando faccio verificare lo sketch mi dice trovata libreria non valida…non riesco ad uscircene…

    1. Ciao Fabrizio,
      prova con il Gestore Librerie.

    • Nico on 16 settembre 2017 at 19:17
    • Reply

    Buona sera,
    ho riscontrato un grave problema con le librerie. Riporto di seguito il messaggio di errore:
    Arduino:1.8.3 (Windows 7), Scheda:”Arduino/Genuino Uno”

    In file included from C:\Users\Utente\Desktop\example1\example1.ino:1:0:

    C:\Users\Utente\Documents\Arduino\libraries\DS3232RTC/DS3232RTC.h:136:26: error: ‘tmElements_t’ has not been declared

    static byte read(tmElements_t &tm);

    ^

    C:\Users\Utente\Documents\Arduino\libraries\DS3232RTC/DS3232RTC.h:137:20: error: ‘tmElements_t’ has not been declared

    byte write(tmElements_t &tm);

    ^

    exit status 1
    Errore durante la compilazione per la scheda Arduino/Genuino Uno.

    Questo report potrebbe essere più ricco di informazioni abilitando l’opzione
    “Mostra un output dettagliato durante la compilazione”
    in “File -> Impostazioni”

    non so davvero che cosa fare…. penso sia un problema della libreria

    1. Ciao Nico,
      l’errore lo riscontri nella medesima libreria che ho utilizzato e consigliato io?
      Hai già letto sul sito dell’autore se esiste una patch ? Nel caso puoi scrivergli, magari mandargli anche una patch se riesci.

    • Salvatore on 22 settembre 2017 at 11:26
    • Reply

    Buongiorno Mauro,
    ho un problema con il settaggio dell’ora corrente.
    Mi puoi dire come fare il settaggio della data e del l’ora?
    Grazie mille.

    1. Ciao Salvatore,
      per impostare l’ora ho usato l’esempio descritto in questo articolo: http://www.mauroalfieri.it/elettronica/rtc-ds3231-per-arduino.html

  1. […] passato hai letto un articolo dedicato al DS3231 RTC Module prodotto in formato differente, più grande, e probabilmente avere un […]

Lascia un commento

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.