Go Down

Topic: Set RTC to compile time, but RTC not retaining time after power cycle. (Read 2251 times) previous topic - next topic

Ashton

I'm revisiting an annoying problem I've had for a while, having my DS3231 RTC keep the correct time during power off.  Plus each time I compile I need the RTC (fresh new or existing pre-set) to be set to compile time, even if it is already running.  Most of the examples I have use something similar to:
Code: [Select]
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__));
}



My full code is as follows:
Code: [Select]
// Daily Alarm Test using DS3231 RTC
//
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
#include <Time.h>
#include <TimeAlarms.h>
LiquidCrystal_I2C lcd(0x27,20,4);
RTC_DS1307 RTC;
time_t syncProvider()
{  return RTC.now().unixtime(); }

void setup () {
 Wire.begin();
 RTC.begin();
 setSyncProvider(syncProvider);
//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__)); //Set RTC to compile time
//  }

Alarm.alarmRepeat(8,0,0, Event1);  // Daily event time 24 Hr
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
pinMode(7, OUTPUT); // Daily test output to controller zone
digitalWrite(7, HIGH); //Turn on Q3 Transistor
}

void loop () {
clockDisplay();
Alarm.delay(1000);
}

void clockDisplay(){
 DateTime now = RTC.now();
 char buf[20];  // -------------------- RTC Time --------------------
 sprintf(buf, "%02d:%02d:%02d %02d/%02d/%4d", now.hour(), now.minute(), now.second(), now.month(), now.day(), now.year());
 lcd.setCursor(0,0);
 lcd.print(buf);

char buf1[20];  // ------------------  Arduino Time -----------------
sprintf(buf1, "%02d:%02d:%02d %02d/%02d/%4d", hour(), minute(), second(), month(), day(), year());
lcd.setCursor(0,1);
lcd.print(buf1);
}  

void Event1(){ // *********** Daily Alarm Output ****************
 digitalWrite(7, LOW);  //alarm test output
 delay(4000);
 digitalWrite(7, HIGH); }


Could it be that the DS3231 doesn't set correctly using the DS1307 commands, etc.?
These are new RTC units, the battery voltages are 3.29-3.3V

mrburnette

Quote
Could it be that the DS3231 doesn't set correctly using the DS1307 commands, etc.?


Sounds like a dead backup battery (or one not charging if rechargeable.). Try sample code.



http://playground.arduino.cc/Code/time


Quote
* The I2C 'DS3231' interface is very straight forward and
   virtually identical to the register addresses of the popular DS1337
   and DS1307 RTCs, which means that existing code for the Arduino,
   Basic Stamp, Cubloc, and other controllers should work with no modification.
   For reference purposes see >> https://www.adafruit.com/products/255

Ashton

That example was not much help to me.
Every time I close the Serial Monitor,  I'm prompted "waiting for sync message", it doesn't display the time until the Unix time is re-entered.
Like: T1375316871

Maybe I'm missing something.

dannable

Quote
if (! RTC.isrunning())


Not applicable to the 3231. It's a flag set on the 1307.

Take a look at the data sheet.
Beginners guide to using the Seeedstudio SIM900 GPRS/GSM Shield

Ashton

I found a code example that solved my problem here: http://www.l8ter.com/?p=417

Code: [Select]
DateTime now = RTC.now();
DateTime compiled = DateTime(__DATE__, __TIME__);
if (now.unixtime() < compiled.unixtime()) {
Serial.println("RTC is older than compile time! Updating");
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(__DATE__, __TIME__));


Tests so far are good.


JohnHoward

#6
Aug 01, 2013, 04:41 am Last Edit: Aug 01, 2013, 06:22 am by Coding Badly Reason: 1
Your code appears to set the arduino date/time back to the compile-time values each time it starts.  I don't think you ever actually set the time IN theDS3231 nor are you telling the Arduino to READ the time from the RTC (as the syncprovider).

A sketch I wrote:

Code: [Select]
#include "arduino.h"

#include "Wire.h"
#include <Time.h>
#include "DS3231RTC.h"

DS3231RTC RTC3231;
tmElements_t tm;
void setup()
{
 Serial.begin(9600);
 tm.Year=2013 - 1970;
 tm.Month = 7;
 tm.Day = 30;
 tm.Hour= 19;
 tm.Minute = 57;
 tm.Second = 0;
 
//  RTC3231.write(tm);
 setSyncProvider(RTC.get);   // the function to get the time from the RTC
 if(timeStatus()!= timeSet)
    Serial.println("Unable to sync with the RTC");
 else
    Serial.println("RTC has set the system time");

}

void loop()
{
 Serial.print("Temp: ");Serial.print(RTC3231.getTemp()*1.8+32); Serial.println();
 Serial.print("Time: ");
         Serial.print(month()); Serial.print(" ");
         Serial.print(day()); Serial.print(" ");
         Serial.print(year()); Serial.print(" ");
         Serial.print(hour()); Serial.print(" ");
         Serial.print(minute()); Serial.print(" ");
         Serial.print(second()); Serial.print(" ");
         Serial.println();
 delay(1000);
}


I downloaded https://github.com/trunet/DS3231RTC to support the DS3231

The RTC time is set initially with:

RTC3231.write(tm)


Moderator edit: [code] [/code] tags added.

mmcp42

the idea is to set __DATE__ and __TIME__ just the once
then remove the code
there are only 10 types of people
them that understands binary
and them that doesn't

Go Up