Per realizzare la centralina del tuo impianto di irrigazione, vedi articolo sulla prima parte, ti serve conoscere l’ora.
In aiuto ti viene una shield, e quando mai non ne esiste una ad hoc per il tuo progetto 🙂
Io ho acquistato la RTC Shield da robot-domestici e fatto i primi test in funzione del progetto finale.
Montaggio
La shield RTC è venduta in Kit
quindi prima di utilizzarla procurati un saldatore e dello stagno per assemblarla, non è difficile i componenti sono molto distanti tra loro ed il DS1307 è montato su uno zoccoletto a 8 pin che rende facile la saldatura senza compromettere l’integrato.
Come sempre il consiglio è di partire dai componenti più bassi per salire man mano che monti il tuo kit, parti dalle resistenze, 3 in tutto:
quindi salda il condensatore ceramico, l’unico denominato C1, l’atro è un condensatore elettrolitico ed è più alto:
salda il quarzo, è il secondo componente per ordine di importanza e come dalla serigrafia il mio consiglio è di montarlo orizzontale per rendere il circuito più basso:
ora puoi montare lo zoccolo che ospiterà il processore:
ed a seguire il condensatore elettrolitico ed il led, facendo attenzione alla polarità di entrambi:
posiziona e salda il portabatteria per la CR2032, contenuta nella confezione:
salda il jumper JSQW che ti consente di scegliere se inviare ad arduino il clock del DS1307 sul piedino A3 o lasciare che la shield non comunichi questa informazione ad Arduino, dipenderà da progetto a progetto:
infine salda i connettori per inserire la shield su Arduino:
Nella confezione sono presenti più connettori:
- 3 connettori da 8 pin
- 1 connettore da 10 pin
- 1 connettore da 6 pin
a cosa servono?
il connettore da 6 pin va in corrispondenza dei pin analogici, A0-A5, di Arduino; un connettore da 8 pin devi saldarlo in corrispondenza dei pin Vin, GND, GND, 5v, 3v3 e RST di Arduino ed un’altro connettore da 8 pin devi saldarlo in corrispondenza dei primi 8 pin digitali di arduino, 0-7.
I connettori da 8 e 10 sono alternativi, ossia dipende dalla scheda Arduino a cui devi collegare lo shield: se utilizzerai una Arduino Rev 3 devi usare il connettore da 10pin in corrispondenza dei pin digitali 8-13 e successivi GND, AREF, SDA ed SCL in quanto questa versione ha 2 pin in più corrispondenti proprio alle uscite SDA ed SCL che permettono alla shield di comunicare con Arduino mediante I2C collegati su questi pin. Nelle versioni precedenti alla Rev3 ( rev 2 o inferiore, duemilanove, ecc… ) questi 2 pin mancano e devi saldare il connettore da 8 pin in corrispondenza dei pin digitali 8-13 e successivi.
Important!
Se usi arduino in versione precedente alla Rev3 ricordati di ponticellare le due piazzole presenti, sul lato opposto ai componenti della schield, questi ponticelli ti permettono di vere i segnali SDA ed SCL rispettivamente sui pin A4 ed A5 di arduino, in quanto in quelle versioni i pin A4 ed A5 sono destinati all’ I2C.Terminato l’assemblaggio puoi inserire la CR2032 nell’apposito portapila.
Il costruttore della shield indica in 5/6 anni l’autonomia della pila.
Libreria
per funzionare la shield ha bisogno della liberia RTClib.h che puoi scaricare in versione modificata per questa shield a questo link
Potresti anche decidere di non utilizzare la libreria RTClib ma in tal caso dovrai scriverti tutte le righe di codice necessarie a comunicare con il DS1307 attraverso il protocollo I2C e la libreria Wire.h.
Sketch
Come primo test ho utilizzato quello fornito con la libreria stessa, Examples -> RTClib -> DS1307 che ti propongo:
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib #include <Wire.h> #include "RTClib.h" RTC_DS1307 RTC; void setup () { Serial.begin(57600); Wire.begin(); RTC.begin(); RTC.sqw(1); //0 Led off - 1 Freq 1Hz - 2 Freq 4096kHz - 3 Freq 8192kHz - 4 Freq 32768kHz if (! RTC.isrunning()) { Serial.println("RTC is NOT running!"); // following line sets the RTC to the date & time this sketch was compiled //RTC.adjust(DateTime(__DATE__, __TIME__)); } } void loop () { DateTime now = RTC.now(); Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(' '); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); Serial.print(" since midnight 1/1/1970 = "); Serial.print(now.unixtime()); Serial.print("s = "); Serial.print(now.unixtime() / 86400L); Serial.println("d"); // calculate a date which is 7 days and 30 seconds into the future DateTime future (now.unixtime() + 7 * 86400L + 30); Serial.print(" now + 7d + 30s: "); Serial.print(future.year(), DEC); Serial.print('/'); Serial.print(future.month(), DEC); Serial.print('/'); Serial.print(future.day(), DEC); Serial.print(' '); Serial.print(future.hour(), DEC); Serial.print(':'); Serial.print(future.minute(), DEC); Serial.print(':'); Serial.print(future.second(), DEC); Serial.println(); Serial.println(); delay(3000); }
avrai notato che la linea 16 è commentata nello sketch sopra mentre nell’esempio fornito no, vedrai a breve a cosa serve e perchè l’ho fatto.
linea 03: includi la liberia Wire.h necessaria alla comunicazione su I2C;
linea 04: includi la RTClib.h di cui hai già letto le caratteristiche e che ti aiuta nella scrittura del codice del tuo progetto;
linea 06: crea l’oggetto RTC di tipo RTC_DS1307;
linea 09: inizializza la comunicazione seriale, sulla quale vedrai riportato data e orario;
linea 10: inizializza la clase Wire con il metodo begin(), la classe Wire serve alla RTClib per la comunicazione I2C;
linea 11: inizializza l’oggetto RTC con il metodo begin();
linea 12: il metodo utilizzato è valido solo per la RTClib modificata e per questo sketch, il suo utilizzo consente di definire la frequenza di lampeggio del led secondo le impostazioni riportate anche nello sketch:
- 0 led spento
- 1 led che lampeggia con frequenza di 1Hz
- 2 led che lampeggia con frequenza di 4096kHz
- 3 led che lampeggia con frequenza di 8192kHz
- 4 led che lampeggia con frequenza di 32768kHz
nello sketch è impostato a 1 in quanto la frequenza di 1Hz corrisponde ad un lampeggio ogni secondo;
linea 13: la condizione verifica che l’RTC sia impostato, essendo negata ( ! ) le istruzioni presenti tra le parentesi graffe vengono eseguite solo se l’RTC non è in funzione, cosa che si verifica solo alla prima accensione o in seguito al reset del DS1307, essendoci la batteria tampone anche se il circuito resta senza alimentazione l’RTC continua a mantenere l’ora esatta.
linea 14: scrivi sul monitor seriale che si è verificata la condizione di mancato funzionamento dell’RTC;
linea 16: questa linea, come detto sopra, la puoi commentare al primo avvio se sei curioso di vedere a che data è impostato il DS1307 alla prima accensione, infatti questa linea di codice utilizza il metodo adjust( date, time ) dell’oggetto RTC per impostare la data e l’ora corrente. Utilizzata con le variabili di ambiente __DATE__ e __TIME__ al momento della compilazione queste due variabili vengono sostituite dall’IDE con la data e l’ora corrente impostate sul computer e passate ad Arduino in fase di upload, quindi il funzionamento dello sketch dice al DS1307 di impostare la data e l’ora inviate se non è presente una data ed ora.
Questo è quello che mi è apparso alla prima accensione:
Puoi a questo punto ricompilare lo sketch decommentando questa linea ed imposterai la data ed ora corrente sull’RTC:
avrai notato che la freccia indica la data del mio computer e che questa corrisponde a quella impostata sul DS1307.
Ogni volta che vorrai impostare la data puoi utilizzare la funzione adjust(), se vuoi reimpostarla identica a quella del computer dovrai ricompilare ed uplodare lo skecth, solo in questa fase le variabili __DATE__ e __TIME__ assumono il valore di data e ora correnti.
linea 21: definisci una variabile now come istanza di tipo DateTime a cui assegni il valore ritornato dal metodo now() della libreria RTC;
linee 23-34: utilizzando i metodi messia a disposizione dall’istanza now puoi scrivere sul monitor seriale aaaa/mm/gg hh:mm:ss così come restituiti dall’RTC;
linee 36-40: sempre utilizzando i metodi offerti dall’istanza now puoi ottenere il numero di secondi passati dal 01/01/1970 e il suo valore in giorni;
linee 42-57: utilizzando le funzioni di DateTime puoi anche calcolare una data futura partendo da quella corrente, nell’esempio la data è 7 giorni e 30 secondi avanti;
linea 60: imposta un tempo di attesa di 3 secondi tra un ciclo di loop() ed il successivo;
Video
ho realizzato un semplice video in cui si vede il led lampeggiare alla frequenza di 1Hz, scandisce i secondi:
Buona scansione del tempo !!!
Prima di inserire un commento, per favore, leggi il regolamento
67 pings
Skip to comment form
[…] tempo fa ti ho parlato della shield RTC Arduino basata sul DS1307 della Dallas in grado di scandire il tempo nei tuoi progetti con pochi […]
[…] commenti dell’articolo Tutorial rtc shield con ds1307 stesso puoi leggere alcune delle richieste di […]
[…] livello con arduino. Tutto ha avuto inizio quando Stefano commentando l’articolo sull’RTC mi ha chiesto una mano per il suo progetto a cui ho risposto ( leggi risposte nei commenti […]
[…] linee 27-34: inizializza l’oggetto Wire ed RTC, imposta a 1 secondo la frequenza di lampeggio del led SQW presente sulla RTC Shield e in caso di orario non configurato imposta l’ora corrente del Pc sull’RTC, per la procedura leggi l’articolo Tutorial: RTC Shield con DS1307; […]