Problème DS3231 (real time clock)

Bonjour,

J'ai un RTC DS3231 comme celui .

il fonctionnait très bien avec cette librairie : libDS3231
et en utilisant le code exemple "rtc-ds3231".

#include <Wire.h>
#include "ds3231.h"
#include "rtc_ds3231.h"

#define BUFF_MAX 128

uint8_t time[8];
char recv[BUFF_MAX];
unsigned int recv_size = 0;
unsigned long prev, interval = 5000;

void setup()
{
  Serial.begin(9600);
    Wire.begin();
    //DS3231_init(DS3231_INTCN);
    //memset(recv, 0, BUFF_MAX);
    Serial.println("GET time");

    Serial.println("Setting time");
    parse_cmd("T302911604102014",16);
}

void loop()
{  Serial.println("Test1");
    char in;
    char buff[BUFF_MAX];
    unsigned long now = millis();
    struct ts t;
  
    // show time once in a while
    if ((now - prev > interval) && (Serial.available() <= 0)) {
        DS3231_get(&t);  
        Serial.println("Test2");

        // there is a compile time option in the library to include unixtime support
#ifdef CONFIG_UNIXTIME
        snprintf(buff, BUFF_MAX, "%d.%02d.%02d %02d:%02d:%02d %ld", t.year,
             t.mon, t.mday, t.hour, t.min, t.sec, t.unixtime);
#else
        snprintf(buff, BUFF_MAX, "%d.%02d.%02d %02d:%02d:%02d", t.year,
             t.mon, t.mday, t.hour, t.min, t.sec);
#endif

        Serial.println(buff);
        prev = now;
    }

    if (Serial.available() > 0) {
        Serial.println("Test3");
        in = Serial.read();

        if ((in == 10 || in == 13) && (recv_size > 0)) {
            parse_cmd(recv, recv_size);
            recv_size = 0;
            recv[0] = 0;
        } else if (in < 48 || in > 122) {;       // ignore ~[0-9A-Za-z]
        } else if (recv_size > BUFF_MAX - 2) {   // drop lines that are too long
            // drop
            recv_size = 0;
            recv[0] = 0;
        } else if (recv_size < BUFF_MAX - 2) {
            recv[recv_size] = in;
            recv[recv_size + 1] = 0;
            recv_size += 1;
        }

    }
}

void parse_cmd(char *cmd, int cmdsize)
{
    uint8_t i;
    uint8_t reg_val;
    char buff[BUFF_MAX];
    struct ts t;

    //snprintf(buff, BUFF_MAX, "cmd was '%s' %d\n", cmd, cmdsize);
    //Serial.print(buff);

    // TssmmhhWDDMMYYYY aka set time
    if (cmd[0] == 84 && cmdsize == 16) {
        //T355720619112011
        t.sec = inp2toi(cmd, 1);
        t.min = inp2toi(cmd, 3);
        t.hour = inp2toi(cmd, 5);
        t.wday = inp2toi(cmd, 7);
        t.mday = inp2toi(cmd, 8);
        t.mon = inp2toi(cmd, 10);
        t.year = inp2toi(cmd, 12) * 100 + inp2toi(cmd, 14);
        DS3231_set(t);
        Serial.println("OK");
    } else if (cmd[0] == 49 && cmdsize == 1) {  // "1" get alarm 1
        DS3231_get_a1(&buff[0], 59);
        Serial.println(buff);
    } else if (cmd[0] == 50 && cmdsize == 1) {  // "2" get alarm 1
        DS3231_get_a2(&buff[0], 59);
        Serial.println(buff);
    } else if (cmd[0] == 51 && cmdsize == 1) {  // "3" get aging register
        Serial.print("aging reg is ");
        Serial.println(DS3231_get_aging(), DEC);
    } else if (cmd[0] == 65 && cmdsize == 9) {  // "A" set alarm 1
        DS3231_set_creg(DS3231_INTCN | DS3231_A1IE);
        //ASSMMHHDD
        for (i = 0; i < 4; i++) {
            time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // ss, mm, hh, dd
        }
        boolean flags[5] = { 0, 0, 0, 0, 0 };
        DS3231_set_a1(time[0], time[1], time[2], time[3], flags);
        DS3231_get_a1(&buff[0], 59);
        Serial.println(buff);
    } else if (cmd[0] == 66 && cmdsize == 7) {  // "B" Set Alarm 2
        DS3231_set_creg(DS3231_INTCN | DS3231_A2IE);
        //BMMHHDD
        for (i = 0; i < 4; i++) {
            time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // mm, hh, dd
        }
        boolean flags[5] = { 0, 0, 0, 0 };
        DS3231_set_a2(time[0], time[1], time[2], flags);
        DS3231_get_a2(&buff[0], 59);
        Serial.println(buff);
    } else if (cmd[0] == 67 && cmdsize == 1) {  // "C" - get temperature register
        Serial.print("temperature reg is ");
        Serial.println(DS3231_get_treg(), DEC);
    } else if (cmd[0] == 68 && cmdsize == 1) {  // "D" - reset status register alarm flags
        reg_val = DS3231_get_sreg();
        reg_val &= B11111100;
        DS3231_set_sreg(reg_val);
    } else if (cmd[0] == 70 && cmdsize == 1) {  // "F" - custom fct
        reg_val = DS3231_get_addr(0x5);
        Serial.print("orig ");
        Serial.print(reg_val,DEC);
        Serial.print("month is ");
        Serial.println(bcdtodec(reg_val & 0x1F),DEC);
    } else if (cmd[0] == 71 && cmdsize == 1) {  // "G" - set aging status register
        DS3231_set_aging(0);
    } else if (cmd[0] == 83 && cmdsize == 1) {  // "S" - get status register
        Serial.print("status reg is ");
        Serial.println(DS3231_get_sreg(), DEC);
    } else {
        Serial.print("unknown command prefix ");
        Serial.println(cmd[0]);
        Serial.println(cmd[0], DEC);
    }
}

Seulement ce matin il ne se passe plus rien sur l'interface Serial lorsque je le connecte à la carte, la diode présente sur le DS3231 s'allume (à coté du mot Power). Mais ensuite sur l'écran je vois seulement GET time
Setting time

Puis plus rien. On dirait qu'il n'affiche que ce qu'il y a dans la fonction setup et rien dans loop(). En effet j'ai rajouté des Serial.println("Test"); à différent endroit dans loop() et aucun ne s'affiche même pas celui placé juste après : loop(){

Connaissez vous ce problème ?

Salut,

Vérifie la tension de la pile

c'est à dire ?

J'ai mesuré les tensions sur les 3 broches (Vcc = 5V, SCL = 2.9, SDA = 1.5V).
Pour la pile je mesure en me plaçant directement sur le bouton pile et j'obtiens 3.7V sachant que c'est un bouton 3.6V de base donc ça à l'air cohérent non ?

desacant:
c'est à dire ?

J'ai mesuré les tensions sur les 3 broches (Vcc = 5V, SCL = 2.9, SDA = 1.5V).
Pour la pile je mesure en me plaçant directement sur le bouton pile et j'obtiens 3.7V sachant que c'est un bouton 3.6V de base donc ça à l'air cohérent non ?

bonjour
Si la "pile"est bonne , voir ce que donne ton module (si il est reconnu) en le testant avec un scanner I²C

Merci pour ce code ! j'ai fait le test en connectant uniquement mon DS3231 à la carte. Le scanner ne trouve aucune connexion. J'ai essayé avec différent câbles donc le problème ne provient pas de là.

Existe-t-il d'autres pins pour une connexion I2C (j'utilisais A4 et A5)?
Ou bien le problème vient du DS3231 ?

desacant:
Merci pour ce code ! j'ai fait le test en connectant uniquement mon DS3231 à la carte. Le scanner ne trouve aucune connexion. J'ai essayé avec différent câbles donc le problème ne provient pas de là.

Existe-t-il d'autres pins pour une connexion I2C (j'utilisais A4 et A5)?
Ou bien le problème vient du DS3231 ?

bonjour
ton module embarque une RTC et aussi une eeprom I²C
si tu ne vois rien au scanner (au moins une adresse) c'est que la liaison I²C ne se fait pas
les erreurs les plus courantes :
inversions SDA/SCL
oublie des resistances de tirages (mais elles semblent etre sur le module) de plus si ton module à déjà fonctionné ...
faire une inspection du module à la loupe et regarder avec un voltmetre si les alims et niveaux sont corrects