RTC ds1307 dimentica la data

Salve,
ho acquistato un RTC ds1307 DS1307 RTC tutorial per realizzare un orologio che tenga la data e l'ora anche nel caso in cui non c'e' l'alimentazione dell'arduino. Quando riavvio arduino vorrei che mi desse l'ora esatta.
Ho fatto la prova che c'e' nel link di cui sopra, ma non riesco proprio a farlo andare.
Perche' l'RTC non mantiene la data e l'ora pur avendo la batteria?

Usando lo sketch dell'esempio ottengo l'orario e la data corretti:
2011/10/2 19:34:1
since 1970 = 1317584041s = 15249d
now + 7d + 30s: 2011/10/9 19:34:31

  1. Se tolgo l'alimentazione dell'arduino e lascio la batteria dell'RTC, quando riattacco l'usb dopo un certo lasso di tempo l'arduino ricomincia da dove si era fermato:

2011/10/2 19:34:1
since 1970 = 1317584041s = 15249d
now + 7d + 30s: 2011/10/9 19:34:31

  1. Se tolgo la batteria resetta tutto e non incrementa l'ora e la data come si puo' vedere dalla lettura da seriale:
    2000/1/1 0:0:0
    since 1970 = 946684800s = 10957d
    now + 7d + 30s: 2000/1/8 0:0:30

  2. Inoltre ho notato che l'ora e la data, quando tolgo l'alimentazione, per default vengono inizializzate dal momento in cui e' stata effettuata la compilazione.

Come posso sistemarlo?

direi che è un problema di codice... mostracelo :smiley:

#include <Wire.h>
#include "RTClib.h"
 
RTC_DS1307 RTC;
 
void setup () {
    Serial.begin(19200);
    Wire.begin();
    RTC.begin();
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    //RTC.adjust(DateTime(__DATE__, __TIME__));
  }
 
}
 
void loop () {
    DateTime now = RTC.now();
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    Serial.print(" since 1970 = ");
    Serial.print(now.unixtime());
    Serial.print("s = ");
    Serial.print(now.unixtime() / 86400L);
    Serial.println("d");
 
    // calculate a date which is 7 days and 30 seconds into the future
    DateTime future (now.unixtime() + 7 * 86400L + 30);
    Serial.print(" now + 7d + 30s: ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();
    delay(3000);
}

La libreria l’ho scaricata da qui: GitHub - adafruit/RTClib: A fork of Jeelab's fantastic RTC library

Per favore, racchiudi il codice con gli appositi tag, così è illeggibile.

Se lanci lo sketch di da il mesaggio "RTC is NOT running!"?
Ciao Uwe

La domanda di Uwe è lecita perché da come descrivi il comportamento dell'RTC, pare che questo si fermi.

Togli per favore quest porzione di codice:

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    //RTC.adjust(DateTime(__DATE__, __TIME__));
  }

e riprova. Se l'orologio continua a camminare vuol dire che il problema è nella libreria che non vede se l'orologio va. Se invece riparte da 2000/00/00 allora è l'RTC che non tiene il tempo (collegamenti errati?)

@ Leo
È collegato con I2C; é un po difficile collegarlo male e leggere comunque l'ora.
@ wsnicky
hai provato di usare un altra libreria ?

http://code.google.com/p/sjunnesson/downloads/detail?name=DS1307.rar&can=2&q=

o di intarfacciarti direttamente sul RTC?
http://combustory.com/wiki/index.php/RTC1307_-_Real_Time_Clock

ciao Uwe

Intendevo collegato male qualcosa dell'RTC.
Quello che ha comprato è una breakout board da saldare in proprio. Magari ha sbagliato a saldare qualcosa oppure c'è una saldatura fatta male che non fa contatto.

Ciao, grazie per tutti i consigli utili.
Ho risolto qualche problema, pero’ quello cardine non e’ stato risolto, cioe’ quando riavvio arduino il count della data prosegue dall’ultima visualizzazione.
Inoltre per poterlo fare funzionare devo mandare due volte lo sketch, la prima volta con il setting della data, la seconda volta devo commentare la parte del setup:

#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h> // written by  mattt on the Arduino forum and modified by D. Sjunnesson

void setup()
{
  Serial.begin(9600);
/*
  RTC.stop();
  RTC.set(DS1307_SEC,1);        //set the seconds
  RTC.set(DS1307_MIN,23);     //set the minutes
  RTC.set(DS1307_HR,12);       //set the hours
  RTC.set(DS1307_DOW,4);       //set the day of the week
  RTC.set(DS1307_DATE,5);       //set the date
  RTC.set(DS1307_MTH,3);        //set the month
  RTC.set(DS1307_YR,9);         //set the year
  RTC.start();
*/
}

void loop()
{

  Serial.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
  Serial.print(":");
  Serial.print(RTC.get(DS1307_MIN,false));//read minutes without update (false)
  Serial.print(":");
  Serial.print(RTC.get(DS1307_SEC,false));//read seconds
  Serial.print("      ");                 // some space for a more happy life
  Serial.print(RTC.get(DS1307_DATE,false));//read date
  Serial.print("/");
  Serial.print(RTC.get(DS1307_MTH,false));//read month
  Serial.print("/");
  Serial.print(RTC.get(DS1307_YR,false)); //read year 
  Serial.println();

  delay(1000);

}

Ho provato la libreria postata da uwefed:
http://code.google.com/p/sjunnesson/downloads/detail?name=DS1307.rar&can=2&q=

L'orologio è a sé stante e se non va vuol dire che c'è qualcosa che... non va.
Provando come ti ho detto, cosa ottieni?

Ho provato come mi hai detto e ho ottenuto il seguente risultato:

/*if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }*/

output ottenuto:

2000/1/1 0:0:0
 since midnight 1/1/1970 = 946684800s = 10957d
 now + 7d + 30s: 2000/1/8 0:0:30

Pero' considera che dentro l'if ci sta la funzione RTC.adjust che e' quella designata per il setting dell'RTC.

Ma le variabili DATE, TIME cosa contengono?

Hai povato con un altra libreria?

Ciao Uwe

Queste variabili sono delle chiamate che vengono impostate con l'orario della compilazione.
Le librerie che mi hai consigliato le ho provate tutte... =(

uwefed:
Ma le variabili DATE, TIME cosa contengono?

Hai povato con un altra libreria?

Ciao Uwe

Sono costanti che contengono la data e l’ora del sistema nell’ISTANTE della compilazione.

wsnicky:
Pero’ considera che dentro l’if ci sta la funzione RTC.adjust che e’ quella designata per il setting dell’RTC.

Appunto, se non fai RTC.adjust non programmi l’ora dall’Atmega per cui o l’RTC funziona e tiene l’orario oppure no.
Con questa prova hai dimostrato che NON funziona.

Quindi durante il montaggio hai commesso qualche errore: hai tenuto troppo la punta del saldatore su uno dei pin del micro; la batteria tampone non eroga corrente; c’è una saldatura difettosa ecc…

batterial al contrario ? e' facilissimo con le bottone
oppure micro al contrario ? guardati i riferimenti ?

posta una foto del montaggio

Se il micro fosse al contrario, non leggerebbe mai l'ora. Invece la legge. Ma non gliela mantiene. Ecco perché dico che c'è qualcosa sulla schedina di sbagliato.

yep, che stupido.
allora resta il discorso batteria al contrario, piu' errori di sbaglio di montaggio.

posta foto

ecco le foto

Ho fatto delle misure con il multimetro.
Allora: staccando l'alimetazione di arduino e misurando la tensione sui piedini del DS1307 misuto 0 volt fra la VCc e GND, quindi cio' vuol dire che la batteria non sta alimentando l'integrato, ragion per cui non riesce a memorizzare la data.
Le prove le ho fatte su ben tre RTC comprati da adafruit.
Cosa ne pensate di questo?

Scusate ho sbagliato io. Ho fatto le misurazioni sempre sul piedino Vcc mentre la batteria alimenta l’RTC in un altro piedino VBAT.
Adesso ho rifatto le misure e ho le giuste alimetazioni.

rtc_ds1307_adafruit.png