Pages: [1]   Go Down
Author Topic: Problema RTC DS1307  (Read 1099 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 19
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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..
Code:
#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 10*3600 + 15*60 + 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)smiley-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
Logged

Milano, Italy
Offline Offline
Faraday Member
**
Karma: 10
Posts: 3085
Sideralis Arduino!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Federico - Sideralis
Arduino &C: http://www.sideralis.org
Foto: http://blackman.amicofigo.com

Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 15
Posts: 1163
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
timenow = (long)ore * 3600L +  (long)minu * 60L + (long)seco;
oppure
Code:
timenow =(long)(ore * 3600 +  minu * 60 + seco);
    [/li]
Logged

F

Marche
Offline Offline
Edison Member
*
Karma: 32
Posts: 2263
azioni semplici per risultati complessi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Milano, Italy
Offline Offline
Faraday Member
**
Karma: 10
Posts: 3085
Sideralis Arduino!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Anche io uso la libreria di cui parla Federico V.
Logged

Federico - Sideralis
Arduino &C: http://www.sideralis.org
Foto: http://blackman.amicofigo.com

0
Offline Offline
Newbie
*
Karma: 0
Posts: 19
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Code:
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
Code:
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
Logged

Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 15
Posts: 1163
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Il delay non dovrebbe darti problemi
Logged

F

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20281
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: February 02, 2011, 06:02:33 pm by uwefed » Logged

Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 15
Posts: 1163
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

F

0
Offline Offline
Newbie
*
Karma: 0
Posts: 19
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20281
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a Tutti

Quote
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.

Quote
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


Logged

Pages: [1]   Go Up
Jump to: