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
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.
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: https://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 !!!
159 commenti
1 ping
Vai al modulo dei commenti
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
Autore
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
Grazie per la risposta. Quindi da quanto ho capito non posso regolare la sveglia direttamente con setMode mediante le nuove variabili hourAlarm e minAlarm?
Autore
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
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
Autore
Ciao Francesco,
la memorizzazione dell’ora avviene direttamente nel DS1307, se non lo alimenti perde questa impostazione.
Ciao Mauro
Complimenti per il sito
Anch’io sto cerando di far funzionare l’orologlio con sveglia ma non so come implementare il listato per far scrivere l’ora di sveglia come attivarla e disattivarla e come memorizzarla
grazie per l’aiuto
Autore
Ciao Mirco,
ti consiglio di affrontare una parte alla volta.
Parti dal definire un pulsante o un evento con cui visualizzi l’ora di sveglia sul display;
Per la parte di Impostazione/Modifica/Eliminazione/Attivazione/Disattivazione ti consiglio di leggere qualcuno degli articoli in cui si parla di menu ( es.: dolly o centralina di irrigazione ) che puoi usare come spunto.
Resta valido per tutti i miei tutorial che sono stati scritti per essere studiati e compresi fino in fondo prima di provare a modificarli, questo è il solo metodo che conosco per comprendere a fondo le cose che leggi.
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!
Autore
Hi Poledust,
you find schematic in this article: https://www.mauroalfieri.it/elettronica/rtc-arduino-come-orologio.html
How to connect the pushbuttons can find many articles on blog.
Mauro
Autore
Hi Poledust,
you can find schema in this article: https://www.mauroalfieri.it/elettronica/rtc-arduino-come-orologio.html
How to connect the pushbuttons can find many articles on blog.
Mauro
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
Autore
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
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
Autore
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
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
Autore
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
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.
Autore
Ciao Claudio,
lo fa con tutti i pulsanti?
prova a cambiare pin di Arduino su cui è collegato il pulsante.
Mauro
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.
Autore
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
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
Autore
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
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
Autore
Hello Hans,
you have copied all the sketch?
I tried to run it with IDE 1.0.5 and works without problems.
Mauro
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
Autore
Ciao Nicola,
se leggi la descrizione dello sketch troverai le linee interessate e da modificare.
Mauro
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
Autore
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
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
Autore
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
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
Autore
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
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
Autore
Ciao Viviano,
è la prima volta che leggo di un progetto simile, mi piacerebbe pubblicare quello che hai realizzato se ti va.
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
Autore
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
Caro Mauro
ti ho mandato qualcosa nella tua casella del blog non so se l’hai ricevuta
saluti
Viviano
Autore
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.
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
Autore
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
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.
Autore
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
Colpa di Chrome. Ho provato con Firefox e non ci sono errori 🙂
Autore
Perfetto Natale !!!
Ciao molto bello il tuo progetto non è che mi potresti inviare lo schema elettrico di come hai collegato i pulsanti?
Autore
Ciao Filippo, trovi nel blog tanti articoli dedicati ai pulsanti, ci sono molti modi in cui puoi collegarli.
Mauro
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
Autore
Hola Luiyi,
lo que quieres hacer es posible.
Buscar artículos en el blog.
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.
Autore
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.
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 ?
Autore
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.
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
Autore
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.
😀
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.
Autore
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.
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
Autore
Ottimo Enrico !!!
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
Autore
Ciao Andrea,
non ho mai provato un DS3231 ma se si tratta di un RTC penso sia possibile definire tutti gli allarmi che vuoi.
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
Autore
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.
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
Autore
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.
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
Autore
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.
Grazie per la risposta , sapresti indicarmi una libreria per gestire il ds1307 con l’ide 1.61 (l’ultima versione) o similari?
Autore
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 ?
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
Autore
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.
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
Autore
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.
Ottimi i tuoi tutorial, ma perchè non implementi anche gli schemi???
Autore
Ciao Michele,
di quelli più complessi li implemento, di schemi semplici come questo pubblico solo le foto dei collegamenti.
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!
Autore
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
Ciao,
ho appena avuto il tempo (esami permettendo) di ricontrollare tutto. Avevo semplicemente sbagliato dei collegamenti ._.
Grazie 🙂
Autore
Bravissimo PietroJoe.
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
Autore
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.
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 🙂
Autore
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.
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
Autore
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.
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
Autore
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
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
Autore
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.
Mauro
è tutto chiaro grazie per le spiegazioni, Antonio
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
Autore
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.
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:
https://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
Autore
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.
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
Autore
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.
Adesso funziona!
Grazie!!
Autore
Bene Michele.
Bravo !!!
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?
Autore
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.
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
Autore
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.
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.
Autore
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.
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 🙂
Autore
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.
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
Autore
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.
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.
Autore
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.
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
Autore
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.
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
Autore
Ciao Maurizio,
cosa prova a verificare che tu non abbia saturato la memoria eccedendo con le variabili globali.
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?
Autore
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.
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
Autore
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.
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.
Autore
Ottimo Mimmo, sono contento
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 ]]
Autore
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.
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
Autore
Nessun problema Vito.
Sono certo che riuscirai nel tuo obiettivo, qualora ti servisse puoi usare sempre i commenti per chiedere chiarimenti.
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.
Autore
Ottimo Vito !!!
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.
Autore
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?
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
Autore
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.
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
Autore
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.
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
Autore
Ciao Antonio,
si è questo il blog. Ricordo che qualcuno ha anche descritto bene come ha eseguito la modifica.
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
Autore
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.
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
Autore
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.
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
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
Autore
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.
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
Autore
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.
Ciao Mauro,
ok leggerò questi esempi.
Grazie per la tua risposta.
S.Pirci
Ciao Mauro
Ho letto tutte , o quasi tutte, le domande e le risposte date ma non ho trovato quello che cercavo
Sono un settantacinquente appassionato e vorrei risolvere un problemino, ti spiego il tutto:
dopo tanto penare sono riuscito a fare una stazione barometrica con la trasmissionew via Wifai
con orologio e datario settato dai tre pulsanti come da te suggerito e debbo dire che dopo varie delusioni ora funziona tutto perfettamente tranne per una cosa L’orologio.
Ti spiego l’ora di arduino nel giro di due o tre giorni va avanti di due o tre minuti so che esiste il comandio delay 1000 che praticamente dice che 1 secondo equivale a 1000 millisecondi ma non lo trovo nel tuo listato potresti dirmi dove va inserito e come funziona? Se va avanti gli debbo dire che un secondo equivale 1010 millisecondi o è il contrario.
Se ti servono altre delucidazioni sono a disposizione
grazie a presto
Autore
Ciao Enzo,
purtroppo non puoi usare il clock di arduino come orologio, ecco perché utilizzi l’RTC che è una scheda separata il cui scopo è solo quello di mantenere l’orario aggiornato.
Ciao Mauro e scousa per il ritardo ma alla mia eta cambiare casa è faticoso poi ci si è messa anche l’influenza, come vedi non mi faccio mancare nulla.
Passiamo a noi giusto per ricordare ho usato il ds1302 per l’orologio ma va avanti di un paio di miniti ogni due o tre giorni, e nella risposta mi dicevi che il modulo conseva solo l’orario , allora stavo pensando se era possibile usare il modulo per il radiocontrollo per capirci quello trasmesso dalla germania a77Khz
e poi nel tuo listato con i tre pulsanti ho provato ad inserire anche i giorni della settimana ma chiaramente essendo solo uno smanettatore ho fatto piu casino che altro, se è possibile puoi mandarmi il listato per questa implementazione, so che dovrei studiare il linguaggio ma ci ho provato enon avendo le basi non ci riesco proprio
Grazie
Enzo
Autore
Ciao Enzo,
non ho mai usato i giorni della settimana in uno sketch, ricordo che qualche appassionato lo ha pubblicato nei commenti, di questo o di un altro sketch, puoi usare quello.
In merito all’RTC, forse si tratta solo di un errore di battitura, ma sei certo che sia un DS1302 e non un DS1307 ?
Ciao Mauro,
stò sviluppando un progetto tale da costringermi ad usare Arduino Mega. Questo mondo è nuovo e stò imparando pian piano.
Il mio progetto consiste in una serie di visualizzazioni tramite un programma Menù che mi faccia visualizzare determinate temperature, relè, umidità ecc.ecc. Il tutto già pre-assemblato utilizza due pulsanti per lo scorrimento del menù ed un terzo per la selezione.
Quasi alla fine mi è venuto l’idea di aggiungere anche l’ora e guardando un pò in giro ho provato il DS1302 il DS1307(non precisi) per arrivare ad ordinare il DS3231(molto + preciso).
Seguendo questo esempio con i tre pulsanti vorrei chiederti se c’è la possibilità di utilizzare un pulsante solo? Il problema è che non vorrei stare a rivoluzionare la pulsantiera e vorrei fare che con i due pulsanti scorro il menù e arrivato all’orario il terzo pulsante (select) faccia il modo di cambiare l’ora.
Avrei pensato tenendo premuto per più di 2 secondi il pulsante select, mi faccia lampeggiare i minuti e con i due pulsanti di scorrimento mi regolo i minuti, poi tenendo nuovamente premuto il pulsante select mi faccia lampeggiare le ore, ecc.ecc.
Inoltre vorrei chiederti se dovessi passare dall’ora a un relè e viceversa con i pulsanti di scorrimento, che cosa succede all’ora? Rimane in memoria o no?
Autore
Ciao Domenico,
se ho compreso ciò che stai realizzando non dovresti aver problemi ad applicare la teoria ed i concetti appresi in questo tutorial al tuo progetto.
Ti basta solo cambiare la libreria di gestione del componente ( ovviamente per il DS3231 ) e sostituire i metodi di lettura e set dell’orario.
L’orario, una volta memorizzato, resta nel componente e non devi far altro che richiamarlo dal DS3231 e visualizzarlo.
Ciao MAuro e complimenti per il tuo orologo comandato da tre pulsanti he dopo vare provo son riuscito a far funzionare, non sono un tecnico ma uno smanettatore folle a cui piace l’elettronica non avendo le basi per capirla ,ùun sola domanda : è possibile nel tuo listato inserire e visualizzare i giorni della settimana???
se si puoi mandarmi il listato e dove vainserito?
Grazie
Autore
Ciao Vincenzo,
tra i commenti degli articoli dedicati al DS1307 ricordo che qualche appassionato/smanettone lo avesse pubblicato.
Ho io una domanda per te: ho già risposto ad un commento molto simile era sempre il tuo?
Ciao, ti ringrazio per tutti i tuoi tutorial.
Ho costruito il progetto presente su questa pagina e ti volevo chiedere cosa mi consigli poichè voglio che ad ogni ora e ogni mezzora mi attivi 2 diversi relè, si tratta di un orologio che ad esempio alle 13 attivi il relè con un impulso, alle 14 attivi il relè con due impulsi ecc
Autore
Ciao Michele,
che tipo di consiglio ti occorre?
Mi interesserebbe sapere come scrivere il codice. Ovvero ad ogni ora e ad ogni mezzora un uscita di arduino deve dare degli impulsi a due relè in base a che ore sono (es alle 6.00 deve dare 6 impulsi al relè 1 , 6.30 sono 6 impulsi al relè 1 e un impulso al relè 2 , 7.00 sono 7 impulsi al relè1 e cosi via).
Autore
Ciao Michele,
puoi scrivere una funzione che in base all’ora generi gli impulsi che desideri su un pin ed in base ai minuti lo generi su un secondo.
si lo so, il problema è scrivere il programma…
Ciao Mauro
io sono all’inizio e sto cercando di modificare il tuo programma
per utilizzare lcd pad
su A0 leggo i tasti premuti
ma non riesco a venirne fuori
puoi aiutarmi
grazie
[…] RTC shield DS1307: impostare data e ora […]