Problema Tiny RTC

Salve a tutti,
ho un piccolo problema: ho acquistato una scheda tiny RTC per la gestione del tempo, di quelle piccole con a bordo la batteria.
Ho collegato il tutto (massa, +5v, SDA su A4, SCL su A5, batt su A1) con un piccolo sketch ho interrogato il clock e mostrato l'orario usando la libreria rtc [now = rtc.now()] e funziona.
Quando stacco l'Arduino dal PC però si resetta tutto e l'orario riparte da quello base gestito nello sketch.
Se tengo spento il PC ma collegato in alimentazione l'Arduino l'orario procede.
Cosa può essere? La batteria che non funziona? A bordo c'è una litio a bottone di tipo ricaricabile. Un collegamento errato?
La batteria è carica, se la misuro con un tester dice quasi 4V.
Ho letto da qualche parte che potrebbe essere dovuto al fatto che la carcassa del quarzo non è collegata alla basetta, ho provato a tenerla premuta x far fare contatto a massa ma nulla, devo portarci un filo collegato a GRD ?

Grazie anticipatamente.

Se l'orario si resetta vuol dire che la batteria non funziona come dovrebbe.
Puoi fare una foto o mostrarci lo schema dei collegamenti che hai effettuato?

abenvenuti:
Salve a tutti,

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

Risalve,
avete ragione, ma son poco avvezzo ai forum, perdonatemi...

Sono ingegnere civile, grande passione per l'informatica.. Di programmazione me ne intendo discretamente (linguaggi di alto livello), di elettronica il giusto. Per questo vado con i piedi di piombo... ho sempre paura di bruciare tutto!!

I collegamenti mi sembrano ok anche perché funziona e si vede sul monitor seriale.
Allego foto

Proprio su quel modello di RTC ho avuto il problema della batteria.

Pur essendo carica, non era stata inserita bene nel suo alloggiamento e ho dovuto reinserirla più volte prima che il contatto fosse perfetto.

Controlla allora con un tester se arriva tensione sui piedini dell'integrato connessi alla batteria.
Se è come dice Cyb potrebbe essere l'alloggio che crea falsi contatti.

La prova la faccio a scheda scollegata dal pc vero?
Quali sono i pin dell'alimentazione sull'integrato? Dovrei avere circa 3V oppure qualcosa di meno?

Ci fai vedere lo sketch usato?
Spesso in tanti si scordano la parte che resetta l'orario nel setup() quindi ad ogni riavvio l'ora riparte dall'istante a cui hai compilato lo sketch che viene memorizzato in DATE e TIME :wink: :wink:

Allora, di sicuro le linee che impostano data e ora ci sono sempre perchè se le toglievo, al successivo riavvio (dopo aver scollegato l'alimentazione) data il messaggio di errore che RTC non stava funzionando.
Ho fatto qualche prova col tester e sembra che la batteria faccia falso contatto.

Stasera controllo meglio e vi aggiorno.

Saluti

A titolo informativo... Alcune librerie integrano un metodo per controllare se l'RTC sta lavorando o si è fermato (condizione che si verifica al 1° avvio, se stacchi la batteria oppure se lo fermi da codice).

Tu che RTC stai usando? Che libreria?

Ecco lo sketch

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib

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

RTC_DS1307 rtc;
char cStatoRTC = '--_';

// Per lettura dati batteria (da AB)
int sensorValue = 0;        // value read from the pot 
float TT=0.0;
// Fine Per lettura dati batteria (da AB)


void setup () {
  Serial.begin(57600);
#ifdef AVR
  Wire.begin();
#else
  Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
  rtc.begin();

  if (! rtc.isrunning()) {
    Serial.println("RTC non sta funzionando!");
    cStatoRTC = 'KO ';
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(__DATE__, __TIME__));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    //tolta sennò tutte le volte riparte dalla data di compilazione
    }
   else 
    {
    cStatoRTC = 'OK ';
    }
//  Serial.print(cStatoRTC);
}


//*****************************************
//      measure battery function
//*****************************************
void ReadBatVcc(void){
    sensorValue = analogRead(A1);
    TT = sensorValue*0.0047;
    Serial.print("Tensione batteria Vcc: ");
    Serial.print(TT);
    Serial.print("V");
    Serial.println();
}


void loop () {
    DateTime now = rtc.now();
    
//    Serial.print(cStatoRTC);
    Serial.print("Data: ");
    Serial.print(now.day(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.year(), DEC);
    Serial.print(" - ora: ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.print(" - ");
   // Serial.println();

    ReadBatVcc();
    
    delay(1000);
}

Ecco, vedi?

 if (! rtc.isrunning()) {

Qui è chiesto se l'RTC internamente sta contando il tempo. In caso neagativo, viene reinizializzato con l'orario di compilazione dello sketch:

rtc.adjust(DateTime(__DATE__, __TIME__));

DATE e TIME sono 2 costanti che il compilatore sostituisce con la data e l'orario attuali.

Quindi effettivamente tutto fa supporre alla batteria.

Quindi direi che queste linee dovrei lasciarle così senza commentarle.
La tensione di 3V dovrei trovarla anche ai pin di attacco del quarzo o no?

Sì, le puoi lasciare perché non danno noia ad un RTC che funziona. Servono però a rendere un orario di partenza nel caso la batt salti.

Per la questione dei 3V, ma a quanto è alimentato l'RTC? La batteria entra in funzione solo se parte l'alimentazione principale.

Io l'ho alimentato a 5V, a 3 mi da errore...
Dicevo 3 v perchè la batteria è a 3,6 se nn sbaglio, per cui più di 3 sarà difficile

Lo sketch infatti mi riporta come voltaggio rilevato circa 3,05V

Una curiosità: nello sketch la misura letta è moltiplicata x 0,0047.. l'ho preso per bono ma dove posso trovare il fattore di scala giusto??

Il DS1307 ha specifiche di funzionamento:
http://datasheets.maximintegrated.com/en/ds/DS1307.pdf

VCC dev'essere di 5V, mentre la batteria di 3V (come tensione max accetta 3,5V. Se tu usi una batt da 3,6V sei un pò fuori specifiche). Non so però cosa puoi leggere sui pin del quarzo, mai misurato.

La formula la trovi in base ai valori da misurare:

valore = (lettura x Vmax ) / 1024

"lettura" è ciò che ti restituisce analogRead, Vmax è la massima tensione che tu puoi misurare (e questa dipende dalla tensione della batteria a piena carica).

Lo 0.0047 (47mV) è il "passo" del convertitore ADC: 5V / 1024 = 0.00488.

Azz.. non ci ero arrivato :sweat_smile: :sweat_smile:

Idem...

Buongiorno a tutti,
scusate l'assenza ma non ho avuto tempo.
Ho avuto modo di effettuare alcuni test: lavorando sulla batteria e sui pin di collegamento sembra che adesso la tensione arrivi, infatti se stacco la presa usb al ricollegamento l'RTC non si resetta ma adesso ha un altro comportamento strano. In pratica è come se 'congelasse' l'ora in cui si spenge per poi ripartire da li nel momento in cui arriva alimentazione.
Il mio portatile è andato in standby ieri sera verso le 21. Stamani mattina lo sketch di esempio che ho caricato mi dava questo della foto.
Mi sa che il componente è partito.. ne ho ordinato un altro, vediamo.

Saluti

rtc.jpg