RTC DS1307 con arduino

Continuo la serie dei miei tutorial sull’RTC DS1307 ed Arduino, in questo articolo ti mostro come puoi utilizzare un RTC DS1307 già assemblato.

RTC DS1307

Rispetto alla shield RTC di cui puoi leggere i precedenti articoli:

Questa scheda RTC DS1307 può esserti utile per realizare gli stessi progetti con il vantaggio delle ridotte dimensioni oltre al fatto che non devi assemblartela.

Inoltre ho acquistato questa scheda per poterla utilizzare nel mio progetto RTC Rainbow Ring V3 orologio luminoso che nei prossimi articoli utilizzerà la RTC DS1307 per recuperare l’ora esatta anche in mancanza di alimentazione grazie alla batteria tampone di cui è dotata:

RTC DS1307 batteria tampone

Schema dell’RTC DS1307

la scheda è già assemblata, a parte i pin, questo ti permette di decidere se dalsare dei pin lineari, dei pin ad angolo o degli strip femmina, utilizza il tipo di connessioni pin necessarie al tuo progetto.

Su entrambi i lati, presenta una linea di pin a cui saldare gli strip per connettere la shield al tuo progetto:

RTC DS1307 connessioni SCL,SDA,Vcc,Gnd

io ho saldato degli strip semplici, maschio, da entrambi i lati per poterla utilizzare sulla breadboard.

In realità pensando di utilizzarla con la Rainbow Ring V3 avrei potuto saldare degli strip femmina a 90° per collegare agevolmente le due schede nel mio progetto.

I pin delle due schede coincidono in quanto presentano la stessa sequenza: SCL,SDA,Vcc,Gnd:

RGB RingV3 Diagram

Sketch per l’RTC DS1307

Per provare l’RTC DS1307 ho utilizzato la libreria RTCLib utilizzata anche negli altri articoli e l’esempio DS1307:

// 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();

  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);
}

Buon divertimento !!!

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/rtc-ds1307.html

90 comments

Skip to comment form

    • armando on 22 maggio 2013 at 12:56
    • Reply

    ciao mauro
    ti volevo chiedere circa il RTC 1307 .
    Ho realizzato in versione Stand alone il termometro, + la registrazione su SD ( cololegato su miso e mosi ) e il gruppo RTC 1307 quest’ultimo colllegato elettrricamente su SCL SDA del atmega328p-pu, la mia domanda e questa :
    compilando il codice e spedendolo sull atmega328 tramite arduino Mega adk lui fa partire l’ora e minuti dal momento della compilazione e va in avati l’ora senza problemi. Ma se voglio cambiare l’ora a mio piacimento l’ora esiste un modo semplice per interagire con l’rtc senza ricompilare il codice . Infatti se avvio il circuito e poi stacco l’rtc dal SDA E SCL l’ora cmq viene registrata . come posso fare ?
    Nel codice vedrai anche delle righe disabilitaTe // perche ho fatto delle prove con l’rtc .ma cqm non e’ cambiato nulla.

    ti ringrazio
    Armando

    1. Ciao Armando,
      ho letto quello che hai postato e come spesso scrivo ti chiedo di non inviare codice nei commenti perchè è illegibile.
      Per modificare l’ora puoi leggere uno degli articoli dedicati all’RTC ho scritto uno sketch in cui eseguo il cambio ora 🙂

      Mauro

    • armando on 22 maggio 2013 at 15:03
    • Reply

    ok grazie
    ti faccio sapere l’esito
    a.

    • alessio on 19 giugno 2013 at 19:10
    • Reply

    Ciao mauro, ho istallato l’rtc ds1307 e compilato lo script. Visualizzando la data sul monitor seriale i dati sono corretti e vengono aggiornati correttamente. Il mio problema è mandare un segnale HIGH oppure un clock in uscita da un pin digitale in corrispondenza ad un orario o ad una data. Io ho provato i comandi (iSerial.available e serial .read con opportuni cicli if) ma in uscita non mi da niente. hai qualche consiglio?

    Grazie in anticipo,
    alessio

    1. Ciao Alessio,
      i comandi che stai utilizzando servono per comunicare attraverso il canale seriale/usb di arduino, non fa quello che ti occorre.

      Quello che vuoi realizzare é più simile al concetto di sveglia o timer, puoi leggere l’articolo sul l’irrigazione arduino, troverai dei concetti più simili a quello che vuoi realizzare.

      Dovrai ovviamente adattare lo sketch seguendo la spiegazione che trovi nei ieri articoli.

      Mauro

        • Alessio on 24 giugno 2013 at 13:02
        • Reply

        Grazie Mauro, ho risolto il problema grazie ai tuoi suggerimenti!

        1. Ciao Alessio,
          sono contento per te, non vedo l’ora di sapere che il tuo progetto é pronto e ti offro fin da ora la possibilità di condividerlo sul Blog.

          Mauro

    • Paolo on 29 agosto 2013 at 17:10
    • Reply

    Buongiorno Mauro,
    ho un Arduino UNO, ho scaricato la libreria RTC da tè consigliata, ho collegato la scheda RTC DS1307 come da tutorial, ho usato lo stesso sketch del tutorial ma quando avvio il monitor seriale mi compaiono stranissimi caratteri ,tipo cirillico 🙂 suppongo sia un problema di codifica o di protocollo … non sò che cosa fare, avresti dei consigli da darmi per risolvere il problema?

    Complimenti per la pulizia delle saldature 🙂 … che saldatore usi?

    1. Ciao Paolo,
      i caratteri strani sul monitor seriale potrebbero dipendere dal Baud rate impostato nello sketch e sul monitor seriale.
      Controlla che entrambi siano a 9600, chiusi e riapri il monitor seriale.

      Il saldatore che utilizzo è uno di quelli comuni da bricocenter da 35/40w ciò che penso faccia la differenza è lo stagno che uso un 60stagno 40 piombo … solitamente invertono le proporzioni.

      Mauro

        • Paolo on 30 agosto 2013 at 11:31
        • Reply

        grazie, era il Baud rate, però lo ho impostato a 57600 come nel tuo esempio, che tipo di vantaggi o svantaggi può portare la modifica del Baud rate? Ho intenzione di realizzare un monitoraggio per un piccolo impianto fotovoltaico con supervisione web … ed anche un sistema di irrigazione (ho visto che hai un post sull’argomento) con sensori di controllo, tutto tramite web …

        35/40 w ? non lo avrei mai detto … io uso ancora la pasta saldante … anche tenere pulita la punta del saldatore con un pò di carta vetrata aiuta molto nella saldatura

        Saluti

        1. Ciao Paolo,
          per comprendere le differenze sulle impostazioni di baudrate ti consiglio di leggere la pagina di wikipedia sul baud rate, è un argomento lungo da sviscerare in un commento.

          Mauro

    • Giordano Settimo on 2 gennaio 2014 at 23:10
    • Reply

    Ciao Mauro,
    non capisco una cosa. Nei collegamenti utilizzi i pin 4 e 5 ma poi nello sketch, tramite la libreria fai solo “DateTime now = RTC.now();”

    E’ la libreria che utilizza i pin 4 e 5 ?
    Se volessi cambiare i pin dovrei agire sulla libreria?
    Inolotre a cosa serve Wire.begin(); ?

    1. Ciao Giordano,
      L’RTC usa il protocollo I2C che su arduino trovi sui pin A4 ed A5 e non puoi spostare altrove a meno di non cambiare modello di arduino la Mega ad esempio usa 20 e 21 per questo protocollo.

      La libreria usa quei due pin in modo certo sapendo ciò che ti ho scritto sopra.

      Il metodo begin() dell’oggetto Wire ( Wire.begin() ) inizializza l’uso dell’oggetto Wire incaricato di comunicare con l’RTC attraverso il protocollo I2C

      Mauro

        • Giordano Settimo on 4 gennaio 2014 at 15:07
        • Reply

        Grazie!

        • Giordano Settimo on 29 gennaio 2014 at 16:53
        • Reply

        Mi è capitato che l’RTC perdesse totalmente le informazioni sulla data oppure che abbia un ritardo di qualche minuto. Mi è anche successo che la data sia corretta ma, non alimentando più l’RTC, riprovando il giorno dopo, prelevando il giorno tramite now.day() non venga conteggiato l’incremento del giorno…

        Eppure la batteria tampone è carica… come mai secondo voi?

        1. Ciao Giordano,
          le anomalie che rilevi sembrano dovute a qualche calo di tensione non compensato dalla batteria tampone o al malfunzionamento dell’RTC.

          Se la batteria tampone è carica e connessa saldamente alla shield protenderei per il secondo motivo.
          Quanti giorni hai tenuto in test il progetto verificando queste anomalie? E quante volte i quei giorni si sono verificate?

          Il secondo problema ( reset della data ) potrevbbe essere invece dovuto allo sketch che in fase di setup() non trova l’RTC o quest’ultimo non gli risponde immediatamente ed entra nella routine di impostazione dell’ora resettandola al giorno in cui hai caricato lo sketch, é successo anche a me.

          Mauro

            • Giordano Settimo on 23 febbraio 2014 at 18:20

            Scusa se rispondo solo ora.
            L’anomalia l’ho rilevata facendo prove ovvero eseguendo il codice più volte e modificandolo. L’anomalia del giorno passato ma non tenuto in conto dall’RTC l’ho rilevata facendo dei test a mezzanotte. Dopo 10 minuti dalla mezzanotte l’orario rilevato dall RTC era giusto, ma il giorno era rimasto fermo.

            La batteria risulta, con un tester, carica ed avendo l’alloggiamento apposito sembra ben salda.

            Cmq questi problemi li rilevo solo dopo che stacco e spengo tutto il circuito. Se all’accensione lo allineo all’orario giusto, poi chiaramente i minuti vengono rispettati mentre per il giorno non ho più potuto fare test a mezzanotte.

            Rileggendo il commento mi rendo contro che non è chiarissimo… devo intanto perderci più tempo io.
            Per gli utenti del sito: https://www.youtube.com/watch?v=k-g-h3u-66s

          1. Ciao Giordano,
            ho provato diverse shield con RTC senza rilevare errori come quelli che mi descrivi.
            Ti suggerirei di cambiare RTC e verificare nuovamente, potrebbe essere difettoso il componente.

            Mauro

    • Andrea on 22 maggio 2014 at 18:18
    • Reply

    Ciao Mauro, innanzitutto ti ringrazio perchè il tuo sito mi ha letteralmente guidato nelle prime esperienze con arduino ed è tutto spiegato veramente bene. Volevo segnalarti che oggi ho provato lo sketch riportato e non ha funzionato( in particolare, la seriale restituiva sempre RTC NOT RUNNING , e sempre la stessa data e ora di default). Alla fine ho risolto scaricando un altra versione della libreria RTC ( da questo indirizzo: https://github.com/adafruit/RTClib )

    Segnalo questa cosa nel caso altri lettori incontrassero le stesse difficoltà .
    Grazie per tutti i tuoi meravigliosi tutorial senza i quali oggi probabilmente starei ancora accendendo e spegnendo un led 😀
    Andrea

    1. Grazie Andrea per la condivisione dell’informazione.

      Una curiosità personale: che RTC shield possiedi?

        • Andrea on 23 maggio 2014 at 15:20
        • Reply

        Lo stesso identico modulino che è riportato sopra nelle foto. L’unica differenza grafica che sono riuscito a notare, è che i nomi dei vari pin nel mio modulino sono riportati sotto, nel lato dove c’è l’oscillatore e non in quello superiore dove c’è la batteria tampone. Per il resto stessa forma, stesso colore, stessi pin, ecc ecc 🙂

        1. Ciao Andrea,
          mi è sorto il dubbio che la tua scheda potesse essere più simile a quella della adafruit che a quella da me utilizzata.
          Questa differenza potrebbe spiegare anche il funzionamento con la libreria che hai scaricato.

          Mauro

  1. Ciao.
    Anche a me restituisce sempre lo stesso messaggio.
    E la data è impossibile da modificare.
    Il mio modulo è quello che hai usato in altri progetti, che si innesta sopra arduino UNO

    Questa sera proverò anche io quello sketch.
    Spero di risolvere.

    1. Ciao Enrico,
      quando dici “restituisce sempre lo stesso messaggio” intendi RTC not found ?
      Se si potresti avere un modulo non compatibile con la libreria che hai scaricato.
      Se usi la shield rtc della futura elettronica, che io ho utilizzato in altri tutorial, sappi che devi usare la libreria modificata consigliata in quei tutorial e sul sito del produttore.

    • Matteo on 17 settembre 2014 at 23:33
    • Reply

    Ciao Mauro, prima di tutto complimenti per tutti i tutorial, mi sto avvicinando al mondo di Arduino da poco più di un mese e il tuo sito mi sta aprendo un mondo davanti agli occhi!
    Ho letto in internet che la batteria LIR2032 è una batteria ricaricabile; l’alimentazione necessaria per la ricarica (sempre se è prevista da questo shield) deriva dall’alimentazione della scheda stessa (Vcc Gnd) o va alimentato un altro piedino apposito? A tal riguardo, sai fornirmi brevemente qualche indicazione sulla funzione degli altri piedini o dove posso reperirla? Non sono ancora pratico nel trovare le informazioni a riguardo, sto scoprendo pian piano i siti da consultare e questo fin’ora mi è risultato il migliore per un inesperto di elettronica come me.

    Grazie mille e ancora complimenti!!!

    1. Ciao Matteo,
      non conosco la LIR2032 come batteria ricaricabile e dubito che questa shield possa ricaricare tale pila.
      In ogni caso ti consiglio di far riferimento al produttore della shield per verificare il funzionamento degli altri pin e la posibilità di ricaricare la batteria.

    • antonio on 30 settembre 2014 at 09:37
    • Reply

    Innanzitutto, grazie di esistere, sono nuovo di Arduino e in questo sito ho imparato i rudimenti.
    Anch’io ho un problema con un shield della Futura Elettronica, diversamente dai problemi su menzionati, il mio proprio non compila. La libreria è quella modificata che ho trovato nel sito della Futura e lo sketch è quello degli esempi inseriti e uguale a quello soprariportato. Ho provato sia con Ubuntu che con windows 7, niente, in fase di compilazione ci sono oltre 100 errori. Ho provato a cancellare le righe contenenti la RTC, la compilazione è andata a buon fine, ma solo aggiungendo #include “RTCLib.h” appaiono gli errori. Ringrazio anticipatamente per i consigli/suggerimenti che vorrete dispensarmi.

    1. Ciao Antonio, sei sicuro di aver installato la libreria in modo corretto? Prova ad incollae le prime 3 righe di errore e provo ad interpretarle.

        • Antonio on 4 ottobre 2014 at 21:07
        • Reply

        Ciao Mauro,
        ringrazio della risposta ma ho già risolto, la libreria era stata installata correttamente ma non c’era verso di farla funzionare, quindi ho scaricato la libreria originale RTCLib-master.h ed ho notato che mancavano parecchie righe di codice, ho aggiunto il codice per far lampeggiare il LED, salvato aggiuntala manualmente nella cartella principale di Arduino per windows 8 e in automatico in sketchbook in Ubuntu e tutto è filato liscio.
        Ringrazio ancora e mi permetto di chiedere un’altra delucidazione. Ho arduino da poco tempo e mi piace smanettarci, provando e riprovando con diversi codici con varie modifiche. Ovviamente per vedere i risultati devo ogni volta compilare e rigettare nella flash di Arduino, “consumando” la memoria, dato che resiste per 10000 scritture (che sono tante) ma pur sempre “limitate”, chiedo se c’è un emulatore e/o simulatore e/o virtualizzatore, in modo da provare e riprovare fintanto che il codice è perfetto e quindi copiarlo definitamente nella flash.
        Sperando di essermi spiegato, ringrazio e saluto cordialmente
        P.S. mentre stavo scrivendo/navigando in internet ho scoperto il prg Fritzing, ma non ho capito se fa al caso mio.

        1. Ciao Antonio,
          sono contento tu sia riuscito a risolvere il problema riscontrato con la RTCLib.
          Simulatori esistono, io stesso ho scritto di uno o due simulatori, non ricordo con precisione; tuttavia sono adatti se devi accendere o spegnere dei led,motori e servo e poco altro quando arrivi ad usare le shield come la RTC non sono in grado di simulare anche le shield.
          E’ vero che 10000 sono un limite ma io stesso non le ho mai raggiunte pur avendo scritto oltre 260 articoli e tanti progetti e di test ne faccio molti ed in ogni caso se hai passione vedrai che ti procurerai presto tanti altri modelli arduino perché al primo progetto finito vorrai installarlo e lasciarlo in funzione e per continuare a sperimentare ti occorrerà un nuovo arduino 🙂

            • Antonio on 8 ottobre 2014 at 09:54

            Ciao Marco,
            in effetti hai ragione, a questo RTC ho subito aggiunto una SD card e tribolando non poco, per trovare piedini digitali liberi, sono riuscito ad “introdurci” un display. Ora il tutto funziona interrottamente per acquisire, solo per curiosità, giornalmente le temperature; volevo aggiungere un sensore di umikdità, ma i piedini SCK MISO e MOSI sono già occupati. Cmq ti ringrazio enormemente per il tuo intervento. Grazie e saluti

          1. Ciao Antonio,
            i sensori di umidità che ho provato io sono di tipo DHT11 o SHT1x ed usano SDA/SCL od anche un solo pin digitale.

            • antonio on 9 ottobre 2014 at 09:40

            Ciao Mauro,

            questo è quello che ho trovato in Cina e questa la piedinatura
            Sensor MTH01 Sensor
            1 CS – On/Off
            2 SCK – CLK
            3 SDAT – MOSI
            4 Reset – Reset
            5 VSS – GND
            6 VDD – +5 V

            e questi i collegamenti consigliati
            Pin Arduino(Slave) Pin Sensor(Master)
            7 1
            11 3
            13 2

            Un chiarimento, i pin SDA e SCL sono quelli sopra il D13?
            che attualmente sono impegnati dalla scheda RTC e l’11 e il 13 dalla SCCard.
            Saluti e buona giornata.

    • Carlo on 17 ottobre 2014 at 18:08
    • Reply

    Gentile Mauro

    innanzi tutto grazie per i suoi preziosi tutorial e la sua assistenza
    Ho acquistato un RTC del tutto simile a quello presentato da lei presentato in questo tutorial
    Ho iniziato a smanettarci sopra e da allora sono iniziati degli “strani” comportamenti che non riesco ad interpretare e stanno mettendo a dura prova la mia salute mentale 🙂

    Vorrei innanzitutto impostare l’ora attraverso la funzione riportata nella riga 16 dello sketch riportato sopra, ma dal momento che il mio rtc “is running” lo sketch ovviamente non lo aggiorna allora ho pensato:

    Tolgo la funzione dal ciclo IF, carico lo sketch su arduino, commento la riga 16 e la ricarico senza mai aprire il monitor seriale per non fare resettare arduino e ripartire il setup…
    Tutto sembra funzionare , l’ora è perfettamente sincronizzata se non che quando chiudo il programma e lo riapro l’RTC si risincronizza con l’orario del vecchio sketch
    Ma se la funzione di sincronizzazione è commentata perchè lui si sincronizza lo stesso???

    Altra opzione, scollego tutto e tolgo la batteria, così il ciclo IF legge che l’ora non è impostata e fa partire la sincronizzazione… Tutto funziona ma mi accorgo che perde 5 secondi al giorno, allora nel loop inserisco che alle ore 1:15:30 “RTC.adjust(DateTime(now.unixtime() – 5))” e poi aggingo un delay di 15 secondi

    Tutto perfetto se non che dopo qualche giorno di funzionamento succede che
    a) l’ora è perfettamente sincronizzata ma il giorno del mese è indietro (tipo di 1 o 2 giorni)
    oppure
    b) la data è precisa ma l’ora è sbagliata di qualche minuto

    A questo punto mi chiedo:
    a) sto facendo un sacco di confusione
    b) l’RTC funziona male (l’ho pagato circa 4 euro)
    c) = a x b

    P.S. Sarebbe bello avere un tutorial che dimostra come impostare l’ora attraverso il monitor seriale 😉

    Grazie in anticipo per la pazienza
    Ciao

    1. Ciao Carlo,
      le anomalie che tu rilevi non mi sono mai capitate, è vero che, forse, non ho mai eseguito controlli così approfonditi con tutti i mie RTC, ne ho comperati tanti modelli ed usati su molti progetti.
      Considerando il costo di questi RTC e la qualità costruttiva direi che qualche secondo di perdita è comprensibile ed accettabile, non sono degli orologi atomici.
      La altre anomalie mi fanno pensare ad un malfunzionamento della shield in tuo possesso.

      Per l’impostazione dell’ora via seriale non è complesso da realizzare e sono sicuro che sapresti realizzarlo anche tu leggendo i tutorial sul blog, non l’ho mai gatto perché ritengo che sia più interessante impostare data ed ora con dei pulsanti senza avere il Pc sempre collegato.

        • Carlo on 21 ottobre 2014 at 16:20
        • Reply

        Grazie Mauro

        Credo che i comportamenti “anomali” siano da attribuire all’utilizzo del monitor seriale, perchè nel weekend ho seguito il tutorial per impostare data e ora attraverso il display lcd e funziona tutto benissimo, ovviamente continua ad avanzare di 5 secondi al giorno, ma lo compenso con quella funzione che ho riportato sopra.

        Giusto per la cronaca, anche il mio monta una batteria ricaricabile

        Attraverso la tua libreria è possibile gestire i giorni della settimana?
        Altrimenti metto un contatore che avanza alle 00:00:00 e si resetta quando supera 7

        Ciao
        Carlo

        1. Ciao Carlo,
          a memoria ricordo che la libreria gestisce anche i giorni della settimana ma che non abbia metodi per recuperarli dallo sketch.
          Dovresti crearti un metodo per estrarre questa informazione dalla libreria ed usarla nello sketch.

    • Alfredo on 19 ottobre 2014 at 21:38
    • Reply

    ciao,volevo chiederti una spiegazione sul modulo RTC,io ne ho uno uguale al tuo,lo uso con arduino uno,ho notato che la batteria non si ricarica,anche dopo ore è sempre scarica e quando spengo tutto e riaccendo anche dopo pochi secondi l’ora torna sempre indietro al momento in cui ho caricato lo sketch…ho provato anche a mettere una batteria da 3 volt ma non cambia nulla,è solo questione di batteria o un malfunzionamento del modulo?(senza batteria se misuro sui teminali il voltaggio è superiore ai 4 volt)dovrebbe tenere la data anche dopo giorni senza essere alimentato vero?grazie e complimenti per il sito,ciao ciao

    1. Ciao Alfredo,
      il mio modulo non possiede una batteria ricaricabile, il tuo si?

        • Alfredo on 20 ottobre 2014 at 23:08
        • Reply

        ciao Mauro,
        il mio si ha una batteria ricaricabile,è uguale a quello in foto qui sopra,ma rileggendo tra le righe c’è appunto scritto che la batteria serve per recuperare l’ora in caso di mancanza di alimentazione…non capisco perché il mio non la conservi,devo provare a ricaricare la batteria fuori dal modulo e poi rimetterla,ma anche se metto una batteria normale da 3 volt non cambia nulla,l’orario si perde sempre…

        1. Ciao Alfredo,
          se la pila è scarica può verificarsi la perdita di orario, prova a ricaricarla o con una pila nuova, anche non ricaricabile.
          Se hai già verificato con pile cariche e perde cmq l’orario è possibile che tu debba eseguire qualche configurazione Hw tipo saldare qualche ponticello o altro, devi chiedere al rivenditore che potrà anche sostituirti il componente in assistenza.

            • Alfredo on 21 ottobre 2014 at 23:13

            ciao Mauro
            provo a contattare il rivenditore,l’importante è avere la certezza che l’orario non va perso se tolgo alimentazione…grazie 1000 ciao ciao 🙂

    • andrea on 12 febbraio 2015 at 20:05
    • Reply

    Ciao, vorrei chiederti come posso impostare l’accensione e lo spegnimeto ad un determinato orario,
    es. si accende alle 9 e 30 del mattino e si spegne alle 17 e 30 del pomeriggio, perchè trovo solo code con lcd pulsanti ecc, ma ho solo arduino uno e rct 1307.
    Grazie in anticipo per la pazienza
    Ciao

    1. Ciao Andrea,
      lo sketch è descritto linea per linea proprio per farti comprendere il suo funzionamento ed eliminare le parti di codice non necessarie al tuo progetto.
      Ti bastano poche righe della loop per eseguire quello che desideri.

    • Aristide on 21 febbraio 2015 at 02:40
    • Reply

    ciao mauro io e da pochissimo che mi sono avvicinato al mondo di arduino dato che le l’elettronica mi ha sempre affascinato ho comprato arduino e una scheda ds 1307 con una scheda rele’ perche volevo fare un progetto dove arduino eccita dei rele’ in ore stabilite del giorno e volevo chiederti se riesci a aiutarmi in questo progetto . grazie

    1. Ciao Aristide,
      ci sono tanti articoli che ho pubblicato su questo argomento.
      Studiali e sono sicuro che sarà il miglior aiuto che posso darti

        • Aristide on 24 febbraio 2015 at 22:43
        • Reply

        grazie mille
        speriamo che me la cavo 😉

    • Aristide on 5 marzo 2015 at 12:06
    • Reply

    Ciao Mauro scusami se ti disturbo ancora ti volevo chiedere io ho montato il modulo RTC Tiny Ic2 e sembra che va bene in senso vedo il led di arduino dove ce scritto TX che lampeggia ma se apro il monitor seriale vedo che ogni lampeggio mi da delle scritte strane e normale non dovrebbbe comparire la data le ore minuti ecc ecc forse devo modificare lo sketch .

    1. Ciao Aristide,
      controlla che il baudrate impostato sul monitor seriale ( in basso a destra ) sia il medesimo impostato nello sketch.
      Se non sai cosa sia il baud rate o dove si imposta nello sketch puoi leggere qualche articolo del corso base in cui lo descrivo.

    • Aristide on 6 marzo 2015 at 11:42
    • Reply

    ciao Mauro ti confermo che il baud non era corretto infatti appena l’ho corretto si legge l’ora e la data . Adesso ti chiedo ma per impostare l’ora precisa bisogna aver per forza un display o no e poi se voglio collegarci una scheda rele’ per farli eccitare in un orario che voglio devo cambiare sketch se riesci puoi essere piu dettagliato scusami se ti rompo . Grazie

    1. Ciao Aristide,
      puoi leggere i miei articoli sulle centraline per irrigazione, dovresti trovare tutto già fatto.
      Con la descrizione riga per riga troverai facile anche apportare le modifiche che ti servono.
      Se preferisci approfondire meglio le tue conoscenze su arduino prima di realizzare il tuo progetto ti consiglio la lettura del mio corso base on-line gratuito arduino o di partecipare ad uno dei miei corsi arduino in aula.

    • Aristide on 11 marzo 2015 at 10:22
    • Reply

    ok TI ringranzio per il consiglio

    • Francesco on 12 marzo 2015 at 15:10
    • Reply

    Ciao Mauro…. io ho un tiny rtc, e sono riuscito a settarlo e a visualizzare ora mnuti secondi e anche calendario su LCD , il problema è che ogni un Tot di ore lui va avanti di 3 o 4 secondi… secondo te c’è qualcosa che non va sull’ Rtc ? Libreria? Quarzo?
    Se aumenta i secondi costantemente non va molto bene perchè fra un po di anni probabilmente sarà sballato di ore e non di secondi…

    1. Ciao Francesco,
      la precisione di questi moduli RTC è alquanto opinabile.
      La scorsa settimana un appassionato mi ha regalato un nuovo tipo di RTC senza quarzo ma con taratura laser, non ho ancora avuto tempo di testarlo.
      Nelle prossime settimane ci provo e rilascio i risultati sul blog.

        • Francesco on 12 marzo 2015 at 23:12
        • Reply

        Quindi mi devo rassegnare per la precisione… Inserirò un recupero dei secondi aumentati magari ogni giorno alla stessa ora per rimanere almeno nel minuto…Grazie Cmq

        1. Ciao Francesco,
          l’alternativa è utilizzare moduli con precisione maggiore, dipende da che tipo di progetto stai realizzando.
          L’ultima spiaggia potrebbe essere connetterti ad un server ntp ( network time protocol ) pubblico.

            • Francesco on 14 marzo 2015 at 01:23

            Un esempio di modulo di precisione ?
            In rete si trova qualcosa? …Invece via software con un atmega328 e una libreria si può fare qualcosa di preciso ??
            Grazie….

          1. Ciao Francesco,
            non ho sottomano il modulo di precisione che mi hanno regalato ed in ogni caso non l’ho ancora provato per darti delle dritte.
            Se vuoi usare l’ntp per la sincronizzazione via ethernet puoi consultare gli esempi sulla classe Ethernet presenti nell’IDE arduino.

    • Luca on 16 marzo 2015 at 12:25
    • Reply

    ciao Mauro, ho un problema anche io con questa schedina rtc
    in pratica lo sketch funziona …ma, dopo un po si sballa
    è capitato ieri sera, l’orario avanzava regolarmente…una volta arrivato alle 20.59 è passato alle 21.09..poi alle 21.19…21.29 e cosi via.
    da cosa è dovuto questo problema?

    altra cosa, come in foto anche io ho l’alloggio per la LIR 2032 3.6 V che come saprai è una batteria ricaricabile.
    se la sostituisco on una sempplice CR2032 3V non ricaricabile? avrei problemi di surriscaldamento della batteria e possibile scoppio?

    1. Ciao Luca,
      per il problema dell’orario avrai letto nei commenti che si verifica anche ad altri appassionati è che questi moduli non sono super affidabili.
      C’è da dire che il tuo fa dei salti preoccupanti, di solito perdono qualche secondo al giorno, ma non fanno salti nel tempo.
      Potrebbe essere danneggiato.
      Per la pila io non conosco il circuito di questi componenti dovresti rivolgerti al produttore chiedendo se la funzione di carica puoi disabilitarla.

        • Luca on 16 marzo 2015 at 14:09
        • Reply

        l’ora scorre, solo che fa dei salti …ma c’è qualcosa che non va con il codice mi sa.
        xke in pratica invee che aggiornare i minuti per esempio 20.58 – 20.59 – 21.00 – 21.01…mette il 10 al posto di 01, il 20 al posto di 02. in pratica cambia il numero prima .
        adesso per esempio è passato da 13.59 a 14.1, poi 14.2 e cosi via…come se salta la scrittura . dobrevve mettere lo zero davanti.
        come posso fare a postarlo il codice?

        se utilizzo questo codice funziona meglio:
        http://www.mauroalfieri.it/elettronica/rtc-shield-ds1307-impostare-data-e-ora.html
        il problema è che è stato sviluppato per poter modificare ora e data e molte righe sono da togliere. dici che è possibile toglierle? potresti aiutarmi a farlo? xke ne sto uscendo pazzo 🙂

        1. Ciao Luca,
          secondo me stai sbagliando l’interpretazione del codice perché questo esempio, classico per testare gli RTC, ha un delay di 3 secondi per cui è normale che tu veda :59 e poi :01 se stai visualizzando i secondi .. non capisco cosa tu stia leggendo.
          Dove leggi nello sketch che dovrebbe metterci lo 0 davanti? Io non lo vedo in nessuna linea di questo sketch.
          Il codice non puoi postarlo, è già scritto in questo articolo, se lo hai modificato introducendo degli errori puoi correggerli ripartendo da questo esempio.

          Se l’altro esempio di codice funziona meglio usa quello eliminando solo la funzione setMode() e il suo richiamo nella loop().
          In ogni caso non c’è alcuna differenza logica tra questo sketch e quello che ti permette di impostare l’ora, l’unica differenza è che quello scrive su un display e per farlo usa l’sprintf();

    • feliciano on 17 marzo 2015 at 20:28
    • Reply

    prima di tutto mi associo ai tanti complimenti che ricevi. veramente meritati.

    Sto usando uno sketch che usa la libreria DS1307RTC.h e non la RTClib.h. purtroppo non riesco a leggere il giorno della settimana (Wday) poichè anche se il compilatore non da errore il valore è sempre = 6 (istruzione Serial.print(tm.Wday).
    per gli altri parametri data/tempo tutto è ok

    Qualche idea per aiutarmi?
    Quale è la principale differenza tra le due librerie?
    grazie e saluti
    Feliciano

    1. Ciao Feliciano,
      hai provato a consultare la documentazione della libreria che stai utilizzando ?
      Io ho provato solo le librerie che leggi nei miei articoli.

    • andrea on 21 marzo 2015 at 14:03
    • Reply

    ciao mauro
    complimeti ancora per tutto…sei per me fonte di ispirazione
    vorrei solo sapere perché quando visualizzo la data e il tempo, invece di apparirmi la data e l’ora giusta, mi appare 2165/165/165 165:165:85
    se puoi aiutarmi, mi fai un grande favore
    grazie e ancora fantastico

    1. Ciao Andrea,
      hai connesso ad A4 ed A5 altri sensori o shield non I2C?
      di solito questo tipo di errore è dovuto ad un uso errato dei pin A4 ed A5 di arduino.

        • Domenico on 24 giugno 2018 at 21:09
        • Reply

        Ciao Mauro, anch’io ho lo stesso errore ma ai pin A4 eA5 sono collegati i due pin del display, come si risolve?
        Grazie.

        1. Ciao Domenico,
          quale problema ? Dovresti indicarmi a quale errore ti riferisci.
          In generale se vuoi utilizzare i pin A4 ed A5 come I2C non devi utilizzarli per altri scopi.

    • Simone on 16 maggio 2015 at 11:02
    • Reply

    Ciao Mauro,
    ormai seguo i tuoi tutorial da moolto tempo e devo dire che sono più che ottimi, solo che di improvviso mi sono scontrato con questo tema e non so come risolvere…

    tempo fa ho acquistato questa scheda
    https://www.futurashop.it/Allegato_PDF_IT/8190-RTCSHIELDKIT.pdf

    basata su DS1307, ed ha sempre funzionato alla perfezione, ho fatto temporizzatori, chiudere un relè ad una ora determinata ecc… insomma tutto perfetto…
    ultimamente sono andato per modificare dei parametri su un programma che stava già funzionando ormai da anni e mi esce questo errore:

    Arduino:1.6.4 (Windows 7), Scheda:”Arduino Uno”

    Opzioni di compilazione cambiate, ricompilo tutto

    In file included from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/WString.h:29:0,
    from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Print.h:26,
    from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Stream.h:26,
    from C:\Program Files\Arduino\hardware\arduino\avr\libraries\Wire/Wire.h:26,
    from C:\Users\Simone\Documents\Arduino\libraries\RTClib\RTClib.cpp:4:
    C:\Users\Simone\Documents\Arduino\libraries\RTClib\RTClib.cpp:17:31: error: variable ‘daysInMonth’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
    static uint8_t daysInMonth [] PROGMEM = { 31,28,31,30,31,30,31,31,30,31,30,31 };
    ^
    Errore durante la compilazione

    Io non so proprio più che fare, ho cercato altre librerie, scaricate di nuovo le tue, provato di nuovo programmi base ma mi da sempre e dico sempre questo errore nella compilazione.
    Come potrei risolvere? c’è un modo?

    Attendo una tua gentile risposta…
    Grazie…

    1. Ciao Simone,
      è di certo un problema di librerie, ti segnala che il metodo daysInMonth non è disponibile nella libreria che possiedi.
      Hai provato scaricare la libreria RTCmod di futura elettronica, eliminare tutte quelle presenti nel tuo IDE e ricaricare solo quest’ultima ?

      L’alternativa è modificare lo sketch in modo che non chiami quel metodo oppure scriverti quel metodo nella tua libreria.

    • roberto on 15 giugno 2015 at 01:14
    • Reply

    ciao
    sto cercando di automatizzare l’acquario, e ho pensato di utilizzare un raspberry come controlker principale e alcuni arduini come schede di controllo di processo, il tutto comunicante con il bus I2C dove gli arduini dovrebbero essere gli slave.

    l’idea era di dare a ogni Arduino un indirizzo diverso (p.e. 0x04 0x05 , ecc)
    nel loop principale di ciascuno fare eseguire il processo (leggere le temperature da sensori dallas e attivare il riscaldamento, oppure leggere il ph dell’acqua e aprire in base a quello l’elettrovalvola del CO2)… durante il processo scrivo anche i valori che misuro in un registro.
    regolarmente il raspberry master interroga ciascuna scheda leggendo i valori del registro della scheda memorizzandoli in un db.

    ho quindi provato a scriverela parte su arduino che gestisce il bus wire…
    se non attivo il bus I2C tutto funziona bene… (lasciato girare x giorni)
    quando il raspberry inizia a interrogare le schede subito funziona tutto, poi mi accorgi che non tutti i valori dei registri arrivano corretti… poi inizio ad avere letture strane delle temperature o del ph…
    a questo punto, resettando la scheda in questione tutto riparte regolarmente, gira x un po poi ricomincia a dare errori…
    fermando la supervisione del raspberry le varie schede ricominciano a funzionare correttamente.

    in particolare una cosa che mi ha stupito è che se cercavo di leggere i 12 byte del registro di uno di questi arduini subito me li dava correttamente… poi dopo un po di letture gli ultimi byte diventavano 255… il numero dey byte finali errati aumentava man mano…
    ho quindi deciso di leggere un byte x volta… sembrava funzionare… ma dopo un po che girava sfalsava il numero del registro di 1… (gli chiedevo il primo e mi dava il secondi, gli chiedevo il secondo e mi dava il terzo.. e così via, resettando k’arduino si riallineava…
    ho quindi pensato di raddoppiare il registro e scrivere il dato a coppie uguali 1=2 3=4 ,ec… e poi chiedere i fispari(se avveniva lo scalamento il valore ottenuto era lo stesso..
    a questobpunto ha iniziato a darmi 0 nella lettura del registro 1.. solo in quello…

    ho rischiato di buttare il computer fuori dalla finestra…

    ho cercato su internet se trovavo una qualche implementazione di uno slave completo I2C per arduino dove scrivere i valori in un registro e poi interrogarli con I2C ma non ho trovato nulla.

    1. Ciao Roberto,
      purtroppo non ho mai eseguito esperimenti con la comunicazione I2C tra arduino e/o altre schede.
      L’unica cosa che mi viene in mente è che per qualche motivo, dovresti verificare nello sketch, tu non richieda il registro corretto ma incrementi la lettura del registro involontariamente.
      Potrei anche sbagliare.

    • roberto on 15 giugno 2015 at 01:25
    • Reply

    allego di seguito il programma dettagliato:

    1) innanzitutto il protocolla I2C permette di passare pacchetti di byte, avendo temperature del tipo 24,75° ho deciso di passare separatamente la parte intera e la parte decimale (2 cifre)
    ho quindi deciso di creare un vettore dy byte da trasmettere che per il protocollo può essere al
    massimo di 32 byte, ho deciso di dare alla scheda l’indirizzo 0x05:

    [[ codice rimosso in automatico ]]

    pointregister è un puntatore all’area di memoria (vettore VALORI) dove memorizzo nel programma i dati…

    [[ codice rimosso in automatico ]]

    nella funzione setup avvio l’I2C con indirizzo 5 e definisco 2 funzioni che vengono attivate quando sul bus avviene un evento
    attivo anche il watch dog per evitare che il sistema si blocchi

    [[ codice rimosso in automatico ]]

    il ciclo principale ha ben poco a che fare con I2C, esegue solo le funzioni sul bus dallas per leggere le temperature, scrive le temperature sul display, attiva relais, ecc
    inoltre ogni giro attende un secondo e resetta il watchdog

    [[ codice rimosso in automatico ]]

    infine riporto qui sopra le due funzioni per la gestione del bus
    le altre schede hanno un funzionamento analogo e il software ha la stessa identica struttura.

    1. Ciao Roberto,
      come hai letto in fondo ad ogni mio articolo “non è possibile incollare sketch o parti di sketch nei commenti”

    • luca on 17 agosto 2015 at 20:51
    • Reply

    buongiorno, specifico già che di arduino so molto poco.
    vorrei costruire un impianto per l’automatizzazione delle tapparelle di casa con una scheda Mega, dei relè e un temporizzatore RTC.
    La mia domanda è, dopo aver collegato il temporizzatore alla scheda , come collego il temporizzatore ad un relè? e soprattutto che modifiche devo apportare allo sketch.
    grazie

    1. Ciao Luca,
      benvenuto.
      Se sei neofita ma con tanta voglia di imparare e realizzare il tuo progetto ti consiglio di leggere un po di articoli partendo dal corso base on-line gratuito per iniziare e man mano comprenderai facilmente come procedere.
      Purtroppo per un progetto come il tuo occorrono molte informazioni e di certo non è una cosa che può accadere nei commenti.

    • mattia on 11 dicembre 2015 at 19:17
    • Reply

    ciao mauro davvero complimenti per i tuoi progetti!
    ho un piccolo problemino , decommentando la linea 16 per aggiornare l’ora mi mette una data del 2013! , ovviamente la data nel pc è l’attuale, che problema potrei avere?
    grazie mille in anticipo!

    1. Ciao Mattia,
      la riga 16 si occupa dell’impostazione della data ed ora solo se il controllo precedente restituisce il valore false.
      Leggi bene come funziona lo sketch per comprendere come funziona.

    • Nicola on 21 febbraio 2016 at 00:10
    • Reply

    Salve,
    dopo lunghi anni di abbandono (interrotto da brevissime eccezioni) del mio vecchio hobby di cimentarmi con circuiti elettronici ho recentemente deciso di riprenderlo con le opportunità offerte oggi, quindi Arduino.
    In quanto a conoscenza sono alla lettera “A”, pertanto so poco quanto nulla. Ho acquistato la schield DS1307, ho caricato la “adafruit RTClib (aggiornata alla v. 1.1). Purtroppo ricevo questo errore:

    Arduino:1.6.7 (Mac OS X), Scheda:”Arduino/Genuino Uno”

    sketch_feb20a:8: error: invalid digit “8” in octal constant
    08
    ^
    sketch_feb20a:9: error: invalid digit “9” in octal constant
    09
    ^
    sketch_feb20a:1: error: expected unqualified-id before numeric constant
    01
    ^
    exit status 1
    invalid digit “8” in octal constant

    Questo report potrebbe essere più ricco di informazioni con
    “Mostra un output dettagliato durante la compilazione”
    abilitato in “File > Impostazioni”

    Spero possa darmi una mano a capirci qualcosa. Grazie anticipate.

    1. Ciao Nicola,
      prova con la libreria rilasciata dal produttore o con una di quelle che ho indicato in altri articoli dedicati a questo componente.

    • Damiano on 10 maggio 2016 at 13:01
    • Reply

    Ciao scusami io sto realizzando una serra dove ce una pompa da 220 collegata al relè e un rtc ma non so programmarla la pompa ha il seguente funzionamento che ad una determinata ora come ad esempio le 14:00 si attiva mandando acqua per 20 secondi e cosi nei giorni successivi puoi aiutarmi

    1. Ciao Damiano,
      puoi studiare il mio esempio di centralina di irrigazione e comprendere come funziona per modificarlo.

    • Alessio Andreetta on 9 gennaio 2017 at 02:45
    • Reply

    Salve,
    premetto che sono alle prime armi con Arduino e ho a disposizione il Duemlanove (ATmega328) e un Mega2560, sono alle prese con varie sperimentazioni con display a 16 colonne 2 righe e utilizzando il Duemilanove ho provato vari sketch riguardanti l’assemblaggio tra un RTC ds 1307 ed il display senza problemi.
    Alla prova di altri sketch l’IDE di Arduino mi da errore per la mancanza della libreria board.h, dopo varie ricerche non riesco a trovarla così come mi evidenzia l’errore l’IDE, ma riesco a trovare solo Border.h nella cartella Firmata (con la B maiuscola) cosa che mi ripete l’errore alla prova.
    Gentilmente se può darmi delucidazioni riguardanti questo mio problema o alle mie mancanze di conoscenza a riguardo delle librerie, le ne sarei molto grato.
    Distinti Saluti
    Alessio A.

    1. Ciao Alessio,
      in questo sketch ti da questo errore?
      Mi sembra strano perché non faccio uso di tale libreria, per cui potrebbe trattarsi solo di una cattiva installazione dell’IDE, scarica ed aggiorna la 1.8.0 e riprova.

    • Daniele L. on 22 febbraio 2017 at 07:42
    • Reply

    Salve,
    controllando la seriale in uscita ho sempre lo stesso valore:
    01/01/2000 00:00:00
    01/01/2000 00:00:00
    01/01/2000 00:00:00
    01/01/2000 00:00:00
    01/01/2000 00:00:00
    01/01/2000 00:00:00

    Quale potrebbe essere il problema?La batteria non carica??

    1. Ciao Daniele,
      hai provato a commentare la riga 13 e la 17 solo una volta per impostare l’orario e poi commentarle nuovamente negli esempi successivi ?

    • Maurizio on 20 dicembre 2017 at 09:33
    • Reply

    Ciao Mauro, volevo chiederti se esiste un modo per testare la batteria del DS1307 in modo da segnalarlo in caso sia scarica o sotto una soglia.
    Ho pensato di leggere il valore della batteria con un ingrasso analogico di arduino, ma questo consuma dell’energia della stessa; ho provato a guardare anche il data sheet del DS ma non ho trovato nessuna informazioen a riguardo.
    Grazie dell’aiuto.
    Maurizio

    1. Ciao Maurizio,
      penso che l’unica sia leggere il livello di carica con un pin analogico.
      Sul consumo non penso sia un problema in quanto:
      1. lo eseguirai al massimo una volta al giorno;
      2. è una misurazione istantanea

        • Maurizio on 8 gennaio 2018 at 08:54
        • Reply

        Grazie Mauro,
        mi confermi quindi che se non interrogata la porta analogica del micro è tre state e quindi non dovrebbe consumare nulla?!..

        1. Ciao Maurizio,
          c’è sempre un consumo minimo dovuto al micro controllore ed al circuito di alimentazione, puoi verificare con un tester.

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.