
Arduino UNO R4 WiFi possiede un RTC interno facilmente programmabile che ci consentirà di mantenere costantemente traccia dell’ora e della data corrente.
Per chi ha iniziato da poco le sperimentazioni elettroniche ricordo che un Real-Time Clock (RTC), o Orologio in Tempo Reale, è un tipo di orologio costituito da un circuito elettronico utilizzato per tracciare il tempo in tempo reale. Questo significa che tiene traccia del giorno della settimana, della data e dell’ora corrente, dei minuti, dei secondi, proprio come un orologio normale, inoltre è possibile impostare un RTC per gestire l’ora legale e l’ora solare.
Nelle versione precedente di Arduino, UNO R3 non era presente un RTC pertanto bisognava utilizzare un apposito circuito elettronico esterno così come dettagliato nel post su questo sito: Utilizzare un orologio RTC con Arduino – Modulo Tiny RTC I2C, modulo RTC dotato di un integrato DS1307 cuore fondamentale della scheda.
L’utilizzo dell’RTC su Arduino UNO R4 WiFi avviene utilizzando la libreria RTC che consente di impostare oppure ottenere l’orario o ancora gestire allarmi per attivare interrupt.
Come accennato ad inizio post l’RTC integrato dispone di un pin VRTC, che viene utilizzato per mantenere in funzione l’RTC, anche quando l’alimentazione della scheda viene interrotta. Per utilizzare questa funzione è sufficiente fornire una tensione compresa tra 1,6 e 3,6 V al pin VRTC. In un post successivo mostrerò come utilizzare il pin VRTC.
Facendo riferimento agli esempi disponibili sul sito Arduino e nell’IDE analizziamo le fasi di configurazione dell’RTC.
Impostazione della data e dell’ora
1 | RTCTime startTime(01, Month::AUGUST, 2023, 20, 49, 00, DayOfWeek::TUESDAY, SaveLight::SAVING_TIME_ACTIVE) |
Per impostare l’orario bisogna creare un oggetto RTCTime, in cui deve essere specificato il giorno, il mese, l’anno, l’ora, il minuto, il secondo, il giorno della settimana e l’attivazione dell’ora legale se prevista nella nazione in cui si sta utilizzando la scheda, quindi per impostare l’orario bisogna usare il metodo startTime.
Per chi incomincia con la programmazione il concetto di metodo appartiene alla programmazione ad orientata agli oggetti come ad esempio in C++, quando si programma in C è meglio parlare di funzione, ma spesso i due concetti vengono usati in modo alternativo.
Il primo sketch non fa altro che impostare l’ora corrente:
14 | RTCTime startTime(2, Month::AUGUST, 2023, 9, 15, 00, DayOfWeek::WEDNESDAY, SaveLight::SAVING_TIME_ACTIVE); |
17 | RTC.setTime(startTime); |
Leggere data e ora
Per recuperare l’ora e la data corrente bisogna usare la funzione:
1 | RTC.getTime(currentTime) |
è necessario creare un oggetto RTCTime, così come abbiamo fatto nello sketch precedente, usiamo il metodo getTime() per ottenere ora e data corrente:
13 | RTCTime startTime(2, Month::AUGUST, 2023, 9, 15, 00, DayOfWeek::WEDNESDAY, SaveLight::SAVING_TIME_ACTIVE); |
16 | RTC.setTime(startTime); |
25 | RTC.getTime(currentTime); |
Stampa della data e dell’ora
Gli esempi indicati sopra mostrano come impostare e ottenere l’orario e memorizzarlo in un oggetto. Questi dati possono essere recuperati attraverso diversi metodi:
L’esempio che segue stampa data ed ora utilizzando l’oggetto currentTime:
14 | RTCTime startTime(2, Month::AUGUST, 2023, 12, 43, 00, DayOfWeek::WEDNESDAY, SaveLight::SAVING_TIME_ACTIVE); |
17 | RTC.setTime(startTime); |
26 | RTC.getTime(currentTime); |
29 | Serial.print(currentTime.getDayOfMonth()); |
31 | Serial.print(Month2int(currentTime.getMonth())); |
33 | Serial.print(currentTime.getYear()); |
37 | Serial.print(currentTime.getHour()); |
39 | Serial.print(currentTime.getMinutes()); |
41 | Serial.println(currentTime.getSeconds()); |

Tempo Unix
Nei sistemi operativi Unix e Unix-like, il tempo è indicato come un offset in secondi rispetto alla mezzanotte (UTC – Tempo coordinato universale o Tempo Cicile) del 1º gennaio 1970, un punto nel tempo noto come “epoca Unix”, questo numero viene chiamato anche timestamp.
Ad esempio, alle 03:46:40 CET del 9 settembre 2001, questo differenziale era esattamente un miliardo. Questo significa che in quel preciso momento erano passati un miliardo di secondi dall’inizio dell’epoca Unix. Per esprimere questo differenziale temporale, si utilizza il tipo di dato time_t.
Il timestamp nel momento in cui scrivo questa lezione, l’ora Unix, è:
Oggi è il 02/08/2023 e sono le 09:34:14
Timestamp: 1690961654
Se vuoi approfondire l’argomento segui il link.
Ma perché utilizzare un tempo Unix?
Come segnalato nel link sopra:
Questo tipo di rappresentazione, oltre che a essere compatta, è indipendente dai fusi orari, ed è quindi direttamente confrontabile anche tra calcolatori situati a grandi distanze geografiche tra loro, ed evita di dover effettuare aggiustamenti nel caso per esempio di dati trasmessi da un fuso orario all’altro. Lo svantaggio è che per averne una rappresentazione sotto forma di data e ora locali è necessario effettuare una conversione; il sistema operativo offre allo scopo delle funzioni che consentono di effettuarle in entrambe le direzioni.
Il codice per la stampa del timestamp Unix è:
13 | RTCTime startTime(2, Month::AUGUST, 2023, 12, 49, 00, DayOfWeek::WEDNESDAY, SaveLight::SAVING_TIME_ACTIVE); |
16 | RTC.setTime(startTime); |
24 | RTC.getTime(currentTime); |
27 | Serial.print( "Timestamp Unix: " ); |
28 | Serial.println(currentTime.getUnixTime()); |

Ovviamente è possibile stampare con facilità entrambe le notazioni di tempo:
14 | RTCTime startTime(2, Month::AUGUST, 2023, 12, 51, 00, DayOfWeek::WEDNESDAY, SaveLight::SAVING_TIME_ACTIVE); |
17 | RTC.setTime(startTime); |
26 | RTC.getTime(currentTime); |
29 | Serial.print(currentTime.getDayOfMonth()); |
31 | Serial.print(Month2int(currentTime.getMonth())); |
33 | Serial.print(currentTime.getYear()); |
37 | Serial.print(currentTime.getHour()); |
39 | Serial.print(currentTime.getMinutes()); |
41 | Serial.println(currentTime.getSeconds()); |
44 | Serial.print( "Timestamp Unix: " ); |
45 | Serial.println(currentTime.getUnixTime()); |

Visualizziamo data ed ora su un display
L’applicazione più semplice che possiamo realizzare è quella che permette di realizzare un semplice orologio mostrando data ed ora su un display 1602 di tipo I2C. Per l’utilizzo di un display I2C fare riferimento alle guide che trovate su questo sito.
Ricordate di impostare l’indirizzo corretto per l’LCD che potrebbe differire da quello inserito nei miei esempi.
La modifica al codice precedente consiste nell’aggiungere la libreria di gestione del display, la sua configurazione e successivamente sostituire il metodo serial.print con il metodo lcd.print. Nello sketch nei commenti trovate tutti i dettagli.
8 | #include <LiquidCrystal_I2C.h> |
11 | LiquidCrystal_I2C lcd(0x27, 16, 2); |
41 | RTCTime startTime(3, Month::AUGUST, 2023, 18, 59, 00, DayOfWeek::THURSDAY, SaveLight::SAVING_TIME_ACTIVE); |
44 | RTC.setTime(startTime); |
48 | lcd.print( "Maffucci Michele" ); |
50 | lcd.print( "www.maffucci.it" ); |
54 | lcd.print( "Orologio" ); |
64 | RTC.getTime(currentTime); |
71 | if (currentTime.getDayOfMonth() != prevDay) { |
73 | prevDay = currentTime.getDayOfMonth(); |
77 | lcd.print(currentTime.getDayOfMonth()); |
79 | lcd.print(Month2int(currentTime.getMonth())); |
81 | lcd.print(currentTime.getYear()); |
88 | if (currentTime.getHour() != prevHour) { |
90 | prevHour = currentTime.getHour(); |
95 | lcd.print(currentTime.getHour()); |
97 | lcd.print(currentTime.getMinutes()); |
102 | if (currentTime.getSeconds() == 0) { |
104 | lcd.setCursor(12, 1); |
106 | lcd.print(currentTime.getSeconds()); |

Per quanto riguarda l’interrupt periodico a cui si fa riferimento nella pagina di esempio del sito di Arduino, attualmente ci sono alcuni problemi di utilizzo e lo sketch presenta alcuni refusi, di cui si fa menzione anche nel forum di Arduino, confido che nel breve il problema venga risolto.
Nelle prossime lezioni proporrò ulteriori esempi di utilizzo dell’RTC di Arduino UNO R4, per ora no mi resta che augurarvi:
Buon Making 
Buongiorno. Articoli sempre interessanti e ben spiegati (si vede che è un professore e sa come spiegare le cose in modo semplice e comprensibile, e comunque non tutti i professori ci riescono).
Seguirò con interesse il seguito di questo articolo.
Grazie e buona giornata
Grazie mille per le sue parole.
Buongiorno Sig. Maffucci
Da qualche giorno sto provando la precisione dell’ RTC di Arduino R4, ma ahime mi risulta poco preciso.
Non faccio altro che visualizzare l’ora sul seriale (ho seguito il suo esempio), confrontandolo con un orologio si vede che gia’ dopo qualche minuto, ci sono delle imprecisioni, l’RTC di Arduino risulta di qualche secondo in avanti, e se si aspetta qualche ora si nota che e’ qualche minuto avanti!
Non e’ una bella cosa!
L’ha notato?
Grazie e buona giornata
Gentilissimo,
grazie per avermi scritto, perdoni la risposta tardiva ma ero in vacanza.
Si ho notato ed ho verificato ed effettivamente su un test di un giorno si ha una perdita di precisione importante. Guardando gli schemi di Arduino UNO R4 Minima e WiFi noto che entrambi NON usano il quarzo esterno da 32.768khz sui pin XCIN/XCOUT del microcontrollore RA4M1 e ciò non è positivo in quanto porta inevitabilmente ad una perdita di precisione che può raggiungere, dai test che sto effettuando, a circa ± 20 minuti al giorno. Utilizzando un cristallo esterno la perdita non supererebbe i ± 2 secondi (circa) al giorno. Cercherò appena possibile di approfondire meglio questo aspetto con ulteriori test.
Le lascio un link ad una discussione sul forum di Arduino che rimanda ad una discussione dove si parla proprio di questo problema.
https://forum.arduino.cc/t/uno-r4-wifi-rtc-runs-fast-by-about-1-second-per-minute/1145956
Saluti.
Guida estremamente pratica e puntuale. Grazie davvero