Negli ultimi tempi ho notato che in diversi hanno cercato un modo per implementare in software un RTC, ossia un orologio in tempo reale, con il proprio Arduino. La libreria che ho sviluppato si chiama swRTC e, come dice il nome, serve per creare un RTC software con ore:minuti:secondi e giorno:mese:anno.
La libreria tiene conto degli anni bisestili ma non dell'ora legale.
In allegato trovate un pacchetto ZIP (per portabilità su più SO) da scompattare nella propria cartella delle librerie. Per usare la libreria basta un
#include <swRTC.h>
Poi si crea un'istanza della libreria:
swRTC rtc;
Prima di poter usare la libreria è necessario impostare la data e l'ora:
rtc.stopRTC();
rtc.setTime(ore, minuti, secondi);
rtc.setDate(giorno, mese, anno);
rtc.startRTC();
L'impostazione può essere fatta nel setup con dei valori predefiniti oppure anche durante l'esecuzione dello sketch, se ad esempio si ha un display LCD con il quale interagire con l'utente.
Per recuperare le informazioni sull'ora e sulla data basta usare i seguenti metodi:
rtc.getSeconds();
rtc.getMinutes();
rtc.getHours();
rtc.getDay();
rtc.getMonth();
rtc.getYear();
La libreria usa un interrupt basato sull'overflow del contatore incrementato dal timer 2: per questo motivo non interferisce con le funzioni temporali di Arduino quali delay e millis, che sono invece basate sul timer 0. Per contro, si perdono la funzionalità PWM sui pin 10/11 dato che su quei pin essa è gestita proprio dal timer 2.
La libreria è usabile al momento su micro sui micro Atmega8/8A, Atmega48/88/168/328/328 (con e senza core "P" PicoPower), compreso ovviamente le Arduino 2009/UNO, Atmega644/1284, Attiny25/45/85, Attiny24/44/84, Atmega640/1280/1281/2560/2561 (comprese ovviamente le Arduino Mega1280 e Mega2560) e Attiny2313, con clock di 1, 8 e 16 MHz. Altri micro e frequenze saranno aggiunti in seguito.
Alla libreria è allegato anche uno sketch di esempio ed un file README con altre informazioni.
Ringrazio pubblicamente lesto che mi ha dato una mano stanotte a sistemare alcuni problemi di codice.
Piccola precisazione: non sono un programmatore di C navigato (lo uso solo da 1 annetto) per cui se ci sono errori grossolani segnalatemeli pure.
La libreria è in una versione iniziale per cui è da provare sulle "lunghe distanze". Per quel poco che ho potuto verificarla, pare funzionare. Se, dopo le vostre verifiche, la libreria è valida, la includo nel playground così che sia accessibile a tutti.
Introdotto dalla versione 0.8 il deltaT, una correzione per riallineare l'RTC all'ora reale. La funzione accetta un numero che rappresenta il numero di secondi al giorno da sommare o sottrare per correggere gli scostamenti tra il tempo misurato internamente e quelle effettivo.
Dalla versione 0.8.4 la libreria supporta i timestamp, sia con epoca 1900 che 1970 (UNIX) tramite le funzioni getTimestamp e setClockWithTimestamp, rispettivamente per avere un timestamp basato sull'orologio interno e per impostare l'orologio con un timestamp.
La versione 1.0 è la prima versione stabile e completa della libreria. Rispetto alla 0.8.4 è stata aggiunta una funzione per avere il giorno della settimana di uno specifico timestamp.
Dalla versione 1.2.0 è possibile usare il modulo Real-Time Counter integrato in alcune MCU. Basta aggiungere la seguente #define prima dell'inclusione della libreria:
#define USE_INTERNAL_RTC
#include "swRTC.h"
AGGIORNAMENTO:
la libreria è stata resa pubblica ed è stato aperto un thread sul forum internazionale:
http://arduino.cc/forum/index.php/topic,80489.0.html
EDIT:
documentazione completa in italiano può essere trovata qui:
http://www.leonardomiliani.com/?p=411
AGGIORNAMENTI:
la libreria funziona sia con l'IDE 1.0 che con le precedenti versioni 0022/0023;
-
1.0.2: contiene un primo fix per il problema dei timestamp calcolati su date successive al 29/02/2012;
-
1.0.3: supporto (tranne che per i micro Attiny) del clock a 4 MHz;
-
1.0.5: nuova funzione getWeekDay e supporto per gli Attiny4313; nuovo sketch di esempio;
-
1.0.6: sistemato un bug nel calcolo del timestamp;
-
1.1.0: setDeltaT ora lavora con gli interi; nuovo metodo getDeltaT;
-
1.1.1: sistemato un bug in setDeltaT;
-
1.1.2: getDelta restituisce il valore di deltaT con il giusto segno
-
1.2.0: ora la libreria supporta il modulo Real-Time Counter presente in alcune MCU
DOWNLOAD:
l'ultima versione è disponibile a questa pagina