Pages: [1]   Go Down
Author Topic: Set RTC to compile time, but RTC not retaining time after power cycle.  (Read 1513 times)
0 Members and 1 Guest are viewing this topic.
Illinois, USA
Offline Offline
Full Member
***
Karma: 0
Posts: 114
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
// 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
« Last Edit: July 31, 2013, 07:16:13 pm by Ashton » Logged

Atlanta, USA
Offline Offline
Edison Member
*
Karma: 53
Posts: 1774
AKA: Ray Burne
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Illinois, USA
Offline Offline
Full Member
***
Karma: 0
Posts: 114
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: July 31, 2013, 07:50:07 pm by Ashton » Logged

Leeds, England
Offline Offline
God Member
*****
Karma: 14
Posts: 587
Quick, chuck it in the bin before the boss finds out...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
if (! RTC.isrunning())

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

Take a look at the data sheet.
Logged

Beginners guide to using the Seeedstudio SIM900 GPRS/GSM Shield

Illinois, USA
Offline Offline
Full Member
***
Karma: 0
Posts: 114
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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.
Logged

Atlanta, USA
Offline Offline
Edison Member
*
Karma: 53
Posts: 1774
AKA: Ray Burne
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Linus/Unix issue?
http://forum.arduino.cc/index.php?topic=179213.msg1334184#msg1334184
Logged

Offline Offline
Full Member
***
Karma: 5
Posts: 219
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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.
« Last Edit: July 31, 2013, 11:22:03 pm by Coding Badly » Logged

Leighton Buzzard, UK
Offline Offline
Edison Member
*
Karma: 21
Posts: 1339
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

the idea is to set __DATE__ and __TIME__ just the once
then remove the code
Logged

there are only 10 types of people
them that understands binary
and them that doesn't

Pages: [1]   Go Up
Jump to: