Sulla precisione dei DS3231

Ho preso il primo DS3231 di cui si "decantano" le doti di precisione. Leggendo di cloni poco precisi venduti a pochi euro alla borsa ho preso questo.

Finché è alimentato (5V), sul pin 32K leggo una frequenza di 32768.0 - 32768.1 Hz, che se non sbaglio vuol dire un errore di un paio di minuti all'anno (ma fossero anche cinque poco importa), e l'ora visualizzata sul monitor seriale avanza regolarmente come quella del PC.

Invece disalimentandolo comincia a restare indietro in modo macroscopico, un'ora e mezza solo questa notte :o ma bastano dieci minuti per perdere secondi in modo evidente.

La pila CR2032 è sui 4V (anche da spento) .

C'è qualche accorgimento hardware / software da tenere in considerazione o la possiamo vidimare come la classica sòla venduta a peso d'oro?

Se può servire questo è il codice di prova:

#include <Wire.h>

uint32_t  t0       =  millis();
uint32_t  t1       =  millis();
byte      cntLED   =  0;
byte      precSec  =  0;

//-----------------------------------------------------------------------------

byte binBCD(byte n) { return ((n / 10) << 4) | (n % 10); }

byte BCDbin(byte n) { return ((n >> 4) * 10) + (n & 0x0F); }

//-----------------------------------------------------------------------------

void impostaRTC(){
    Wire.beginTransmission(0x68);               // <--- indirizzo RTC su bus i2c
    Wire.write(0);                              // <--- punta al registro 0
    Wire.write(0);                              // <--- azzera secondi RTC
    Wire.write(binBCD(42));                     // <--- imposta minuti RTC
    Wire.write(binBCD(9));                      // <--- imposta ore RTC
    Wire.endTransmission();
}

//-----------------------------------------------------------------------------

void setup() {
    Wire.begin();
    //Wire.beginTransmission(0x68);
    //Wire.write(0x0E);
    //Wire.write(0x00);                         // <--- out 1Hz pin SQW
    //Wire.endTransmission();
    //impostaRTC();                             // <--- solo per settaggio ora
    pinMode(13, OUTPUT);
    Serial.begin(9600);
}

//-----------------------------------------------------------------------------

bool timeout(uint32_t* t, uint16_t n) {
    if (millis() - *t >= n) { *t += n;  return true; }
    return false;
}

//-----------------------------------------------------------------------------

void loop() {
    if (timeout(&t0, 200)) {                    // ogni 200 ms
        Wire.beginTransmission(0x68);
        Wire.write(0);                          // <--- punta al registro 0
        Wire.endTransmission();

        Wire.requestFrom(0x68, 3);              // <--- legge tre byte
        byte sec = BCDbin(Wire.read());
        byte min = BCDbin(Wire.read());
        byte hou = BCDbin(Wire.read());

        if (sec != precSec) {                   // <--- se cambiato il secondo
            precSec = sec;
            Serial.print(hou);
            Serial.print(":");
            Serial.print(min);
            Serial.print(":");
            Serial.println(sec);
        }
    }

    if (timeout(&t1, 100)) {                    // ogni 100 ms
        digitalWrite(13, (!cntLED) ? 1 : 0);    // blink 100ms on 2900 ms off
        cntLED = (cntLED + 1) % 30;
    }
}

Direi ... "monnezza" ...
... ne ho parecchi che uso ogni tanto e che, proprio per verifica, sono alimentati con la batteria e chiusi in un cassetto. Dopo mesi mai trovato discrepanze oltre qualche secondo ... ::slight_smile:

Guglielmo

... purtroppo Amazon NON è sinonimo di qualità, ma spesso solo di prezzi più alti per la stessa qualità che trovi a molto meno su AliExpress.

Se vuoi essere sicuro vai su RS o Mouser, ordini i chip e di fai la tua scheda, altrimenti vai su AliExpress, ne prendi un sacchetto per 2US$ l'uno e ... fai tu la cernita :wink:

Guglielmo

La pila CR2032 è sui 4V (anche da spento) .

Una pila CR2032 non puó dare 4V. Ha al massimo 3V.
Sei sicuro che non é una LIR2032?

Comunque non é questo la causa del Tuo problema.
Ciao Uwe

Confermo pila CR (e tra l'altro mi torna in mente questo thread)

Scrivendo 0x48 nel registro di controllo (addr 0x0E), ho attivato l'emissione dell'onda quadra 1024 Hz anche a RTC disalimentato, e risulta che l'oscillatore continua a spegnersi e ripartire (oscillDS3231.mp3):

Quindi... visto che il prezzo non vuol dire niente... è in qualche modo riconoscibile il pattume da qualcosa di serio? (Ho passato la jovinezza a saldare chippetti, adesso con la vista non più così acuta volevo "rilassarmi" :grin: )

Claudio_FF:
... è in qualche modo riconoscibile il pattume da qualcosa di serio? (Ho passato la jovinezza a saldare chippetti, adesso con la vista non più così acuta volevo "rilassarmi" :grin: )

Purtroppo o si comprano i chip dai distributori "seri", ma si deve saldare, o si pagano il giusto prezzo da produttori seri di breakout boards ... es. QUESTO o ... si va su AliExpress, si cerca il prodotto, si trova un venditore che ne ha venduti tanti ed ha un'ottima reputazione, se ne prende un sacchetto, si incrociano le dita e ... si fa la selezione :wink:

Guglielmo

P.S.: Quelli che io ho preso da quel venditore sono andati tutti bene ... fortuna ? Possibile ...

gpb01:
P.S.: Quelli che io ho preso da quel venditore sono andati tutti bene ... fortuna ? Possibile ...

Mah, foto e serigrafie sono identiche, le saldature un po' meglio. Intanto lasciamo una recensione negativa che potrebbe essere che il venditore si proponga di rimborsare come già avvenuto in altri casi.

E nel frattempo... siccome alimentato funziona alla grande... può sempre essere usato come timer di precisione per tempi lunghi al posto di millis :smiley:

void resetRTC(){
    Wire.beginTransmission(0x68);
    Wire.write(0);
    Wire.write(0);
    Wire.write(0);
    Wire.write(0);
    Wire.endTransmission();}
byte BCDbin(byte n) { return ((n >> 4) * 10) + (n & 0x0F); }

// Ritorna i secondi trascorsi dal reset 0..86399
uint32_t secs(){
    Wire.beginTransmission(0x68);
    Wire.write(0);
    Wire.endTransmission();
    Wire.requestFrom(0x68, 3);
    return BCDbin(Wire.read()) + 60*BCDbin(Wire.read()) + 3600*BCDbin(Wire.read());}

Claudio_FF:
Mah, foto e serigrafie sono identiche ...

Quei moduli sono TUTTI uguali, quello che cambia e il "difetto" dei chip (di scarto) ... ci sono ...

... quelli fatti con schifezze che non raggiungono i limiti di temperatura
... quelli fatti con schifezze che non raggiungono il range di alimentazione
... quelli fatti con schifezze in cui l'oscillatore interno non va bene se alimentato a batteria
... quelli fatti con schifezze che ecc. ecc.

Sempre con schifezze sono fatti (fai la somma dei componenti, dello stampato, del lavoro, della spedizione e dimmi come fai ad arrivare a certi prezzi) ... solo che alcune sono più evidenti (... come è capiato a te), altre meno (... come probabilmente è capitato a me) :wink:

Ovvio che NON li userei MAI per un pogetto serio, ma per "giocare" vanno piû che bene ... :slight_smile:

Guglielmo

AGGIORNAMENTO: rifatte le saldature del portapila adesso sembra funzionare tutto regolarmente :roll_eyes: con un errore valutato a spanne di pochissimi minuti all'anno.

Rimarrebbe da chiarire il discorso pila CR/LI e tensione 5V.

Da quanto ho capito a 3,3V il modulo funzionerebbe sempre bene con entrambi i tipi di pila.

Mentre a 5V usando una CR non ricaricabile bisognerebbe asportare il diodo per evitare esplosioni.

Immagino sia quello rosso con la fascetta. Asportiamo?

Se non vuoi che alla lunga esploda, asporta (mi raccomando l'anestesia, prima dell'asportazione ... :D)

Più che asportare il diodo, ti suggerisco di rimuovere il resistore da 200 ohm affianco ad esso.

Questo sempre che tu non disponga della ricaricabile Li-Ion LIR2032.

Quel modulo prevede di usare la batteria ricaricabile ed ha una circuiteria apposta, fatta male.
Sempre in rete trovi le modifiche da fare per eliminare il circuito di ricarica. Ad esempiohttps://edwardmallon.wordpress.com/2014/05/21/using-a-cheap-3-ds3231-rtc-at24c32-eeprom-from-ebay/

Confermo quanto detto da Guglielmo, hai preso su Amazon un modulo che è identico a quelli venduti su Aliexpress.

Asportata la resistenza.
Dopo 12 giorni ha perso meno di un secondo, se continuasse così sarebbe mezzo minuto all'anno.
Almeno alla fine questo modulo difettoso pagato a peso d'oro sembra essere ok.
Grazie per il link e i riscontri.