Problema RTC DS1307

Ciao a tutti,
sto provando ad usare un RTC DS1307 ed in particolare mi servirebbe calcolare i secondi totali dell'ora attuale per poi potergli sommare un'altra porzione di tempo (es. 2 ore).

Vabbè intanto posto il codice poi cerco di spiegarmi meglio..

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

RTC_DS1307 RTC;

int ore, minu, seco, gg, mm, aa;
long timenow, timestart, timestop;

void setup () {
  Serial.begin(9600);  
  Wire.begin();
    RTC.begin();
   
    if (! RTC.isrunning()) {
    lcd.MiWriteXY("Imposto l'RTC", 0, 0, 1);
    RTC.adjust(DateTime(__DATE__, __TIME__));
   }

  }


void loop () {
  
 DateTime now = RTC.now();
 
  ore = (now.hour());
  minu = (now.minute());
  seco = (now.second());
  gg = (now.day());
  mm = (now.month());
  aa = (now.year());

  
timenow = ore * 3600 +  minu * 60 + seco;
Serial.println(timenow);

timestart = timenow;
timestop = timestart + (2 * 3600);

Serial.println(timestart);
Serial.println(timestop);
Serial.println(timenow);

delay(500);
}

Mettiamo il caso che ora siano le 10:15:25
con timenow = ore * 3600 + minu * 60 + seco; io vorrei che mi restituisse 103600 + 1560 + 25 e quindi che timenow diventi 36925 cioè i secondi equivalenti all'ora corrente per poi potergli sommare altri secondi corrispondenti (timestop = timestart + (2 * 3600):wink: in questo caso a 2 ore.

Il programma funziona ma i valori di timenow non sono mai corretti, sono sempre inferiori a quello che dovrebbero essere. credo che il problema possa dipendere dal tipo di valori che restituisce l'RTC o al tipo di variabili dichiarate ma non so come risolvere..

Grazie a tutti

A parte il fatto che se vuoi aggiungere due ore, io prenderei solo la variabile delle ore e gli farei ore+2, questa istruzione
DateTime now = RTC.now();
andrebbe data prima del setup a mio avviso, altrimenti a ogni ciclo loop tu reistanzi l'oggetto "now"
Sostanzialmente il resto del codice mi pare giusto.
F

non uso quella libreria ma la "DS1307.h", quindi non so se le istruzioni che dai sono corrette ma, se ti restituisce qualcosa vuol dire che funziona. Quindi quello che mi viene in mente sono le seguenti cose:

  • hai provato a controllare che il chip RTC ti dia i giusti valori di ore, minuti e secondi?
    magari potrebbe essere che il calcolo sia giusto ma che i parametri passati non sono corretti.
  • da long a int non dovrebbero esserci problemi di conversione, però magari prova a metterci un cast, tanto per provare, ad esempio:
    timenow = (long)ore * 3600L +  (long)minu * 60L + (long)seco;
    oppure
    timenow =(long)(ore * 3600 +  minu * 60 + seco);
    [/li]

Se puoi sostituisci anche il delay con la funzione millis, magari non c'entra ma a me ha sempre dato rogne il delay con l'RTC

Anche io uso la libreria di cui parla Federico V.

Grazie a tutti,
x Federico
DateTime now = RTC.now(); lo metto nel loop per fare in modo che ogni ciclo i valori cambiano ma magari sbaglio io..probabile..

x Federico Vanzati
Perchè qui
timenow = (long)ore * 3600L +  (long)minu * 60L + (long)seco;
moltiplichi per 3600L ?? cosa cambia da 3600 senza L??

X Pelletta
Cosa intendi con sostituire il delay con la millis?? Per il problema legato al delay avevo anche pensato di usare un controllo sul cambio del valore sei secondi tipo

if (rtc[0] != secondi_precedenti) //se per esempio "secondi" vale 5 e nel ciclo precedente valeva 4 
 {
    Serial.print("Secondi = "); //invia il comando alla seriale
    Serial.println(rtc[0]);
 }

ma non ho ancora avuto modo di provare le differenze.

Grazie

la "L" serve per specificare che quella costante è di tipo long.

Il delay non dovrebbe darti problemi

ciao Gargakk

IL tuo problema non é la libreria o il RTC. Quelli funzionano bene (presumo).

Il problema é che usi una variabile di tipo INT con segno.
I valori che puó prendere una variabile INT sono da +32,767 a -32,768 il bit piú alto viene usato come segno negativo. Se incrementi il numero 32,767 di uno ricevi -32,768.
Nel Tuo esempio 10:15:25 sono 36925 secondi che come numero INT sono -4148 (se non sbaglio i conti).
Se vuoi riuscire a gestire tutti le 24 Ore devi usare una variabile del tipo LONG (valori da -2,147,483,648 a 2,147,483,647 ).

Ti consiglio anche di aggiungere 86400 secondi (24 ore) se l' ora fine intervallo va al prossimo giorno (é minore del tempo di partenza)

Ciao Uwe

Edit:
Avevo letto male il codice di Gargakk percui la mia risposta non é pertinente alla risoluzione del problema di Gargakk. Scusate il disturbo.

scusa Uwe ma lui usa già un long per fare i conti...quindi mi confermi che serve un cast?

Ciao Uwe,
ci stavo lavorando giusto ora ed ho risolto mettendo

long ore, minu, seco, gg, mm, aa;

Adesso il problema è che lavorando con un LCD grafico che era stato eliminato dal codice precedente per scrivere i valori devo fare una conversione in stringhe con itoa() ma un long non viene convertito correttamente, solo int.

Per esempio io faccio:

int hon = 12;
char hons[10];
itoa(hon,hons, 10);

e poi mando al display I2c hons.

se provo a fare:
long timenow;
char timenows[10];
itoa(timenow, & timenows[0], 10);

il valore restituito è sbagliato.

Cosa intendi con:
Ti consiglio anche di aggiungere 86400 secondi (24 ore) se l' ora fine intervallo va al prossimo giorno (é minore del tempo di partenza)
???

Per fare questo controllo io vorrei fare un if che controlla se l'ora di stop è maggiore del valore restituito dall'ora 23.59.59 cioè 86399 e se si tene solo il valore da sommare.

Grazie

Ciao a Tutti

scusa Uwe ma lui usa già un long per fare i conti...quindi mi confermi che serve un cast?

Uuups, Federico Vanzati, hai ragione; aveo letto male il codice di Gargakk. Scusatemi.

ahhha puntatori.
credo che & timenows[0] non sia corretto. Ma deve rispondere qualcuno che abbia le idee piú chiare sui puntatori.

Quella parte di codice non avevi messo, forse é meglio che incolli il codice completo che Ti da problemi.

Ti consiglio anche di aggiungere 86400 secondi (24 ore) se l' ora fine intervallo va al prossimo giorno (é minore del tempo di partenza)

volevo dirti di fare attenzione se l'ora di stop cade sul giorno seguente. Ci sono diverse soluzioni per evitare un malfunzionamento in quel caso.

Ciao Uwe