Tutorial: RTC Shield con DS1307

Per realizzare la centralina del tuo impianto di irrigazione, vedi articolo sulla prima parte, ti serve conoscere l’ora.

RTC shield

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

RTC Shield

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:

RTC shield resistenze

quindi salda il condensatore ceramico, l’unico denominato C1, l’atro è un condensatore elettrolitico ed è più alto:

RTC shield condensatore C1

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:

RTC shield quarzo Q1

ora puoi montare lo zoccolo che ospiterà il processore:

RTC shield zoccolo processore

ed a seguire il condensatore elettrolitico ed il led, facendo attenzione alla polarità di entrambi:

RTC shield condensatore C2 e led

posiziona e salda il portabatteria per la CR2032, contenuta nella confezione:

RTC shield portabatteria CR2032

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:

RTC shield jumper JSQW

infine salda i connettori per inserire la shield su Arduino:

RTC shield pin per 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.

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:

RTC in modalità not running

Puoi a questo punto ricompilare lo sketch decommentando questa linea ed imposterai la data ed ora corrente sull’RTC:

RTC in modalità Time set

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

Permanent link to this article: https://www.mauroalfieri.it/elettronica/tutorial-rtc-shield-con-ds1307.html

65 pings

Skip to comment form

  1. […] 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 […]

  2. […] commenti dell’articolo Tutorial rtc shield con ds1307 stesso puoi leggere alcune delle richieste di […]

  3. […] 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 […]

  4. […] 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; […]

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.