RTC shield

Buongiorno a tutti,

Per prima cosa vi auguro buone feste sperando che l'anno nuovo inizi nel migliore dei modi.

Sto usando una RTC shield, basata sul DS1307.
Per prima l'ora e la data sembrerebbero funzionare, ma vorrei cambiare una cosa. quando sono le 12:05 io visualizzo sul serial monitor 12:5 mentre vorrei visualizzare 12:05. è possibile?
questa è la parte di codice relativa all'orologio

void orologio(){
   DateTime now = RTC.now();
  
  //DATA***********************************************
  Serial.print("DATA: ");
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.println(' ');

  //ORA**********************************************
  Serial.print ("ORA: ");
  Serial.print (now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.println(now.second(), DEC);
  Serial.println();
  //invio ORA su LCD*********************************************
  lcd1.setCursor(0,1);
  lcd1.print("ORA:  ");     
  lcd1.print(now.hour(), DEC);
  lcd1.print(':');
  lcd1.print(now.minute(), DEC);
  lcd1.print(':');
  lcd1.print(now.second(), DEC);
  //invio DATA su LCD***********************************************
  lcd1.setCursor(0,0);
  lcd1.print("DATA: ");     
  lcd1.print(now.day(), DEC);
  lcd1.print('/');
  lcd1.print(now.month(), DEC);
  lcd1.print('/');
  lcd1.print(now.year(), DEC);
 }

Grazie

Saluti

Ricambio gli auguri!

...
if (now.minute() < 10) Serial.print("0");
Serial.print(now.minute(), DEC);
...

Grazie, risolto il problema!!

ancora una cosa, usando la libreria RTClib come posso fare per impostare manualmente data e ora? ad esempio con dei pulsanti?

a ogni pressione di un determinato pulsante incrementa o decrementa di 1 una variabile?

//DATA***********************************************
  Serial.print("DATA: ");
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.println(' ');

  //ORA**********************************************
  Serial.print ("ORA: ");
  if (now.hour() < 10) Serial.print("0");
  Serial.print (now.hour(), DEC);
  Serial.print(':');
  if (now.minute() < 10) Serial.print("0");
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  if (now.second() < 10) Serial.print("0");
  Serial.println(now.second(), DEC);
  Serial.println();

ad esempio vado ad incrementare
now.hour(), DEC
now.minute(), DEC
now.second(), DEC

è questa la via da percorrere?

Credi che tu stia usando la libreria RTClib.

In questo caso devi usare la sua funzione RTC.adjust():

RTC.adjust(DateTime(2014, 1, 21, 3, 15, 30)); // 21/01/2014 03.15.30

Al posto delle costanti puoi inserire anche le variabili corrispondenti opportunamente incrementate:

Ad esempio: now.second() + x controllando però che l'incremento non faccia passare al minuto successivo.

chiedo scusa ma non capisco... ho trovato esempi in giro ma non riesco davvero a capire il funzionamento pertanto non li uso.

se creo una variabile e la incremento a che serve RTC.adjust(DateTime(2014, 1, 21, 3, 15, 30)); ?

potresti scrivermi giusto 2 righe per farmi capiure meglio?

ad esempio:

ora = now.hour;
min = now.minute;
sec = now.second;

if (pulsante PIU premuto){
ora ++;
}

stessa cosa per le altre variabili.
poi una volta che le ho iumpostate tutte devo scrivere

RTC.adjust(DateTime(2014, 1, 21, 3, 15, 30));

sostituendo i numeri con i nomi delle variabili?
ho semplificato molto, la sintassi è sbagliata ma è solo per capire il funzionamento, la logica...

scusami ma vorrei capire bene....

Con l'istruzione DateTime now = RTC.now(); carichi nella "variabile" now il valore dei registri del DS1307 che sono aggiornati continuamente.

In realtà now è tutta una serie di variabili (secondi, minuti, ore, ecc. rappresentati da now.second, now.minute, ecc.)

Per fare l'operazione contraria, cioè aggiornare i registri del DS1307, devi usare la funzione RTC.adjust(DateTime(anno, mese, giorno, ore, minuti, secondi));

Se non lo fai limitandoti a variare il valore di una o più variabili, all'aggiornamento successivo (now = RTC.now()), perdi il valore delle variabili modificate.

if (pulsante PIU premuto){
ora ++;
}

Sì ma come ti ha detto cyberhs in questo modo puoi sforare il massimo valore di "ora".
Ogni volta che incrementi una variabile temporale, devi ricordarti che se arrivi al suo massimo, devi ripartire da zero. Invece, decrementandola, se oltrepassi lo zero, devi ripartire dal suo valore massimo.
Prendiamo l'ora, che può andare solo da 0 a 23. Usiamo un tipo char, che può assumere valori da -128 a +127, in questo modo possiam gestire anche la condizione negativa.
Incremento:

if (digitalRead(PulsantePiu)) {
  ora++;
  if (ora > 23) { 
    ora = 0;
  }
}

Decremento:

if (digitalRead(PulsanteMeno)) {
  ora--;
  if (ora < 0) {
    ora = 23;
  }
}

Per i minuti ed i secondi farai allo stesso modo, solo che il tetto massimo di entrambi sarà 59 e non 23.
Ovviamente quello illustrato qui sopra è il caso più semplice, ossia la regolazione dell'orario fatta sulle singole componenti delle ore, minuti e secondi.

Ok, grazie mille! provo!

La libreria che stai usando, in teoria, potrebbe funzionare da sola senza l'uso del modulo attraverso l'uso della funzione millis().

Il problema è che dopo un po' ti accorgeresti che l'orologio non è molto preciso.

La stessa libreria può funzionare in accoppiata ad un modulo contenente il DS1307, garantendo una precisione superiore.

RTC_Millis RTC; // usa il millis()

RTC_DS1307 RTC; // usa il modulo DS1307

Lucadh potresti dirmi come hai collegato il modulo ad arduino, e il relativo codice?
Ho seguito questa immagine, ma non funziona:

la shield che uso io non è quella, a questo link trovi la shield e la relativa documentazione

la shield che uso io non è quella, a questo link trovi la shield e la relativa documentazione
https://www.futurashop.it/rtc-shield-per-arduino-in-kit-8190-rtcshieldkit?filter_name=RTC

Ok grazie :slight_smile: