DS3231 Module looses time tracking after power disconnected

Hello friends

M using ds3231 etc module ZS-042. The module has CR2032 Battery as well this module gives correct time when powered up but looses time tracking after the power has been disconnected or the system reset. I have tried changing the battery and even replacing the module as well, but still the problem persists. M using ds3231 sketch and softrtc sketch from RTClib library. what could b the probable solution? Any help would be great.thabks in advance.

What do you mean by

looses time tracking a

Do you mean that it loses say a few seconds every hour, day, week, for instance or that it simply does not retain the time and reverts to a default value ?

Please post a complete program that demonstrates the problem and a full description of how the 3231 is connected to the Arduino.

UKHeliBob:
What do you mean byDo you mean that it loses say a few seconds every hour, day, week, for instance or that it simply does not retain the time and reverts to a default value ?

Please post a complete program that demonstrates the problem and a full description of how the 3231 is connected to the Arduino.

No it lags by the time till the power source was taken off. And it continues the time again from where it left before the power cutoff, when power is restored.

Ds3232 SCL -> mega SCL
Ds3231 SDA -> Mega SDA
DS3231 Vcc -> Mega 5V
DS3231 Gnd -> Mega Gnd

M using the example sketch that came with the RTClib. Also just now I tried to run the program without connecting the RTC and guess what Arduino still shows the time on serial monitor looks like the Arduino is calculating the time by itself even tho the RTC isn't connected to it

Please post a complete program that demonstrates the problem and a full description of how the 3231 is connected to the Arduino.

This is softRTC example sketch from the RTClib library

// Date and time functions using just software, based on millis() & timer

#include "RTClib.h"

RTC_Millis rtc;

void setup () {
    Serial.begin(57600);
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.begin(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}

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(" seconds since 1970: ");
    Serial.println(now.unixtime());

    // 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();

    Serial.println();
    delay(3000);
}

this ds3231 example sketch fro RTClib library

// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
#include "RTClib.h"

RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {

#ifndef ESP8266
  while (!Serial); // for Leonardo/Micro/Zero
#endif

  Serial.begin(9600);

  delay(3000); // wait for console opening

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
}

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(daysOfTheWeek[now.dayOfTheWeek()]);
    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 midnight 1/1/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 + TimeSpan(7,12,30,6));

    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();

    Serial.print("Temperature: ");
    Serial.print(rtc.getTemperature());
    Serial.println(" C");

    Serial.println();
    delay(3000);
}

both of these codes work even when the RTC module is mnot connected to arduino

later I found some RTC program on the internet which only works with the RTC connected but fails to keep the time track when power is cut off.

#include <Wire.h>

#include "RTClib.h"

DateTime now;
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

RTC_DS3231 rtc;


void showDate(void);
void showTime(void);
void showDay(void); 


void setup ()
{
  Serial.begin(9600);
    //delay(2000);
  if (! rtc.begin()) 
  {
    Serial.println("Couldn't find RTC Module");
    while (1);
  }

  if (rtc.lostPower()) 
  {
    Serial.println("RTC lost power, lets set the time!");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}

void loop () 
{
  now = rtc.now();
  showDate();
  showDay();
  showTime();
  delay(3000);
}
   

 void showDate()
 {
  
  Serial.print(now.day());
  Serial.print('/');
  Serial.print(now.month());
  Serial.print('/');
  Serial.println(now.year());
  
 }
 void showDay()
 {
 
  Serial.println(daysOfTheWeek[now.dayOfTheWeek()]);
  
 }
 void showTime()
 {
  
  Serial.print("Time:");
  Serial.print(now.hour());
  Serial.print(':');
  Serial.print(now.minute());
  Serial.print(':');
  Serial.print(now.second());
  Serial.println();
  Serial.println();
 }

I have made the following connections

The SCL pin of RTC module goes to SCL pin on mega the last pin connection on the top of digital pins.

The SDA pin of RTC module goes to second top most pin on mega on digital pin side. the pin map of mega says those are the SCL and SDA pins of mega.(Although I have even tried using the dedicated SCL and SDA pin on mega but still it gives same result)

Vcc of RTC module to 5v of the arduino

GND of RTC module to GND of arduino.

The mega is powered from the USB to computer

To test I2C functionality, please load and run the I2C Address Scanner program.

jremington:
To test I2C functionality, please load and run the I2C Address Scanner program.

done got this reply on the arduino serial monitor

Scanning...
I2C device found at address 0x57 !
I2C device found at address 0x68 !
done

Scanning...
I2C device found at address 0x57 !
I2C device found at address 0x68 !
done

Scanning...
I2C device found at address 0x57 !
I2C device found at address 0x68 !
done

The last sketch you posted has an unconditional Rtc.adjust call in setup, so it always resets the time to when the sketch was compiled. Try it with that line commented out.

wildbill:
The last sketch you posted has an unconditional Rtc.adjust call in setup, so it always resets the time to when the sketch was compiled. Try it with that line commented out.

trying it just now. I commented the line fired the program and look in the monitor it shows the current time and disconnected the the power now to see if it keeps the track of time.

In “every” example your showing I see this line is left as default.

rtc.begin(DateTime(F(__DATE__), F(__TIME__)));

Now if you read the actual comments around that line.

    // following line sets the RTC to the date & time this sketch was compiled
    rtc.begin(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));

Maybe make/run a quick sketch that programs the current date and time.
Run that sketch once.
Delete all time adjustments from the sketch you want to run, and then upload that sketch.

1 Like

wildbill:
The last sketch you posted has an unconditional Rtc.adjust call in setup, so it always resets the time to when the sketch was compiled. Try it with that line commented out.

AWESOME!!!!! Its working!!! Thanks for ur valuable help

1 Like

Slumpert:
In “every” example your showing I see this line is left as default.

rtc.begin(DateTime(F(__DATE__), F(__TIME__)));

Now if you read the actual comments around that line.

    // following line sets the RTC to the date & time this sketch was compiled

rtc.begin(DateTime(F(DATE), F(TIME)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));



Maybe make/run a quick sketch that programs the current date and time.
Run that sketch once.
Delete all time adjustments from the sketch you want to run, and then upload that sketch.

I will give it a try too!! but for now its working