«

»

Gen 04

Stampa Articolo

RTC shield DS1307: impostare data e ora

In un articolo di alcuni mesi fa hai letto come impostare la data e l’ora son l’RTC shield ds1307 ed arduino dall’IDE di arduino e visualizzarla su un display LCD 16×2

rtc shield ds1307 imposta ora

In questi mesi alcuni appassionati mi hanno contattato per chiedermi consigli su come far evolvere quel progetto potendo, ad esempio, impostare l’ora con dei pulsanti.

Nei commenti dell’articolo Tutorial rtc shield con ds1307 stesso puoi leggere alcune delle richieste di aiuto.

Avevo promesso di mettermici nuovamente a lavoro ed ecco il risultato.

In questo articolo troverai i collegamenti e lo sketch per gestire l’RTC shield ds1307 con arduino per impostare l’ora senza dover ricaricare lo sketch ogni volta.

I collegamenti dei pulsanti all’rtc shield ds1307

Mi soffermo sui collegamenti dei soli pulsanti in quanto tutti gli altri collegamenti restano invariati rispetto al precedente articolo, vedi link sopra.

rtc shield ds1307 button setting date and time

Usi solo 3 pulsanti:

  • il primo, connesso ad A0, come SET ossia per tutte le operazioni di impostazione: entrare in modalità setting e avanzare tra i menu del settaggio;
  • il secondo, connesso ad A2, come MENO per decrementare i valori da impostare;
  • il terzo, connesso ad A1, come PIU per incrementare i valori da impostare;

ciascun pulsante ha il terminale connesso ad arduino collegato ad una resistenza da 330ohm verso massa ( GND ) e l’altro terminale del pulsante al positivo ( +5v ) di arduino.

Questo tipo di collegamento lo hai già visto in tanti altri tutorial su questo blog, e ti consente di essere certo che senza la pressione del pulsante il valore letto sull’ingresso analogico di arduino sia inferiore a 1000 ed alla pressione del pulsante il valore letto sia superiore a 1000 ( sarà 1023 )

Lo sketch per settare data e ora con l’rtc shield ds1307

Lo sketch necessario ad impostare la data e l’ora con i pulsanti ha una base comune a quello mostrato nell’articolo precedente sull’RTC shield ds1307 che non ti racconterò per soffermarmi sulle sole linee nuove:

/*
 * RTC & LCD
 *
 * Autore: Mauro Alfieri
 * Tw: @mauroalfieri
 *
 * Web: http://www.mauroalfieri.it
 */

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>

#define BACKLIGHT 2
#define CONTRAST  3

#define SET       A0
#define PIU       A1
#define MENO      A2

char buffer[10];
unsigned long time=0;
unsigned long timeSet=0;
int  setModeTime=2000;

RTC_DS1307 RTC;
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);

void setup () {
    pinMode( BACKLIGHT, OUTPUT );
    pinMode( CONTRAST, OUTPUT );
    digitalWrite( BACKLIGHT, HIGH );
    analogWrite( CONTRAST, 40 );

    Wire.begin();
    RTC.begin();
    lcd.begin(16, 2);

    if (! RTC.isrunning()) {
      Serial.println("RTC is NOT running!");
      RTC.adjust(DateTime(__DATE__, __TIME__));
    }

    pinMode( SET, INPUT );
    pinMode( PIU, INPUT );
    pinMode( MENO, INPUT );
}

void loop () {

    if ( analogRead( SET ) < 1000) { time = millis(); }

    DateTime now = RTC.now();
    lcd.clear();

    sprintf(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());
    lcd.setCursor(0,0);
    lcd.print( buffer );

    char buffer[10] = "";

    sprintf(buffer,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
    lcd.setCursor(0,1);
    lcd.print( buffer );

    if (time > 0 && setModeTime < (millis() - time) ) { setMode( now ); }

    delay(1000);
}

void setMode( DateTime now ) {
    boolean setMode = true;
    int setModeLevel = 0;

    int _day = now.day();
    int _month = now.month();
    int _year = now.year();
    int _hour = now.hour();
    int _min = now.minute();
    int _sec = now.second();

    lcd.clear();
    lcd.setCursor(0,0);
    sprintf(buffer,  "%s: %02d", "Giorno", _day);
    delay( 1000 );
    timeSet = millis();

    while ( setMode ) {
      if ( analogRead(SET) > 1000 || analogRead(PIU) > 1000 || analogRead(MENO) > 1000 ) { timeSet = millis(); }

      lcd.setCursor(0,0);

      // Set Day
      if ( setModeLevel == 0 ) {
        if ( analogRead(PIU) > 1000 && _day < 31) { _day++; }
        if ( analogRead(MENO) > 1000 && _day > 1) { _day--; }

        sprintf(buffer,  "%s: %02d", "Giorno", _day);
      }
      // Set Month
      if ( setModeLevel == 1 ) {
        if ( analogRead(PIU) > 1000 && _month < 12) { _month++; }
        if ( analogRead(MENO) > 1000 && _month > 1) { _month--; }

        sprintf(buffer,  "%s: %02d", "Mese", _month);
      }
      // Set Year
      if ( setModeLevel == 2 ) {
        if ( analogRead(PIU) > 1000 && _year < 9999) { _year++; }
        if ( analogRead(MENO) > 1000 && _year > 1900) { _year--; }

        sprintf(buffer,  "%s: %02d", "Anno", _year);
      }
      // Set Hour
      if ( setModeLevel == 3 ) {
        if ( analogRead(PIU) > 1000 && _hour < 24) { _hour++; }
        if ( analogRead(MENO) > 1000 && _hour > 1) { _hour--; }

        sprintf(buffer,  "%s: %02d", "Ora", _hour);
      }
      // Set Minute
      if ( setModeLevel == 4 ) {
        if ( analogRead(PIU) > 1000 && _min < 60) { _min++; }
        if ( analogRead(MENO) > 1000 && _min > 1) { _min--; }

        sprintf(buffer,  "%s: %02d", "Minuti", _min);
      }
      // Set Second
      if ( setModeLevel == 5 ) {
        if ( analogRead(PIU) > 1000 && _sec < 60) { _sec++; }
        if ( analogRead(MENO) > 1000 && _sec > 0) { _sec--; }

        sprintf(buffer,  "%s: %02d", "Secondi", _sec);
      }

      lcd.print( buffer );
      if ( analogRead(SET) > 1000 ) { lcd.clear(); setModeLevel++;  }
      if ( setModeLevel > 5 ) { setModeLevel=0; }

      if (timeSet > 0 && (setModeTime*2) < (millis() - timeSet) ) {
         RTC.adjust(DateTime(_year, _month, _day, _hour, _min, _sec));
         setMode = false;
      }
      delay(200);
    }
}

avrai subito individuato una nuova funzione: setMode, ma andiamo con ordine, alle linee 17-19: definisci i tre pulsanti e i relativi pin analogici a cui sono connessi;

linee 22-23: definisci due variabili di tipo unsigned long in cui memorizzerai dei tempi che in seguito ti serviranno;

linea 24: definisci la variabile setModeTime il cui valore indica il tempo di attesa per entrare o uscire dalla modalità di impostazione della data e dell’ora;

linee 44-46: definisci la modalità in cui utilizzerai i pin A0-A2 nello sketch;

linea 51: controlla che NON sia stato premuto ilpulsante SET se questo avviene imposta time uguale a millis() a cosa server? il valore di millis() si incrementa ad ogni ciclo di loop() dal momanto in cui lo sketch viene caricato o arduino viene resettato, in pratica stai comunicando di aggiornare il valore di time fino a che non venga premuto il pulsante SET;

linea 66: valuta se time sia maggiore di 0 e allo stesso tempo confronta il valore dell’operazione ( millis() – time ) con setModeTime in pratica siccome time si aggiorna ad ogni ciclo di loop a meno che non sia stato premuto il pulsante SET la differenza tra millis() e time restituisce sempre un valore prossimo allo 0 e quindi sempre maggiore di setModeTime; quando premi e mantieni premuto SET il valore di time non si aggiorna e la differenza cresce fino a superare il valore di confronto ( setModeTime ) in questo momento lo sketch comprende che vuoi impostare la data e l’ora e richiama la funzione setMode( now ) passandole l’oggetto di tipo DateTime chiamato now.

linea 72: imposta una variabile di tipo booleano che utilizzerai per rimanere in modalità di impostazione data e ora;

linea 73: imposta una variabile di tipo integer in cui memorizzerai a quale menu di impostazione sei arrivato;

linee 75-80: definisci delle variabili di tipo integer in ciascuna delle quali memorizzi il relativo valore attuale per giorno, mese, anno, ora, minuti e secondi;

linee 82-83: cancella ogni messaggio sul display e posiziona il cursore al punto 0,0 ( prima riga e prima colonna );

linea 84: definisci il contenuto della variabile buffer componendolo con il testo “Giorno:” e valore del giorno;

linee 85-86: attendi un secondo e imposta il valore del secondo temporizzatore timeSet identico a millis(), ti servirà per capire quanto tempo trascorre tra un’operazione e la successiva e poter uscire dalla modalità di impostazione data e ora;

linea 88: inizia un ciclo di tipo while fino a che il valore do setMode non passa da true a false;

linea 89: alla pressione di uno qualsiasi dei 3 pulsanti resetta il valore di setTime di fatto rimanendo nella modalità di impostazione, questo significa che se non premi alcun pulsante per un tempo definito, vedrai dopo come, esci dalla modalità di impostazione data ed ora;

linee 94-99: sei nel menu che imposta il giorno, il valore di setModeLevel è 0 e ad ogni pressione del pulsante PIU incrementi la variabile _day fino a 31, mentre alla pressione del pulsante MENO decrementi la medesima variabile fino a 1. La linea 98 prepara il buffer per scrivere sul display il valore impostato;

linee 101-134: esegui le stesse operazioni appena viste per ciascuno dei valori di cui è composta la data e l’ora;

linea 136: scrivi sul display il valore del buffer ad ogni ciclo di while;

linea 137: è qui che fai la magia di spostamento tra i menu, ad ogni pressione del pulsante SET incrementi il valore di setModeLevel dopo aver ripulito il display per prepararlo alla visualizzazione del menu successivo;

linea 138: controlla che il valore di setModeLevel non superi il 5, menu massimo, in tal caso lo reimposti a 0 per ricominciare dal primo menu;

linea 140: con questa condizione verifichi che il tempo trascorso dalla pressione di uno dei pulsanti sia superiore al doppio di quello impostato per entrare nella modalità di impostazione, infatti alla linea 89 hai visto che appena premi un pulsante il valore di timeSet si reimposta uguale a millis() e quindi la loro differenza non supererà mai il valore di setModeTime*2 se smetti di premere i pulsanti il valore di timeSet non si resetta e la differenza cresce fino a superare il valore di confronto, in questo caso lo sketch esegue le linee sottostanti;

linea 141: imposta i valori di data ed ora correnti e li salva sul rtc shield ds1307;

linea 142: assegna false a setMode indicando allo sketch che vuoi uscire dalla modalità di impostazione data e ora sull’rtc shield ds1307.

Per chiarirti il funzionamento ti ho preparato anche un video mentre testavo lo sketch:

Buon impostazione della data e dell’ora !!!

Permalink link a questo articolo: http://www.mauroalfieri.it/elettronica/rtc-shield-ds1307-impostare-data-e-ora.html

143 comments

1 ping

Vai al modulo dei commenti

  1. Giovanni

    Ciao Mauro e complimenti per i tuoi tutorial molto interessanti! Sto cercando di creare una sveglia regolabile con il metodo setMode. Ho creato due variabili globali hourAlarm e minAlarm inizializzate a 0. Ora mi chiedo come posso renderle visibili per un altro metodo che serve a visualizzare l’allarme impostato e quindi fare il confronto con l’orario corrente. Ti ringrazio per l’attenzione. Saluti

    1. Mauro Alfieri

      Ciao Giovanni,
      interessante progetto quello della sveglia,tuttavia creare due variabili è solo l’inizio.
      E’ necessario che tu imposti una nuova funzionalità di setAlarm e quindi un metodo per entrarci (es.: premo per 2 secondi il pulsante piu o meno ) e poi imposti le variabili.

      Il controllo puoi farlo direttamente nella loop(), è la parte più semplice.
      Infine dovrai ricordarti di salvare nella EEPROM queste impostazioni perché se si resetta Arduino o manca l’alimentazione l’RTC continua a funzionare ma le tue impostazioni vanno perse.

      Mauro

      1. Giovanni

        Grazie per la risposta. Quindi da quanto ho capito non posso regolare la sveglia direttamente con setMode mediante le nuove variabili hourAlarm e minAlarm?

        1. Mauro Alfieri

          Ciao Giovanni,
          tutto è possibile scrivendo righe di codice nuove, la strada che ti ho suggerito è quella a mio avviso più semplice in ottica di struttura e manutenzione di uno sketch.

          Mauro

      2. Francesco

        ciao Mauro,
        volevo chiederti una cosa:
        Provando il tuo codice direttamente sulla seriale e senza display LCD ho notato che non mi fa memorizzare data/ora.
        ovvero me la fa cambiare ma non memorizzare…forse perchè sto usando l’RTC senza batteria direttamente connesso all’arduino??

        Grazie
        con stima

        1. Mauro Alfieri

          Ciao Francesco,
          la memorizzazione dell’ora avviene direttamente nel DS1307, se non lo alimenti perde questa impostazione.

  2. Poledust

    Dude good job do you have a schematic I dont know what language you have this wrote in but I get most of it but would like it if I could see your schematic thanks!

    1. Mauro Alfieri

      Hi Poledust,
      you find schematic in this article: http://www.mauroalfieri.it/elettronica/rtc-arduino-come-orologio.html
      How to connect the pushbuttons can find many articles on blog.

      Mauro

    2. Mauro Alfieri

      Hi Poledust,
      you can find schema in this article: http://www.mauroalfieri.it/elettronica/rtc-arduino-come-orologio.html

      How to connect the pushbuttons can find many articles on blog.

      Mauro

  3. Cristiano

    Ciao mauro, ho provato a caricare il codice da te fornito, e mi segnala degli errori realtativi a delle parentesi.. a te compila correttamente?

    Saluti

    1. Mauro Alfieri

      Ciao Cristiano,
      si, a me compila, ma potrebbe succedere che nel copia e incolla o nel rendering html del codice qualcosa venga ignorato.
      Ho aperto un account Git Hub per pubblicare i sorgenti, per adesso ho solo lo sketch del datalogger pubblicato.

      Prova a verificare se puoi sistemare le parentesi che mencano seguendo il codice e la spiegazione sotto.

      Mauro

  4. Francesco

    Ciao Mauro,
    grazie mille per tutto quello che fai per noi Neo Arduinomani,
    avrei il seguente quesito da proporti:
    ho un aspiratore che vorrei controllare al fine di capire quando sortituire il filtro, (composto dalla parte in carboni attivi e una filtrante per le polveri), quindi, per Es. trascorse 500 ore che potrebbe essere la vita del corpo a carboni attivi si dovrebbe accendere un led, considerando che in tutto questo tempo l’aspiratore sarà acceso e spento una miriade di volte.
    per quanto riguarda il filtro polveri bisognerebbe creare un controllo amperometrico per il motoventilatore che è 150W alimentato 230V monofase. la mia idea è quella di settare il valore amperometrico dell’aspiratore otturando parzialmente il boccaglio dell’aspiratore, tale da simulare l’otturazione del filtro e nel suo fonzionamento normale al raggiungimento di quella soglia amperometrica si dovrebbe accendere il led.
    Grazie ancora per l’aiuto prezioso che dai a tutti noi.
    A preso
    Francesco

    1. Mauro Alfieri

      Ciao Francesco,
      ho letto la tua esigenza e trovo e Arduino non sia una soluzione ideale.
      La caratteristica di arduino é la prototipazione che fa egregiamente e ti permette di verificare se un’idea é realizzabile.
      A te occorre un sistema di monitoraggio e controllo nel tempo ed Arduino rischia di tradire le tue attese.

      Mauro

  5. claudio

    ciao,mauro
    ho caricato il tuo codice su un arduino 2009, ora e data si visualizzano correttamente, ma non mi funziona l’impostazione dei valori. se riduco il valore di controllo da 1000 a 600 sembra funzionare alune impostazioni.
    ho collegato il pin analogico come da tuo esempio.
    con il valore abbassato a 600 riesco a far funzionare il set pero’ passo nelle varie impostazioni e senza schiacciare piu , vedo i valori incrementarsi da soli fino al massimo valore. ho fatto diversi tentativi ma non trovo soluzione.grazie per l’aiuto

    1. Mauro Alfieri

      Ciao Claudio,
      prova con un semplice sketch a visualizzare nel monitor seriale il valore dei pin analogici a pulsante non premuto e premuto, per ciascun pulsante.
      Il problema mi sembra siano i valori e leggi, probabilmente dovuti alle resistenze o ai collegamenti che introducono resistenza superiore all’attesa.

      Mauro

      1. claudio

        ciao mauro ho provato a fare gia come dici tu uno sketch che visualizza il valore premuto, per questo ho segnalto che misura 600 quando premo. il mio collegamento è il terminale connesso ad arduino collegato ad una resistenza da 330ohm verso massa ( GND ) e l’altro terminale del pulsante al positivo ( +5v ) di arduino.
        misurando con tester vedo a pulsante premuto 5 volt e 0 a pulsante rilasciato.

        1. Mauro Alfieri

          Ciao Claudio,
          lo fa con tutti i pulsanti?
          prova a cambiare pin di Arduino su cui è collegato il pulsante.

          Mauro

          1. claudio

            grazie mauro , finamente ho risolto purtroppo non misuravo bene la tensione al pin di ingresso di arduino,dal pulsante uscivano correttamente 5 volt ma il mio circuitino di prova non funzionava bene arrivano solo 3 volt al pin. scusa se ti ho disturbato per niente ma sono alle prime armi con arduino e l’elettronica.

          2. Mauro Alfieri

            Ciao Claudio,
            sono contento che tu abbia trovato l’errore.
            Nessun disturbo quando si fanno delle prove e quando hai voglia di provare, sperimentare e superare anche le piccole difficoltà.

            É tutta esperienza e mentirei a dirti che spesso capitano anche a me sviste che mi fanno impazzire.

            Mauro

  6. armando

    ciao mauro

    ho realizato tramite il solo atmega328 in stand alone il famoso termometro , poi gli ho associato il lettore sd ( sempre autocostruio e l’ rtc1307 quest’ultimo non mi da ne la data nel’ora corrente ( tuti i circuiti funzionano ) provati con arduino mega adk ma lasciandoli soli con l’atmega328p-pu scrive sulla sd ma l ‘ora che restituisce e quella di defaul 165.12.55 ( mi pare) come posso risolver il problema dell’ora per completare il progetto.
    armando

    1. Mauro Alfieri

      Ciao Armando,
      arduino si comporta così quando non legge l’RTC.
      Fai attenzione che sulla Mega ADK i pin A4 e A5 non hanno la stessa funzione degli omologhi sulla Uno, se non ricordo male.

      Mauro

  7. Hans

    Hi Mauro!

    I tryed your nice sketch but I can not get it to work.
    It stopps at line 24 and says that : variable or field “setMode” declared void.

    I´m new at programming so I don´t know what to do here. Hope you
    can help me to get it running. It is a good practise for me.
    I have Arduino Uno R3 and a breadboard & LCD 2×16.

    The RTC is Pcf8563p and works fine with other smaller sketches.

    //Hans

    1. Mauro Alfieri

      Hello Hans,
         you have copied all the sketch?
      I tried to run it with IDE 1.0.5 and works without problems.

      Mauro

  8. Nicola

    Buongiorno Mauro , domanda banale pero’ non so come muovermi : se volessi scrivere la data senza ” / ” e l’anno con sole due cifre , come dovrei fare ? Grazie

    1. Mauro Alfieri

      Ciao Nicola,
      se leggi la descrizione dello sketch troverai le linee interessate e da modificare.

      Mauro

  9. Manuel

    Buongiorno Mauro,

    ho provato a cancellare nello sketch la parte che riguarda la data, (esperimento di comprensione) e credo di aver fatto un buon lavoro di modifica. il punto è che quando modifico i parametri dell’orario con i tasti, questi non vengono salvati, l’orologio non salva l’ora e parte dalle ore 00:00:00.
    (la scheda con il tuo sketch funziona correttamente)

    Grazie.
    Manuel

    1. Mauro Alfieri

      Ciao Manuel,
      probabilmente hai cancellato un po troppo.
      Prova a cancellare solo la parte di visualizzazione e non anche quella di gestione della data.

      Mauro

      1. manuel

        Ciao Mauro, ho fatto come hai detto e funziona tutto!!
        il prossimo passo è creare dei timer fissi per tenere accese delle luci per più ore consecutivamente,
        mi potresti consigliare!!
        perdona la mia ignoranza in materia, ma sono alle prime armi!!
        grazie mille,
        Manuel

        1. Mauro Alfieri

          Ciao Manuel,
          siccome sei alle prime armi ma hai tanta voglia di imparare e sperimentare ti consiglio la lettura delle mie lezioni online o di iscriverti ad un corso base in cui acquisire tutte le basi per i tuoi progetti.

          In ogni caso per il tuo progetto dovrai lavorare con il delay() o il comando millis() dipende da cosa deve accadere durante le pause.

          Mauro

  10. Viviano

    Buonasera Mauro
    Sono alle prime armi anche se non sono di primo pelo
    Vorrei realizzare un cronometro con impostazione di Ora;Minuti;Secondi, accendere in sequenza,ad un tempo prefissato, una fila di led(10) durata di un secondo ed infine che si possa sincronizzare via radio.
    ti ringrazio per ogni tuo gentile suggerimento
    V.Favetta

    1. Mauro Alfieri

      Ciao Viviano,
      il tuo progetto è interessante e ti invito a procedere per step semplici:
      1. realizza il cronometro: immagino che vorrai poter inserire un valore per hh:mm:ss e iniziare il conteggio alla rovescia
      2. al raggiungimento del valore 00:00:00 dovrai far accendere i led per un secondo, ti consiglio di utilizzare una funzione che gestisca i led
      3. procedi con la parte radio, anche se non hai scritto cosa intendi per radio: RF,WiFi,XBee e con che protocollo

      Mauro

      1. Viviano

        Ciao
        Mauro
        ho realizzato il cronometro con partenza Led ma non so propio come sincronizzare l’ora con il segnale
        DCF 77 proveniente dall’orologio atomico di Francoforte
        Viviano

        1. Mauro Alfieri

          Ciao Viviano,
          è la prima volta che leggo di un progetto simile, mi piacerebbe pubblicare quello che hai realizzato se ti va.

          1. Viviano

            Ciao Mauro
            come ti ho detto ho realizzato un cronometro dove posso impostare ora e livelli di intervento led.
            Ho utilizzato un arduino uno rev 3.
            Volevo caricare lo schetch con lo smartphone ma credo che devo usare arduino ADK mega che ha un ingresso usb host.
            Volendo farti vedere i collegamenti e il programma ma non so come fare
            Un saluto
            Viviano

          2. Mauro Alfieri

            Ciao Viviano, vorresti condividere il progetto sul. Blog come hanno fatto altri? Puoi inviarmi tutto il materiale ( foto,video,sketch,descrizione,ecc…) alla casella info del Blog

          3. Viviano

            Caro Mauro
            ti ho mandato qualcosa nella tua casella del blog non so se l’hai ricevuta
            saluti
            Viviano

          4. Mauro Alfieri

            Ciao Viviano,
            purtroppo non l’ho ricevuta.
            Ti ricordo che l’email è riservata:
            – ai progetti finiti che desideri condividere sul blog e puoi inviarmi foto,video,sketch e descrizione del progetto;
            – ai lavori su commessione a sostegno del blog

            Per tutte le esigenze differenti e le richieste di aiuto inerente ai progetti presentati puoi utilizzare i commenti del blog rispettando le indicazioni riportate in fondo ad ogni articolo.

  11. Felipe

    Ciao,
    Non ho capito una cosa (piu’ di una a dire il vero)
    – i pin A4 e A5 sono comunque usati per la comunicazione con l’RTC ho sono liberi?
    – per forza bisogna usare degli ingressi analogici A0 A1 A2 per leggere i pulsanti ?

    Grazie
    Ciao

    1. Mauro Alfieri

      Ciao Felipe,
      i pin A4 ed A5 sono usati esclusivamente dalla RTC in questo progetto, non puoi utilizzarli per raccogliere dati di tipo analogico.
      I pulsanti puoi collegarli anche agli ingressi digitali, dovrai modificare opportunamente lo sketch.

      Ti consiglio di leggere qualche articolo sull’uso dei pulsanti e su come collegarli ad Arduino.

      Mauro

  12. Natale

    Ciao! Volevo provare il codice su arduino nano ATmega 328,
    alla verifica dello sketch mi da errore sul comando <span class=
    Il codice non è compatibile con Arduino nano?
    Complimenti per le realizzazioni.

    1. Mauro Alfieri

      Ciao Natale,
      nel codice non c’è l’istruzione che ti da errore, probabilmente il copia e incolla che hai eseguito contiene dei caratteri sporchi o parti della pagina HTML del blog.

      Controlla é ripulisci il tuo codice per risolvere il problema.

      Mauro

      1. Natale

        Colpa di Chrome. Ho provato con Firefox e non ci sono errori 🙂

        1. Mauro Alfieri

          Perfetto Natale !!!

  13. Filippo

    Ciao molto bello il tuo progetto non è che mi potresti inviare lo schema elettrico di come hai collegato i pulsanti?

    1. Mauro Alfieri

      Ciao Filippo, trovi nel blog tanti articoli dedicati ai pulsanti, ci sono molti modi in cui puoi collegarli.

      Mauro

  14. Luiyi

    hola, lo primero magistral el tutorial y sketch.
    Me gustaria me dijera si se puede aplicar su trabajo a un programa para variar la hora de encendido y apagado, me explico mejor: por ejemplo: programo la calefacion para que encienda a las 15.OO y apague a las 20:00, pues quiero y me referia a modificar esas horas de encendido y apagado sin necesidad me poner el arduino al pc de nuevo, en pocas palabras un programa para poder modificar esos datos de encendido y apagado y que se queden registrados. Un saludo

    1. Mauro Alfieri

      Hola Luiyi,
      lo que quieres hacer es posible.
      Buscar artículos en el blog.

  15. Riccardo Matta

    Ciao Mauro. Sto portando avanti un mio progetto di domotica che fino all’anno scorso si basava su un micro della Microchip e ora ho convertito su Arduino. Il mio progetto si basa su un protocollo di comunicazione ModBus del quale esiste una lib per Arduino e su una scheda Arduino Ethernet. Attraverso un’app che ho scritto per Android faccio comunicare una Arduino uno con il mio SmartPhone. Ho anche collegato ad Arduino un RTC che funziona bene (uso per verificare il monitor seriale) e qui ho trovato un problema: il mio loop prevede di prelevare i dati del modbus inviati da android e aggiornare l’ora e la data del RTC diciamo in modo dinamico cioè mentre la routine gira, io con il monitor seriale vedo cosa succede l’ora e la data vengono effettivamente aggiornate ma il RTC si blocca e per farlo ricominciare devo dare un Reset con la conseguente perdita di alcuni secondi rispetto all’orologio dello SmartPhone.
    Non so se sono stato chiaro o molto contorto ma non riesco in definitiva ad aggiornare l’ora nel loop senza che il RTC si blocchi.
    Ti chiedo un aiuto e poi magari se riesco a finire il mio progetto lo potrei condividere con tutti voi se ti fa piacere.
    Grazie.

    1. Mauro Alfieri

      Ciao Riccardo,
      è un progetto davvero interessante e sono certo che in molti vorrebbero leggere come stai realizzando tutto questo.
      Il codice che hai scritto per adeguare l’ora è simile a quello proposto in questo articolo?
      Io lo utilizzo da molto tempo e con diverse schede RTC senza aver mai riscontrato problemi simili a quelli che mi scrivi.

      Prova il mio sketch per verificare se riscontri il medesimo problema, in tal caso potrebbe essere difettoso l’RTC.

  16. Enrico

    Ciao Mauro. prima di tutto complimenti per l’ottimo blog. Ottimo spunto per i principianti e otiimo anche per i piu esperti, sempre pieno di idee nuove e test.

    Premetto che sono alle prime armi. Ma da qualche parte tu hai scritto che il miglior modo per proseguire e quello di prendere il codice da varie parti e metterlo assieme per poter adattarlo alle tue esigenze.

    Ho iniziato da un annetto, e programmo già in visual basic, non è la stessa cosa, ma la logica aiuta molto.

    Sto realizzando un orologio con timer come questo, ma non per irrigare il giardino, bensi per accendere le luci led del mio acquario.
    Cosi comè è molto funzionale, a parte qualche problemino con il mio display che ha i pulsanti sopra.

    Quello che vorrei fare è cercare però di non fare un accensione istantanea come quelle che servirebbe per delle pompe di acqua, ma fare un accensione graduale. (da spento a tutto acceso in x tempo)

    Ho trovato in giro un codice che serve al caso mio e funziona molto bene con le strisce led.
    chiaramente visto il consumo dei led ho dovuto utilizzare un mosfet, cosi da poter alimentare la striscia led.

    Tutto funziona, se non che mi succede, e non capisco davvero il perchè, che all’orario prestabilito i led inizino ad accendersi, ma sul display succeda un casotto bestiale.
    Inizia a chiedermi l’inserimento della data, poi si azzera e altre cose cosi, questo pura continuando ad accendere in modo graduale la striscia.

    Cosa potrebbe essere ?

    1. Mauro Alfieri

      Ciao Enrico,
      così come lo descrivi è difficile definire cosa accada.
      La prima cosa che mi viene in mente è qualche errore nel codice, verifica se nella parte di accensione dei led ci sia qualche chiamata alle funzioni di impostazioni della data e dell’ora, puoi usare il monitor seriale per farti scrivere sul monitor seriale cosa sta accadendo.
      In alternativa verifica l’assorbimento, se eccessivo potrebbe causare delle anomalie.

      1. Enrico

        Dunque…
        L’oroglogio si ferma. ma questo è normale.
        In quanto il ciclo for che ho utilizzato seguito dal delay per attivare l’uscita impiega del tempo….
        Questa è la prima parte che non riesco a capire come risolvere.
        Non ho incollato codici, so che non è simpatico, per quello forse mi sono spiegato male.
        perdonami.

        Per quanto riguarda il ciclo for, è possibile creare una libreria esterna che lavori in parallelo per evitare che l’orologio si fermi ?
        Oppure esiste un altro sistema che mi sfugge ?

        Grazie Mille

        1. Mauro Alfieri

          Ciao Enrico,
          per i codici hai fatto bene a non metterli nei commenti, vengono rimossi in automatico.
          Il sistema per attendere il passaggio del tempo senza usare il delay si chiama millis() e usa una logica che devi scriverti, ma trovi un mio articolo sull’argomento.

          1. Enrico

            😀
            Vedi che mi sfuggiva qualcosa !!!

            Dunque… pensavo di crearmi una nuova funzioncina che viene richiamata quando scatta l’ora.
            In questo modo dovrebbe rimanere piu pulito il codice.
            quando il valore della luminosità raggiunge il massimo setto una variabile light a true
            in questo modo la funziona di accensione non viene piu richiamata fino a quando non scatta l’off

            Ora provo.
            grazie mille.

          2. Mauro Alfieri

            Ciao Enrico,
            rischi di perdere il controllo di quanto avviene fuori dalla funzione o di complicare eccessivamente la funzione per controllare tutto.
            Se dovessi scegliere ti direi di estrapolare la funzione di impostazione dell’ora e dell’allarme dal loop() e lasciare nel loop() il controllo delle luci.

          3. Enrico

            IEEEEEE

            Ci sono riuscito…
            Ho modificato un pochettino il tuo listato.

            e poi con l’istruzione Millis ho impostato un tempo di attesa.

            con l’istruzione analogWrite(StrsciaLed, XX) ho fatto l’accensione graduata
            dove XX è una variabile che aumenta di 1 ad ogni ciclo.
            quando il valore arriva a 255 non aumenta più.
            Stessa cosa per lo spegnimento.
            Funziona alla grande.

            GRAZIE

          4. Mauro Alfieri

            Ottimo Enrico !!!

  17. Andrea

    Ciao Mauro, sto seguendo un pò le tue lezioni visto che mi sto interessando di arduino per un mio progetto, volevo chiederti se con arduino e con RTC DS 3231 è possibile avere un dieci allarmi, in un giorno programmando questi allarmi sempre con i tre pulsanti e la durata di questi allarmi.
    Ti ringrazio anticipatamente per una tua risposta

    Andrea

    1. Mauro Alfieri

      Ciao Andrea,
      non ho mai provato un DS3231 ma se si tratta di un RTC penso sia possibile definire tutti gli allarmi che vuoi.

  18. stefano

    Ciao!!
    interessantissimo!!!!
    Una richiesta se puoi aiutarmi: ho il modulo rtc-shield-ds1307 e un sainsmart 3,2″ tft. Vorrei usarli insieme e quindi non utilizzare i tasti ma lo schermo lcd per impostare data e orario.
    mi puoi dare una mano??
    grazie mille

    1. Mauro Alfieri

      Ciao Stefano,
      io posso darti dei consigli su progetti e schede che ho utilizzato perché le conosco.
      Purtroppo non possiedo il display di cui mi scrivi.

  19. salvo

    Ciao Mauro, intanto complimenti per tutti i tuoi tutorial, ho fatto l orologio con il ds 1302 e adesso per inserire i tasti per regolare l orario volevo basarmi sul tuo sketch, ma non riesco completamente, considera che sono agli inizi e con poca esperienza, non è che mi aiuteresti? grazie qualunque sia la tua risp

    1. Mauro Alfieri

      Ciao Salvo,
      il miglior aiuto che posso darti è di leggere le mie lezioni del corso arduino gratuito on-line in modo da comprendere i concetti fondamentali e come iniziare a muovere i primi passi in sicurezza e comprensione su arduino.
      Successivamente scoprirai che questo sketch è molto semplice sia da usare sia da modificare.

  20. christian

    salve
    ho copiato il programma per provarlo sul mio arduiono ma quando lo compilo mi da sti erriri
    Arduino:1.6.0 (Windows 7), Scheda:”Arduino Uno”

    In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:29:0,
    from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Print.h:26,
    from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Stream.h:26,
    from C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire/Wire.h:26,
    from C:\Users\utente\Documents\Arduino\libraries\RTClib\RTClib.cpp:4:
    C:\Users\utente\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 };

    non capisco se voi avete dei filw wire e rtclib modificati oppure sbaglio io qualcosa

    1. Mauro Alfieri

      Ciao Christian,
      hai provato anche con una versione di ide precedente tipo la 1.0.5 ?
      Potrebbe non essere compatibile la libreria che hai usato con questa versione di IDE.

      1. christian

        Grazie per la risposta , sapresti indicarmi una libreria per gestire il ds1307 con l’ide 1.61 (l’ultima versione) o similari?

        1. Mauro Alfieri

          Ciao Christian,
          incuriosito ho provato l’IDE 1.6.1 con questo sketch e non ricevo alcun errore.
          Sei certo di aver installato la libreria in modo corretto ?

  21. Carlo

    Ciao Mauro

    Ancora complimenti per il sito e per i tutorial

    Sto mettendo a punto un sistema per la gestione di un pannello termico solare che comprende anche un display LCD ed un RTC, vorrei mantenere il display spento ed accenderlo solo quando si preme uno dei pulsanti per le impostazioni di data e ora, intervenendo sul pin A (+5V) del display LCD. Secondo te posso collegarlo direttamente ad uno dei pin di arduino e metterlo HIGH quando devo accendere il monitor, oppure è meglio utilizzare un fotoaccopiatore?

    Grazie Carlo

    1. Mauro Alfieri

      Ciao Carlo,
      la retro illuminazione dei display è solitamente fatta con dei led per cui ti consiglio di interporre una resistenza adeguata per non compromettere, sul lungo periodo, il funzionamento del display.
      Controlla cmq il tuo display se usi una retro illuminazione a led o di tipo differente.

      1. Carlo

        Ciao Mauro

        Si la retro illuminazione è a LED, ho usato la funzione lcd.noDisplay(); ma spegne le scritte e non la retroillimazione.
        A questo punto mi sa che provo con il fotoaccopiatore, ma da qualche parte ho letto che oltre a togliere l’alimentazione dei 5 v sul pin A, devo togliere anche l’alimentazione agli altri pin altrimenti si danneggia il display…Tu sai qualcosa a riguardo??

        Ho visto che nel setup c’è la riga digitalWrite( BACKLIGHT, HIGH );
        però anche intervenendo su questa non succede niente…

        Grazie
        Carlo

        1. Mauro Alfieri

          Ciao Carlo,
          è la prima volta che leggo la necessità di togliere alimentazione a tutti i pin del display per non danneggiarlo.
          La linea digitalWrite( BLACKLIGHT, HIGH ) mette a livello 1 ( 5v ) il pin impostato nella definizione di BLACKLIGHT dello sketch come avrai letto.
          Ciò è vero per display che hanno il pin di retro illuminazione connesso ad arduino ed al pin definito.

  22. michele

    Ottimi i tuoi tutorial, ma perchè non implementi anche gli schemi???

    1. Mauro Alfieri

      Ciao Michele,
      di quelli più complessi li implemento, di schemi semplici come questo pubblico solo le foto dei collegamenti.

  23. Andrea

    Ciao Mauro,
    Sto seguendo i tuoi tutorial e mi trovo davvero bene, sto imparando molte cose! Ma ho un dubbio che mi attanaglia e speravo in una tua spiegazione.
    Volevo chiedere, visto che anche in altri esercizi ho notato la stessa cosa, ma perché i pulsanti vanno collegati su pin analogici, non sarebbe più giusto collegarli su ingressi digitali? Dal momento che la logica di funzionamento di un pulsante è a logica binaria? Spero in un tuo chiarimento!

    1. Mauro Alfieri

      Ciao Andrea,
      hai ragione. Logicamente vanno connessi ai pin digitali in quanto sensori on/off, tuttavia il collegamento ai pin analogici ha i seguenti vantaggi:

      1. è più interessante sia dal punto di vista elettronico sia da un punto di vista di programmazione
      2. collegare un pulsante al pin digitale, e leggerne il valore, è relativamente semplice; la sfida è l’analogico
      3. spesso i pin digitali sono occupati nei progetti ed i pin analogici avanzano quindi è bene imparare che è possibile collegarli ad entrambi
      4. con alcune resistenze, collegate come leggerai nei miei tutorial, puoi collegare più pulsanti ad un unico pin analogico

      1. PietroJoe

        Ciao,
        ho appena avuto il tempo (esami permettendo) di ricontrollare tutto. Avevo semplicemente sbagliato dei collegamenti ._.

        Grazie 🙂

        1. Mauro Alfieri

          Bravissimo PietroJoe.

  24. Leonardo

    Ciao Mauro
    Premetto che sono al mio quinto giorno con Arduino e usando un RTC capita una cosa per me incomprensibile:
    Ho uno sketch che mi registra su SD data e ora presi dall’ RTC che ha gestisce anche l’SDcard con l’istruzione now.eccetera e temperatura e pressione da un sensore con l’istruzione
    rtc.begin(DateTime(F(__DATE__), F(__TIME__)));
    che se usata nello sketch di registrazione dati funziona perfettamente ma che ovviamente ad ogni reset mi riporta la data e l’ora al momento della compilazione.
    Per ovviare all’inconveniente ho creato un minisketch a parte che imposta l’RTC come detto sopra però quando carico lo sketch di registrazione la data mi passa al 6 febbraio 2106 e non si muove da li; dove sbaglio?
    Grazie per l’aiuto e per il tempo che dedichi qui.

    Leonardo

    1. Mauro Alfieri

      Ciao Leonardo,
      la linea 039 serve proprio ad evitare il reset dell’ora, trovi altri sketch sull’RTC in cui ho descritto bene questo metodo.

  25. PietroJoe

    Ciao,
    volevo farti una domanda: cosa succede se non utilizzo le resistenze da 330 kohm verso massa? Ho fatto un test: a pulsante premuto risulta un valore di 1013 e a pulsante non premuto di 901 circa.

    Grazie e complimenti per il sito 🙂

    1. Mauro Alfieri

      Ciao PietroJoe,
      si chiama resistenza di pull-up e pull-down e nel corso on-line arduino gratuito ho dedicato un articolo a descrivere gli effetti di questa resistenza.
      In merito ai valori che riporti mi risultano strani senza una resistenza.

  26. Antonio

    Ciao Mauro
    sto seguendo il tuo corso on line e devo dire che ho imparato tante cose ora però ho un piccolo problema :
    ho caricato e modificato lo “RTC sketch DS1307: impostare data e ora” ma non mi funziona le modifiche che ho apportato sono la gestione del display fatta in I2C e la modifica degli ingressi per la gestione dei pulsanti pochje lavorando in I”C gli ingress A0 ed A1 sono assegnati ad SDA e SCL pertanto ho spostato gli ingressi su A3 A4 A5 pero il tutto non funziona .Ora vorrei postare il listato ma non so dove postarlo pochè nella sezione contatti c’è la voce info ma è citato che i contatti sono riservati per altre cose. Ora ti chiedo gentilmente come fare per postatre lo sketch? Grazie per la risposta e complimenti per il corso Antonio

    1. Mauro Alfieri

      Ciao Antonio,
      hai letto bene e non è possibile postare lo sketch da nessuna parte in quanto non li correggo per mancanza di tempo e a spesso anche di conoscenze sufficienti.
      Mi risulta strano quello che scrivi: SDA ed SCL non sono A0 ed A1 ma A4 ed A5 e non puoi cambiarli.

      1. Antonio

        Mauro
        grazie per la risposta in reatà hai ragione mi sono sbagliato nello scrivereSAD e SCL ma trascurando questo sono andato oltre ed ho caricato lo”” RTC Arduino: usa arduino come orologio “” ora anche qui caricando il programma così come scritto non mi funziona ma ho scoperto(cosa che non riesco assolutamente a capire) che sostituendo al rigo 43 l’istruzione : sprintf(buffer, “%02d/%02d/%d”, now.day(), now.month(), now.year());
        con l’istruzione sprintf(buffer, “%02d/%d/%02d”, now.day(), now.month(),now.year()); il tutto funziona ossia sul display mi compaiono la data e l’ora . Come dicevo non riesco ha capire il tutto da quel poco che so ed ho appreso l’istruzione sprintf(buffer, “%02d/%02d/%d”, now.day(), now.month(), now.year()); devrebbe stampare il buffer ed esattamente le variabili poichè c’è il simbolo %d ma non capisco cosa significa quello 02.
        Grazie ancora per la risposta e l’attenzione nei miei confronti

        1. Mauro Alfieri

          Ciao Antonio,
          se leggi in un qualsiasi manuale C il funzionamento della sprintf() scoprirai che %02d fa in modo che i numeri interi siano sempre di 2 numeri, es.: 1,2,3 diventano 01,02,03 …
          E’ comodo per fissare la dimensione della stringa e conoscere sempre il numero di caratteri che stamperai sul display

  27. Antonio

    Mauro buonasera
    volevo dirti che: fermo restando la domanda fatta nel messaggio precedente per l’istruzione :
    sprintf(buffer, “%02d/%02d/%d”, now.day(), now.month(), now.year()); il significato degli 02 nelle variabili;
    ora il tuttofunziona ma ho dovuto modificare la grandezza dell’array buffer e portarlo da 10 a 20 elementi. Ora gentilmente ti chiedo se puoi darmi spiegazione in merito ti faccio presente che sto lavorando con display in I2C.
    grazie ancora per l’attenzione

    1. Mauro Alfieri

      Ciao Antonio,
      come risposto nella richiesta precedente con la stringa %02d/%02d/%d ottieni una data scritta come 15/01/2016 = 10 caratteri = 10 caratteri di buffer, se modifichi la stringa anche solo di un carattere devi modificare il buffer della stringa.

      1. Antonio

        Mauro
        è tutto chiaro grazie per le spiegazioni, Antonio

  28. Dario

    Salve
    sono anche io uno sperimentatore alle prime armi:
    ho realizzato questo progetto molto ben illustrato da lei.

    ho solo un problema: la libreria che lo faceva funzionare
    è stata spostata dal suo sito originale a questo:

    https://learn.adafruit.com/ds1307-real-time-clock-breakout-board-kit

    l’ho istallata è tutto sembra funzionare bene fino al momento di
    premere il pulsate SET; il display a quel punto si spegne e i caratteri scompaiono.
    ripremendo più volte il pulsante set compaiono le singole scritte ORA, DATA; ecc
    e con gli altri pulsanti si possono cambiare i valori.

    anche trascorso il tempo impostato nella riga 140 l’ora non compare
    più sul display e l’unico sistema è quello di resettare l’arduino.

    cosa potrebbe essere? premetto che non ho eseguito
    modifiche né allo schema né al programma…

    potrebbe essere la libreria diversa?

    grazie
    e buona serata

    Dario

    1. Mauro Alfieri

      Ciao Dario,
      verifica che i valori restituiti dall’analogRead sui 3 pulsanti siano quelli attesi dallo sketch.
      La pressione dei pulsanti, se non sono pulsanti di buone qualità, potrebbe restituire valori non sempre identici.

      1. Dario

        Ciao
        ho verificato tramite il monitor seriale e effettivamente i valori dei tre anlogRead non erano proprio ok
        ritoccando i valori dello sketch è andato tutto a posto… grazie 1000!!!

        ancora una domanda se non ti disturbo troppo:

        mi piacerebbe aggiungere questa funzione:
        http://www.mauroalfieri.it/elettronica/arduino-led-pulsante.html
        in modo da poter comandare il led di retroilluminazione del display
        con un pulsante… come potrei fare per implementarla nello sketc principale?

        da come ho capito lo sketch continua a girare nella funzione loop fino a quando
        non si preme il pulsante set; a quel punto si richiama la funzione setMode per il
        cambio dell’ora tramite la riga 66… giusto? quindi dovrei usare lo stesso metodo per chiamare la nuova funzione?

        grazie
        buona giornata

        Dario

        1. Mauro Alfieri

          Ciao Dario,
          se dovessi farlo io in modo semplice aggiungerei come prima linea del loop() un controllo sulla pressione di un pulsante che accenda la retro illuminazione e la spenga al rilascio dello stesso.

  29. Michele

    Ciao Mauro,
    intanto mi congratulo con te per i tuoi articoli che sono chiarissimi e di notevole aiuto a chi si approccia con Arduino.
    Ho l’IDE 1.6.5 e riscontro questo errore: variable or field “setMode” declared void.
    Come posso risolverlo mantenendo questo IDE?

    Grazie
    Michele

    1. Mauro Alfieri

      Ciao Michele,
      è possibile che dalla ver 1.6.5 in poi non gli piaccia che una funzione ed una variabile abbiano lo stesso nome.
      Modifica il nome della funzione, cambiandolo ovunque sia richiamato.

      1. Michele

        Adesso funziona!
        Grazie!!

        1. Mauro Alfieri

          Bene Michele.

          Bravo !!!

  30. luigi

    Ciao Mauro ho usato il tuo codice con qulche modifica per adattarlo su un lcd di un nokia 3310 e aggiungendo una parte di codice che serve a settare anche il giorno della settimana. Tutto funziona alla perfezione.

    Ma secondo te è possibile fare una modifica che sia in gradi di passare automaticamente da ora solare a ora legale e viceversa?

    é da poco che studio il c e c# e trovo molte difficoltà. più che altro il mio problema fondamentale è capire come far capire al programma quando arriva la data esempio il 27 marzo alle ora 2 di notte sposta now.hour alle 3

    pensavo ad un ciclo for che ogni giorno alle 2 di notte effettuasse un controllo della data del’ RTC se questa corrisponde al 27/03 allora imposta ora -1 se la data non corrispode end e prosegue con il void.

    secondo te è fattibile?

    1. Mauro Alfieri

      Ciao Luigi,
      ho scritto una funzione basata sull’algoritmo di regolazione dell’ora legale per il progetto dell’orto idroponico, prova a leggere quell’articolo e leggere il codice su github.
      Il tuo ragionamento è statico ma corretto in linea generale.

  31. Ludovico

    Ciao Mauro. Per prima cosa devo farti i complimenti e soprattutto devo ringraziarti per questo splendido blog. Grazie a te ed ai tuoi interessantissimi tutorial sto imparando tante cose sia di elettronica che di Arduino, argomenti nei quali sono davvero a digiuno. Spero che tu possa trovare in futuro il tempo per pubblicare ancora qualche tuo eccezionale tutorial. Il motivo per cui ti scrivo è questo. Ho realizzato un Real Time Clock utilizzando non una shield preconfezionata, ma i singoli elementi, ovvero un DS1307 ed un quarzo da 32.768 cicli. Ho anche inserito una CR2025 come batteria tampone. Tutto funziona alla perfezione, se non fosse per un enorme problema: l’orologio “ruba” secondi a man bassa. Per farti un esempio in circa 25 minuti di funzionamento ha già rubato più di 6 minuti!!! Quindi se ora fossero le 17.30 l’orologio segnerebbe le 17.36 (va avanti). Naturalmente un divario di questa entità non è accettabile. Tu sai a cosa è dovuto questo malfunzionamento, e soprattutto hai idea di come si possa risolvere? Nello sketch ho utilizzato le librerie TimeLib.h e DS1307RTC.h caricate tramite il gestore delle librerie. La board che uso non è originale ma funziona bene. Inoltre, uso l’ide 1.6.9. Spero proprio che tu riesca ad aiutarmi . Grazie in anticipo. Ludovico

    1. Mauro Alfieri

      Ciao Ludovico,
      l’imprecisione del DS1307 è spesso causata dal quarzo che risulta essere impreciso.
      La parte critica di molti RTC è proprio il quarzo che deve essere di ottima qualità e accordato in modo da rispettare la frequenza di oscillazione dichiarati.

      1. Ludovico

        Grazie Mauro per la risposta. Io ho provato due quarzi diversi e con entrambi ottengo lo stesso risultato. Comunque sembra quasi che il problema si presenti solo quando il tutto viene alimentato tramite i 5 volts della porta usb. Infatti ho provato a lasciare per tutta la notte il modulo alimentato dalla sola batteria CR2025 e oggi appena collegato l’orario era preciso. Ora che è attaccato alla porta USB invece sta rubando minuti a man bassa. Ho provato anche collegando due resistenze da 10 KOhm (pull on) alle porte SDA e SCL. Ma il risultato non cambia. Secondo te sarebbe il caso di utilizzare qualche condensatore in serie alla porta 8 del DS1037. Se sì di che tipo e valore dovrebbe essere? Grazie ancora.

        1. Mauro Alfieri

          Ciao Ludovico,
          da come lo descrivi sembra un problema di alimentazione, hai seguito almeno lo schema base consigliato dal produttore del DS1307?
          In alternativa puoi verificare da qualche produttore di RTC il circuito e la componentistica che utilizzano e confrontare se hai dimenticato qualche componente.
          I quarzi sono di ottima fattura? li hai acquistati da un rivenditore di materiale elettronico qualificato o provengono da recupero di materiale? un quarzo non dovrebbe cambiare il suo modo di lavoro se cambia l’alimentazione.

          1. Ludovico

            Ciao Mauro, davvero grazie per le tue rapide risposte, sopratutto considerato il periodo festivo. Per quanto riguarda i quarzi, li ho comprati online insieme al DS1307 da un grosso negozio su Ebay (EBM store) che è fornitissimo, e dal quale ho sempre ricevuto materiale di ottima qualità. Ho seguito le indicazioni fornite nel Datasheet del DS1307 (oltre che da molti siti on line). L’unica cosa che NON ho fatto è stato inserire una resistenza di pull up alla porta SQW/OUT (la numero 7), in quanto non la utilizzo (infatti nel datasheet è scritto che può essere lasciata libera). Purtroppo non ho un oscilloscopio per testare i quarzi, ma, ripeto, l’errore non si verifica quando l’alimentazione è attraverso la batteria, per cui “a naso” ho escluso un malfunzionamento dei cristalli. Tra l’altro in circa 65 minuti di funzionamento l’orologio è avanti già di oltre 40 minuti e ritengo (nella mia ignoranza) che anche se il quarzo fosse impreciso non produrrebbe un errore così eclatante. In un altro tuo post (quello dove descrivi una shield DS1307 da te acquistata e da assemblare) ho visto che tra i vari componenti ci sono 3 resistori e due condensatori (uno ceramico e uno elettrolilitico). Dalle foto non vedo come vanno assemblati e neanche i valori dei resistori e dei condensatori. Se, quando ti sarà comodo e se ne avrai voglia, vorrai controllare su questa shield lo schema ed i valori di questi componenti ti sarò immensamente grato se volessi fornirmi quete informazioni. In tutti i casi ti ringrazio mille volte per la tua enorme pazienza e disponibilità. Infine ti saluto augurandoti una felice prosecuzione di questo periodo festivo e ti rinnovo l’invito a trovere il tempo di pubblicare ancora qualche tutorial. I tuoi articoli sono davvero preziosissimi per chi come me è ignorante in materia e vuole imparare qualcosa. A presto 🙂

          2. Mauro Alfieri

            Ciao Ludovico,
            per lo schema ti consiglio di leggere nell’articolo in cui uso la RTC shield di quale produttore sia e cercare sul loro sito il datasheet.
            Io dubito, anche sapendo a quale articolo ti riferisci, di riuscire a reperire le info che ti servono.

  32. mattia

    ciao Mauro davvero complimentoni ! ottima guida funziona alla grande! volevo chiedere come potrei aggiungere il giorno della settimana sul display? grazie mille in anticipo!
    Mattia

    1. Mauro Alfieri

      Ciao Mattia,
      ricordo che la libreria RTC non estrae questa informazione, anche se presente sul DS1307.
      Tempo fa avevo visto qualche appassionato che su github pubblicò una versione della libreria modificata per estrarre anche questa informazione.
      Purtroppo non ho con me il link di tele libreria, dovresti cercarla nel portale github.

  33. Lorenzo

    ciao mauro.
    sto cercando di realizzare l’impianto per l’ accensione delle luci giornaliere del mio acquario.
    lo sketch che hai postato mi è molto utile per la realizzazione del sistema di impostazione dell’ ora delle lampade al neon, se non fosse che per un piccolo problema. sul display non riesco a visualizzare nulla. ti anticipo che sto utilizzando un display con montato un modulo I2C, al quale però, ho già effettuato le saldature delle piazzole, in maniera tale da cambiare l’indirizzo di comunicazione, per non creare conflitti tra l’ RTC e il display.
    l’RTC è gia impostato con data e ora esatte, grazie alla tua precedente guida sono riuscito a farlo… è l prima volta che scrivo, e spero tu mi possa aiutare.
    grazie in anticipo.
    Lorenzo.

    1. Mauro Alfieri

      Ciao Lorenzo,
      verifica che il solo display da solo funzioni con la libreria che stai usando e con i collegamenti che hai fatto, lascia da parte l’RTC in un primo momento e prova il semplice hello world, se tutto funziona collega l’LCD e prova a comprendere se il problema è causato da qualche conflitto o altro.

      1. Lorenzo

        ciao mauro e grazie per l ‘interessamento.
        il display, da solo, sempre col modulo i2c saldato funziona, l’ ho testato con lo sketch di esempio “hello world” come mi hai suggerito… non so veramente più cosa possa essere, caricando lo sketch non segnala errori ne conflitti tra le librerie.
        al tuo sketch ho solamente apportato la modifica per la comunicazione i2c del display, non so, ti posso allegare quest’ ultimo con la modifica apportata?
        saluti.
        Lorenzo

        1. Mauro Alfieri

          Ciao Lorenzo,
          prova a riportare le funzionalità e le istruzioni del mio sketch RTC su quello del display che funziona e un pezzetto alla volta verifica quale sia il conflitto.

  34. Maurizio

    Ciao Mauro,
    sto cercando di provare il tuo sketch su arduino mega, e con un LCD 20*4 in I2c.
    Ho modificato un po di cose per far andare il display, ma quando arriva alla riga 57 si blocca, si spegne e si resetta ripartendo da capo.
    Non so perchè, ma fa sempre così…
    Cosa sbaglio??
    Grazie del tuo aiuto

    1. Mauro Alfieri

      Ciao Maurizio,
      cosa prova a verificare che tu non abbia saturato la memoria eccedendo con le variabili globali.

  35. luigi

    Ciao Mauro sto provando a modificare il codice per implementare una ricevente ir ed usare un telecomando per settare i parametri orari…
    ho molte difficoltà perchè non trovo in rete nessuna spiegazione sulla creazione di un menù case su come implementare le funzioni ecc..
    tu riesci a darmi qualche dritta?

    1. Mauro Alfieri

      Ciao Luigi, hai già letto i miei articoli sul controllo mediante IR?
      Ti consiglio anche la lettura di qualche articolo sul dolly in cui descrivo come realizzare un menu.

  36. Mimmo

    Buona sera Mauro, complimento per tutti gli esempi che hai pubblicato e che, per chi come me che è alle prime armi (ho 57 anni) con questo fantastico mondo, sono una manna dal cielo ma,….vengo al dunque: sto cercando di adattare il tuo sketch “rtc-shield-ds1307-impostare-data-e-ora” usando una tastiera …resistiva tipo [[ link rimosso in automatico ]]
    Bene non riesco a modificare quella parte di sketch che mi permette di cambiare/impostare la data/ora, in poche parole della riga 94 alla 132 del tuo sketch pubblicato; in soldoni come farli capire che se premo il pulsante PIU’ mi deve incrementare una cosa mentre se premo il puldante MENO mi deve decrementare una cosa. Puoi aiutarmi? Grazie

    1. Mauro Alfieri

      Ciao Mimmo,
      il link a portali generalisti e di vendita on-line sono rimossi in automatico per regola del blog.
      In merito alla tua richiesta, non conoscendo il componente che possiedi, ti invito a chiedere al produttore la documentazione per conoscere quali siano i segnali che ti arrivano alla pressione di ogni pulsante.
      Puoi usare uno sketch, se te lo ha fornito il venditore, per verificare i valori dei singoli pulsanti e sostituirli nelle righe che hai individuato.

  37. Mimmo

    Ciao Mauro, grazie della cortese e pronta risposta ma, dopo che ti ho inviato l’email di aiuto sono incappato in un tuo progetto “Centralina di irrigazione con Arduino” ed ho risolto il mio problema.
    In poche parole ho usato una Array con all’interno i valori min e max che vengono letti sul pin A0, a cui mi faccio restituire “return” un valore definito che associo ad ogni tasto, identificandolo.
    Grazie ancora di tutti i tuoi progetti che sono veramente una manna.

    1. Mauro Alfieri

      Ottimo Mimmo, sono contento

  38. vito

    Ciao Mauro, grazie mille per quello che fai per noi alle prime armi.
    Anche se tutto è spiegato in modo perfetto non sono riuscito a risolvere un problema e mi serve il tuo aiuto.
    Ho realizzato il tuo orologio che funziona alla grande ma mi è venuto in mente di aggiungere la lettura di una sensore DHT11per la temperatura e l’umidità, con lo sketchdi sotto elencato funziona solo che i dati scritti di temperatura e umidità (U% valore e Temp: valore) lampeggiano con una cadenza di un secondo.
    Sto impazzendo, perfavore mi potresti aiutare?
    Grazie ancora e saluti
    vito
    [[ codice rimosso in automatico ]]

    1. Mauro Alfieri

      Ciao Vito,
      il primo invito è il rispetto delle regole, che trovi in fondo ad ogni pagina del blog. Sopratutto se si tratta di codice mio e già pubblicato sul blog ti è sufficiente far solo riferimento a ciò che non ti è chiaro.
      Da come mi scrivi mi sembra che il funzionamento dei miei sketch non ti sia chiaro, ti invito a leggerli e comprendere le logiche di funzionamento per poterli modificare agevolmente.
      Il refresh del display avviene con frequenza 1 secondo ed ecco svelato il lampeggio che ottieni. Se vuoi eliminarlo devi modificare la modalità di refresh del display eliminendo il metodo clear() e sostituendo la sovrascrittura dei dati orari con posizionamento e sostituzione dei caratteri .. tutto decritto in vari articoli del blog.

  39. vito

    Ciao Mauro, per prima voglio chederti scusa per l’accaduto, mi era sfuggito, scusami ancora e credmi anche per me è fondamentale l’osservanze delle regole (è andata così, dal momento che l’ho riscritto e modificandolo più volte credevo di essermi incasinato). Grazie ancora del consiglio e mi metto subito a lavoro rileggendomi i tuoi fantastici articoli.
    Grazie mille e buona giornata

    1. Mauro Alfieri

      Nessun problema Vito.
      Sono certo che riuscirai nel tuo obiettivo, qualora ti servisse puoi usare sempre i commenti per chiedere chiarimenti.

      1. vito

        E vaiii, ci sono riuscito! Ovviamente grazie ai tuoi tuoi insegnamenti e al tuo indizio! Io sono un perito elettronico diplomato nel 1988 e quindi una versione 1.0 o meno, tanta esperienza in camp audio o RF e satellite ma zero nel campo software o programmare arduino, tutto arabo per me, ma la voglia di scoprire e comprendere è sempre viva in me. Pensa che per far lampeggiare un led lo facevamo con due transistor (o addirittura valvole) in conf. flip\flop e variando le resistenze o le capacità si variava il tempo di lampeggio, tutto preistorico. E’ stato fantastico scoprire le grandi otenzialità di arduino e sei suoi programmi. GRAZIE 1000 ancora e continuo a leggere i tuoi articoli.

        1. Mauro Alfieri

          Ottimo Vito !!!

  40. luigi

    Ciao Mauro,dopo un po di tentativi e tante parolacce sono riuscito a modificare il tuo codice implementando la libreria ir e quindi la possibilità di settare l’ora e la data tramite un telecomando.non potendo postare lo sketch mi risulta difficile però mostrare a tutti le modifiche nel caso in cui vogliano replicarlo.
    Tutto questo lavoro però è risultato vano,perchè il mio scopo era quello di poter incrementare i valori delle variabili data ora in tempo reale senza passare da un menu setting.
    la variabile buleana che gestisce l’ingresso e l’uscita dal menu impostazioni blocca la lettura dell’ora esatta da parte del monitor seriale.sencondo te esiste un modo per far si che ad ogni variazione di data e ora il ds si aggiorni subito mostrandomi l’orario modificato?questo mi è utile per sistemare un progetto di vecchia data il quale usa un ds1703 per visualizzare l’orario su un propeller clock..esso va a leggere l’ora da seriale e la traduce in accensione e spegnimenti dei led fino a formare un vero e proprio orologio analogico.essendo la lettura fatta da seriale quando entro in modalità setting grazie al codice che ho scritto,l’orario e la data si bloccano e non ho la possibilità di visualizzare l’incremento in tempo reale fin quando il ds non passa nuovamente in modalità lettura.

    1. Mauro Alfieri

      Ciao Luigi,
      hai provato a subordinare il cambio dei valori di orario al confronto con il precedente valore ?
      Se ho capito bene vorresti ottenere:
      ora impostata: 10:20
      premo pulsante min+ sul telecomando: 10:21..10:22..ecc

      Giusto?

      1. luigi

        quello che vorrei ottenere è impiegare 2 tasti + e – per i minuti,due tasti+ e- per le ore e così via.
        ad ogni pressione tasto il ds si aggiorna,in questa maniera sul seriale si vede immediatamente l’incremento o il decremento del valore.

        dimenticavo la mia esperienza con i codici di arduino è molto scarsa,faccio tante prove di compilazione e guardo tanti esempi,poi faccio un calderone di tutte e provo fin quando non ottengo un risultato…certo che questo metodo mi da una mano a studiare ma è un approccio molto empirico

        1. Mauro Alfieri

          Ciao Luigi,
          il tuo metodo lo definirei un “non metodo” una calderone non è un metodo è solo confusione, quando ottieni un risultato, come scrivi tu stesso:

          “faccio un calderone di tutte e provo fin quando non ottengo un risultato”

          come fai a determinare che cosa hai ottenuto ?
          Ti suggerisco un metodo più scientifico e didatticamente valido che applico nei miei corsi e nel blog: leggi uno sketch, inizia con quelli semplici, comprendilo bene linea per linea, prova qualche modifica semplice e comprendi “se funziona” -> “perché funziona” e “se non funziona” -> “perché non funziona”.
          All’inizio sembra una cosa inutile e lenta ma credimi che quando avrai chiaro il metodo leggerai e comprenderai sketch altrui senza difficoltà e impiegherai pochi minuti a scrivere i tuoi.

  41. antonio

    Una buona giornata a Mauro e a tutti quelli che seguono questo sito,
    girando in rete ho trovato questo bellissimo articolo interessante, o realizzato l’orologio il tutto funziona correttamente, non avevo dubbi, l’ho poi realizzato con un display grafico, anche qui tutto ok, ora mi piacerebbe mandare a display il giorno delle settimana ma non riesco a trovare la funzione che mi da il giorno,
    ovviamente non sono un espertissimo, per questo chiedo un aiuto a te Mauro,
    se per cortesia mi puoi dare qualche dritta su come fare
    ti ringrazio fin dora per quello che puoi fare e per tutto il materiale che c’è in rete,
    Toni

    1. Mauro Alfieri

      Ciao Antonio,
      ricordo che un appassionato avesse commentato uno degli articoli dedicati al DS1307 indicando quale metodo della libreria richiamare per ottenere l’informazione che desideri.
      Ti invito a cercare nel blog, non ricordo esattamente dove per cui non so darti un riferimento o link.

      1. antonio

        Ciao Mauro
        grazie di avermi risposto,
        scusa la mia ignoranza in materia, il blog e quello dove siamo ora?
        perché se e cosi si o letto che Luigi il 8 giugno 2016 dice di aver fatto la modifica per il giorno,
        ma non spiega come,
        essendo un principiante mi serve un aiuto per capire e proseguire,
        se mi puoi dare qualche indicazione te ne sarei molto grato
        cordiali saluti

        1. Mauro Alfieri

          Ciao Antonio,
          si è questo il blog. Ricordo che qualcuno ha anche descritto bene come ha eseguito la modifica.

          1. antonio

            Ciao Mauro
            OK allora mi sono letto tutti i messaggi e l’unico che fa riferimento al giorno della settimana e Luigi ma non spiega come a fatto,
            però mi sono data da fare cercando informazioni in rete, ma o solo trovato la conferma che la libreria gestisce il giorno della settimana, allora mi sono avventurato nei due file della libreria dove o trovato il riferimento,
            dayOfTheWeek(); (non so se posso postare il codice)
            int day_G
            ma con switch(day_G){
            mi visualizza il giorno, “anche se non è coretto”
            ora vorrei con i soliti pulsanti andare a settare il giorno giusto,
            o provato con un if, ma non funziona,
            non so come fare ad cambiare il giorno sul RTC
            per cortesia mi puoi dare qualche indicazione?
            mille grazie

          2. Mauro Alfieri

            Ciao Antonio,
            in merito al “anche se non è corretto” cosa intendi? la libreria dovrebbe restituire il valore restituito dal chip e questo lo calcola in base alla data che tu gli hai dato via Firmware.
            Per impostare il giorno io uso RTC.adjust, puoi verificare che tale metodo accetti anche il giorno della settimana ma non ricordo questa opzione in quanto è calcolato.

  42. antonio

    Ciao Mauro
    scusami se ti rispondo in ritardo,
    “anche se non è coretto” mi riferivo al giorno,
    ma o risolto, l’ RTC restituisce una sequenza di numeri partendo da 0 a 6, io ero partito da 1, ecco il mio errore,
    poi o pensato che non serve avere la possibilità di cambiare il giorno, perché sono sempre ripetitivi, se mai sarà da cambiare la data forse quando verrà l’anno bisestile
    perciò l’orologio ora funziona correntemente,
    ancora mille grazie per tutto

    1. Mauro Alfieri

      Ciao Antonio,
      il firmware dell’RTC dovrebbe già essere in grado di considerare sia l’anno bisestile sia il cambio ora legale/solare in autonomia.

      1. antonio

        Ciao Mauro
        scusami ma per impegni famigliari non o potuto rispondere prima
        l’ orologio funziona perfettamente, e visto che la libreria gestisce il cambio del ora solare e l’anno bisestile allora è proprio un gioiello questa libreria
        ancora mille grazie per tutto

  43. Rino

    Ciao, Mauro
    vedo che non sono l’unico ad essere un principiante di questo fantastico mondo di Arduino, per cui se non ti scoccia ne approfitto anch’io dei tuoi preziosi consigli che seguo già da qualche tempo e mi sono serviti parecchio e per questo ti ringrazio.
    non sono giovanissimo per tanto premetto che sono duro di “comprendonio”, ma quando riesco a capire riesco a seguire, immagina il mio orgoglio.
    veniamo al dunque, ho preso a occhi chiusi un encoder rotativo, ma non ho neanche la più pallida idea di come utilizzarlo, pensi si possa utilizzare al posto dei pulsanti per settare data e ora del tuo progetto?
    se si, c’è qualche tuo tutorial che ne descriva lo sketch?
    ti ringrazio in anticipo e ti auguro una buona giornata.

    Rino

    1. Mauro Alfieri

      Ciao Rino, siamo tutti princianti in un panorama così vasto come Arduino ed in generale la programmazione dei micro controllori.
      Si ho scritto almeno un paio di articoli sugli encoder ed Arduino ma nessuno applicato ad un RTC, per adesso, potrebbe essere interessante come articolo futuro, sicuramente è possibile usare un encoder per impostare l’orario e sostituire i pulsanti. Ti invito a provarci da solo seguendo i miei articoli e se riesci prima di me lo posso pubblicare a tuo nome se ti va.

  44. Sante Pirci

    Buongiorno,
    Premetto che non ho molta esperienza con Arduino…..
    Ho implementato il software del Clock e funziona egregiamente. Volevo aggiungere una funzione, ossia ad una certa data, ora, minuti, attivare un’uscita (in questo caso l’uscita 8 Hight) ho aggiunto questa routine:

    if (now.year()==2018);
    if (now.month()==04);
    if (now.day()==11);
    if (now.hour()==10);
    if (now.minute()==05);
    if (now.second()==59);
    digitalWrite (8, HIGH);
    Ma pur compilando il programma correttamente, non viene attivata questa uscita. dove sbaglio?

    Grazie, Saluti
    S.Pirci

    1. Mauro Alfieri

      Ciao Sante,
      ciò che hai scritto è corretto da un punto di vista sintattico, per cui l’IDE non da errori, tuttavia non significa nulla dal punto di vista della programmazione.
      Prova a leggere qualche esempio di centralina con arduino come, ad esempio, quella dell’irrigazione o sveglia, vedrai come deve essere iscritta la condizione di if.
      Puoi anche leggere il manuale sul sito arduino ufficiale in cui ti spiega come usare la condizione di if.

  45. Sante Pirci

    Ciao Mauro,

    ok leggerò questi esempi.

    Grazie per la tua risposta.

    S.Pirci

  1. Centralina irrigazione arduino imposta orario - Mauro Alfieri Domotica

    […] RTC shield DS1307: impostare data e ora […]

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>