Pages: [1] 2 3 ... 72   Go Down
Author Topic: swRTC  (Read 77545 times)
0 Members and 2 Guests are viewing this topic.
Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22813
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Code:
#include <swRTC.h>
Poi si crea un'istanza della libreria:
Code:
swRTC rtc;
Prima di poter usare la libreria è necessario impostare la data e l'ora:
Code:
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:
Code:
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:

Code:
#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
« Last Edit: May 11, 2013, 04:38:48 am by leo72 » Logged


0
Online Online
Edison Member
*
Karma: 24
Posts: 2310
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie Leo72 (e Lesto) per il contributo.
Ho proprio l'occasione di provarlo!


Logged

Offline Offline
God Member
*****
Karma: 0
Posts: 689
AHHAH
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

mi associo con i ringraziamenti, ora da bravo impedito provo e vedo che riesco a fare smiley-sweat

ho ordinato dei ds1307 ma per molte delle applicazioni mi basterebbe avere le 24h, quindi sembra perfetta!!!!
Logged

Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 19
Posts: 1176
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
if (((year % 4) == 0) && ((year % 100) != 0) or ((year % 400) == 0))
funziona lo stesso, quindi figo...ma era voluto? ho visto che nel resto del codice avete usato le classiche || come operando or

Complimenti per l'uso dei timer (per me sono ancora un semi arabo) e anche per il supporto a diverse frequenze di clock  smiley

l'unico peccato è che resettando Arduino si perde l'ora, altrimenti sarebbe un perfetto sostituto degli RTC!
Logged

F

Offline Offline
God Member
*****
Karma: 0
Posts: 689
AHHAH
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

leo!!! dovevi farla 1 mese fa cosi' risparmiavo i soldi dei ds1307!!!  smiley-lol

e' perfetta per quello che mi serve, ovvero una mangiatoia per i pesci, a me basta che segni ore e minuti, ora devo solo integrare le accensioni alle ore che voglio e che capisca come inserire piu' allarmi a vari tempi smiley-wink

Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 328
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

complimenti! molto utile!!
Quote
Altri micro e frequenze saranno aggiunti in seguito.

per caso avete intenzione di fare anche quella per gli attiny85?   smiley-grin smiley-grin
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22813
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@Federico:
no, effettivamente no.... e la cosa buffa è che non mi ha neanche segnalato l'errore il compilatore... boh..
Ora lo correggo.
PS sul reset:
purtroppo è una implementazione SW per cui ha i suoi limiti.


@reizel:
metti una serie di if e fai un controllo sulle ore e sui minuti.
Code:
if ((orarioHH1==rtc.getHours()) && (orario1MM==rtc.getSeconds()) { sfamaipesci(); }
if ((orarioHH2==rtc.getHours()) && (orario2MM==rtc.getSeconds()) { sfamaipesci(); }
ecc...

@alexdb:
vorrei per i tiny84/85, e magari mettere anche altre frequenze (4 e 20 MHz)

[EDIT]
ho rimesso online la versione con l'or "giusto (||)  smiley-wink
« Last Edit: September 26, 2011, 10:46:38 am by leo72 » Logged


Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 19
Posts: 1176
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
@Federico:
no, effettivamente no.... e la cosa buffa è che non mi ha neanche segnalato l'errore il compilatore... boh..

si, sono rimasto stupito anch'io...i tanti misteri del wiring  smiley-yell

Quote
PS sul reset:
purtroppo è una implementazione SW per cui ha i suoi limiti.

Si si, ne sono consapevole, però sono rimasto affascinato dall'uso dei timer e quindi da come risulta leggera la libreria  smiley-grin
Logged

F

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10474
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
@Federico:
no, effettivamente no.... e la cosa buffa è che non mi ha neanche segnalato l'errore il compilatore... boh..

si, sono rimasto stupito anch'io...i tanti misteri del wiring  smiley-yell

Quote
PS sul reset:
purtroppo è una implementazione SW per cui ha i suoi limiti.

Si si, ne sono consapevole, però sono rimasto affascinato dall'uso dei timer e quindi da come risulta leggera la libreria  smiley-grin
Quote
@Federico:
no, effettivamente no.... e la cosa buffa è che non mi ha neanche segnalato l'errore il compilatore... boh..

si, sono rimasto stupito anch'io...i tanti misteri del wiring  smiley-yell

secondo me sono stai DEFINEiti and or e not, per rendere il linguaggio più user-friendly (mai capitato di mettere una & o | sola?)

comunque io ho solo risolto un problemino di come far parlare la funzione di interrupt con la libreria, il resto è tutta farina del sacco di leo  smiley


Complimenti per l'uso dei timer (per me sono ancora un semi arabo) e anche per il supporto a diverse frequenze di clock  smiley
anche per me  smiley-mr-green

l'unico peccato è che resettando Arduino si perde l'ora, altrimenti sarebbe un perfetto sostituto degli RTC!
se si stratta solo di una mancanza di corrente/reset limitato, si potrebbe salvare l'ora in eeprom, ma con una scrittura al secondo non credo che abbia una lunga vita.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 569
Posts: 12576
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Grande Leo  smiley-lol smiley-lol smiley-lol smiley-lol
Una sola curiosità: su qualche Topic lamentavi l'imprecisione dei timer, mi pare, a causa della nota imprecisione del quarzo esterno; questa libreria potrebbe essere associata all'uso del quarzo "orologi" da 32,768KHz?
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Offline Offline
God Member
*****
Karma: 0
Posts: 689
AHHAH
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

una prova terra terra per implementare un allarme
lcd 16x2
l'rtc parte alle 12:00:00
alle 12:01:00 accende un led
leo, sai che ti amerei se fossi una donna, o se tu fossi una donna, senti, segnatelo, nella prossima vita me la chiedi e io te la do, vorrei rinascere donna (anche se... lesbica...)... per dirti quanto apprezzo questo tuo lavoro!!!!!!!!!! smiley-yell

Code:
#include <swRTC.h>
swRTC rtc;
#include <LiquidCrystal.h>
 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int motordx = 9;
const int motorsx = 8;

void setup() {
    delay(2000);
    rtc.stopRTC();
    rtc.setTime(12,00,00);
    rtc.startRTC();

    lcd.begin(16, 2);
    
    pinMode(motordx, OUTPUT);      
    pinMode(motorsx, OUTPUT);
}

void loop() {
  lcd.setCursor(5, 0);
  lcd.print(rtc.getHours(), DEC);
  lcd.print(":");
  lcd.print(rtc.getMinutes(), DEC);
  lcd.print(":");
  lcd.print(rtc.getSeconds(), DEC);
  lcd.print("  ");
  if ((12==rtc.getHours()) && (1==rtc.getMinutes()) && (0==rtc.getSeconds())) {
  digitalWrite(motordx, HIGH);
  delay(5000);
  digitalWrite(motordx, LOW);
  delay(100);
  digitalWrite(motorsx, HIGH);
  delay(5000);
  digitalWrite(motorsx, LOW);
  }
  }
« Last Edit: September 26, 2011, 11:28:07 am by reizel » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22813
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@lesto:
sei troppo buono. Tu sei una CIMA relativamente al C, mi sono accorto quanto io poco conosca questo linguaggio.
Per contro riesco a cavarmela perché con tanti anni di programmazione alle spalle, la logica per risolvere certi problemi ormai ce l'ho nel DNA  smiley-wink

@Mike:
mi lamentavo dell'imprecisione dei contatori relativamente agli oscillatori interni. Ovviamente l'RTC software ha una certa precisione SOLO se si usa un quarzo esterno, anche per clock inferiori ai 16 MHz dell'Arduino. Parlando dell'Arduino, esso ha un oscillatore esterno al posto del quarzo che era presente sulla 2009. Forse quest'ultima scheda potrebbe avere una precisione maggiore rispetto alla UNO. Da verificare.

@reizel:
se io fossi nato donna, non sarei qui con voi ma a farla fruttare come si deve....  smiley-money smiley-money
Logged


Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 26
Posts: 5500
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Leo....
Complimenti smiley
la proverò non appena torno a casa smiley
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 569
Posts: 12576
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@Mike:
mi lamentavo dell'imprecisione dei contatori relativamente agli oscillatori interni. Ovviamente l'RTC software ha una certa precisione SOLO se si usa un quarzo esterno, anche per clock inferiori ai 16 MHz dell'Arduino. Parlando dell'Arduino, esso ha un oscillatore esterno al posto del quarzo che era presente sulla 2009. Forse quest'ultima scheda potrebbe avere una precisione maggiore rispetto alla UNO. Da verificare.
Quindi il timer che stai usando è già predisposto per il quarzo dedicato? Cioè carico la tua libreria e collego il quarzo orologio ai pin predisposti e funziona?

Quote
@reizel:
se io fossi nato donna, non sarei qui con voi ma a farla fruttare come si deve....  smiley-money smiley-money
finitela entrambi di fare le zoccole smiley-mr-green
@ reizel: finalmente è chiaro che quello sballonzolamento continuo è un tuo desiderio di trasformazione fisica, ho sentito che a Casablanca fanno miracoli, in ogni caso alla larga da me smiley-twist o almeno dalle mie spalle  smiley-grin
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22813
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La libreria così com'è funziona con clock a 1/8/16 MHz. Come detto, è precisa se si usa un quarzo esterno. Quindi se la carichi su una Arduino, 2009 o UNO che sia (coi dubbi espressi per l'oscillatore esterno di quest'ultima) va senza problemi. Su un micro in standalone è meglio usare un quarzo esterno, anche se si sta usando il micro a bassa frequenza.
Logged


Pages: [1] 2 3 ... 72   Go Up
Jump to: