PeterPan321:
I'm starting to work with one of the DS3231 RTC modules, and am using Eric Ayars' library.
It would help if you would provide a link, in case there is more than one version of that library floating around, or more than one library by that author.
Is this what you are using? http://physics.csuchico.edu/~eayars/code/DS3231.zip
Everything works, but I'd like to confirm a couple of things. First, I was concerned about problems with rollover, for instance if you read hours, and then read minutes at the moment an hour increments.
The solution is not to do it piecemeal.
Second question is probably a stupid one, but when my project starts up I'd like take alternative action if for some reason the RTC was not responding. What's the best way to just test the chip, and know if there's an I2C timeout or error?
Here is some of my old code I dug up. I believe it deals correctly with both issues you bring up.
#include <Wire.h>
byte ss=0, mi=0, hh=0, wd=6, dd=1, mo=1, yy=0;
void setup()
{
Wire.begin();
Serial.begin(9600);
// clear /EOSC bit
// Sometimes necessary to ensure that the clock
// keeps running on just battery power. Once set,
// it shouldn't need to be reset but it's a good
// idea to make sure.
// Wire.beginTransmission(0x68); // address DS3231
// Wire.write(0x0E); // select register
// Wire.write(0b00011100); // write register bitmap, bit 7 is /EOSC
// Wire.endTransmission();
}
void loop()
{
// ask RTC for the time
// send request to receive data starting at register 0
Wire.beginTransmission(0x68); // 0x68 is DS3231 device address
Wire.write((byte)0); // start at register 0
Wire.endTransmission();
Wire.requestFrom(0x68, 7); // request seven bytes (ss, mi, hh, wd, dd, mo, yy)
// check for a reply from the RTC, and use it if we can
if (Wire.available() >= 7) {
// if we're here, we got a reply and it is long enough
// so now we read the time
ss = bcd2bin(Wire.read()); // get seconds
mi = bcd2bin(Wire.read()); // get minutes
hh = bcd2bin(Wire.read()); // get hours
wd = bcd2bin(Wire.read());
dd = bcd2bin(Wire.read());
mo = bcd2bin(Wire.read());
yy = bcd2bin(Wire.read());
// show that we successfully got the time
Serial.print("Got the time: ");
printTime();
}
else {
// if we're here, that means we were unable to read the time
Serial.println("Unable to read time from RTC");
}
delay(500);
}
byte bcd2bin(byte x) {
// converts from binary-coded decimal to a "regular" binary number
return ((((x >> 4) & 0xF) * 10) + (x & 0xF)) ;
}
void printTime() {
// just like it says on the tin
Serial.print ("\'");
if (yy<10) Serial.print("0"); Serial.print(yy,DEC); Serial.print("-");
if (mo<10) Serial.print("0"); Serial.print(mo,DEC); Serial.print("-");
if (dd<10) Serial.print("0"); Serial.print(dd,DEC); Serial.print("(");
switch (wd) {
case 1: Serial.print("Mon"); break;
case 2: Serial.print("Tue"); break;
case 3: Serial.print("Wed"); break;
case 4: Serial.print("Thu"); break;
case 5: Serial.print("Fri"); break;
case 6: Serial.print("Sat"); break;
case 7: Serial.print("Sun"); break;
default: Serial.print("Bad");
}
Serial.print(") ");
if (hh<10) Serial.print("0"); Serial.print(hh,DEC); Serial.print(":");
if (mi<10) Serial.print("0"); Serial.print(mi,DEC); Serial.print(":");
if (ss<10) Serial.print("0"); Serial.print(ss,DEC); Serial.println("");
}