Real Time Clock – RTC

In questo articolo vedremo un componente elettronico che può essere usato insieme a un microcontrollore per misurare il tempo, un real time clock (RTC).

Questo vi permetterà di costruire orologi accurati in grado di restare a punto anche mentre il vostro progetto è spento.

In particolare ora vedremo come programmare e usare il DS3231 con una scheda Arduino, usando la libreria di Adafruit “RTClib 1.10.0”.

Se siete amanti dei delay(1000); levatevi di torno.

Real Time Clock – RTC
DS3231 sulla sua breakout board

Il componente si presenta su una scheda di supporto con altri componenti necessari come regolatori di alimentazione e una batteria montata sul lato inferiore, questa entra in funzione quando il resto del circuito si spegne e l’alimentazione a 5V viene a mancare, dato che nessun sistema può contare il tempo senza una fonte di energia.

Nella figura si notano anche i due contatti per comunicazione seriale I2C, che andranno direttamente all’Arduino, e anche due uscite da 32kHz e 1Hz, utilizzabili ma non necessarie per costruire un orologio.

Programmazione:

DateTime viene usata sia come funzione sia come variabile:

– Usata come variabile, è una struttura in grado di contenere una data;

– Usata come funzione, calcola una data prendendo in input dati di tempo, inseriti dal più significativo al più preciso, cioè in ordine di anni, mesi, giorni, ore, minuti e secondi, per poi salvarli su una struttura DateTime.

Esempio:

DateTime X = ( DateTime( 2020 , 12 , 31 , 23 , 59 , 59 ) );

Dove X è una variabile di tipo DateTime che indica l’istante un secondo prima di capodanno 2021.

In alternativa si possono usare due funzioni dell’applicazione di Arduino, ossia __DATE__ per la data e __TIME__ per l’orario, questi due ” #define speciali ” al momento della compilazione dello sketch vengono sostituiti con data e ora del computer in uso.

Esempio:

DateTime Y = ( DateTime( F(__DATE__) , F(__TIME__) ) );

Dove Y è una variabile di tipo DateTime che indica l’istante in cui è stata lanciata la compilazione del codice.

Suggerisco di eseguire la sincronizzazione dell’orologio del computer prima di lanciare la compilazione.

Un’altra funzione è TimeSpan e serve per “spostarsi” avanti o indietro nel tempo a partire da un punto di riferimento, definito da un’altra variabile DateTime. Questa funzione prende in ingresso 4 valori, cioè giorni, ore, minuti e secondi, (non mesi o anni dato che hanno durata irregolare/indefinita).

Esempio:

               DateTime Z = ( X + TimeSpan( 0 , -1 , 0 , 10 ) );

Dove Z è una variabile di tipo DateTime che indica l’istante 59 minuti e 51 secondi prima di capodanno 2021, cioè 59 minuti e 50 secondi prima di X.

               DateTime K = ( X + TimeSpan( 0 , -1 , 60 , 0 ) );

Modo inutilmente complicato per creare una copia di X.

Messa a punto iniziale tramite Arduino:

Per mettere in funzione la scheda bisogna prima scrivere un codice di messa a punto e realizzare un semplice circuito con 4 fili tra TRC e Arduino (5V, gnd, SCL, SDA), collegarli al computer tramite USB, inserire una batteria nel retro dell’RTC e assicurarsi che l’orario del computer sia a punto.

Per sapere quali pin dell’Arduino corrispondono a SCL e SDA consultare il datasheet (variano tra Uno, Mega, Nano e Micro).

Codice per la programmazione. Ricorda di scollegare l’RTC per evitare che venga riprogrammato con il vecchio orario quando l’Arduino si riavvia.

Utilizzo:

Ovviamente il codice dipenderà dal vostro progetto, ma qui sotto potete trovare un esempio di chiamata per la lettura del dato dall’RTC.

Comandi per stampare su monitor seriale tutte le letture in un’unica frase.

Come potete osservare, il componente dispone anche di un termometro. Questa funzione è presente per via della grossa dipendenza della frequenza di oscillazione del quarzo dalla sua temperatura. Il DS3231 è provvisto di un meccanismo di bilanciamento automatico, che lo rende un orologio più preciso di molti altri digitali moderni. È molto più preciso del mio portatile.

Vettori di stringhe usati per completare la frase a monitor seriale.

L’RTC restituisce i mesi e i giorni della settimana come numeri interi. Per sostituirli con le parole italiane corrispondenti, invece di fare maree di if, si può fare in modo che il valore ricevuto in seriale sia indice di un vettore che contiene le parole desiderate.

Nota:

Il circuito non gradisce letture troppo frequenti, consiglio un minimo di qualche decimo di secondo tra una lettura e l’altra.

Fusi orari:

Dopo aver detto tutto questo bisogna far presente che il DS3231 non calcola automaticamente i passaggi tra orari legale e solare, quindi per evitare di dover mettere a punto il vostro progetto due volte all’anno potete adottare varie possibili soluzioni, come ad esempio lasciare l’RTC a punto con l’orario solare tutto l’anno, ma riportando un’ora in più in uscita se il microcontrollore calcola di essere in estate.

Cambio di orario in Italia:

Alle 2 di notte dell’ultima Domenica di Marzo, si spostano gli orologi un’ora avanti e si ha quindi un giorno di 23 ore.

Per tutta l’estate è in vigore l’orario LEGALE.     (Coordinated Universal Time + 2 ore)

Alle 2 di notte dell’ultima Domenica di Ottobre, si spostano gli orologi un’ora indietro e si ha un giorno di 25 ore.

Per tutto l’inverno è in vigore l’orario SOLARE.    (Coordinated Universal Time + 1 ora)

Se ipotizziamo che il nostro RTC resti impostato sull’orario solare tutto l’anno, allora Arduino, a ogni lettura, prima di mandarla in output dovrà calcolare se aggiungere un’ora extra oppure no.

Per fare ciò occorrerà una serie di if-else in cascata per restringere il campo attorno alle date di cambio orario, fino al livello di precisione che si vuole ottenere.

Altro:

-Pin “32K”, attivo di default (onda quadra 32000 Hz):

rtc.disable32K();                             Per disattivare il pin

rtc.enable32K();                              Per riattivare il pin

Serial.println( rtc.isEnabled32K() );         Restituisce 0 se spento o 1 se acceso

-Pin “SQW”, disattivo di default (onda quadra 1 Hz):

rtc.writeSqwPinMode( DS3231_OFF );            Per disattivare il pin

rtc.writeSqwPinMode( DS3231_SquareWave1Hz );  Per attivare il pin

Makers ITIS Forlì: https://www.makers-itis-forli.it 

Claudio Ricci

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


The reCAPTCHA verification period has expired. Please reload the page.