/*----------------------------------------------------------------------* * DS3232RTC.h - Arduino library for the Maxim Integrated DS3232 * * Real-Time Clock. This library is intended for use with the Arduino * * Time.h library, http://www.arduino.cc/playground/Code/Time * * * * This library is a drop-in replacement for the DS1307RTC.h library * * by Michael Margolis that is supplied with the Arduino Time library * * above. To change from using a DS1307 RTC to an DS3232 RTC, it is * * only necessary to change the #include statement to include this * * library instead of DS1307RTC.h. * * * * This library is *not* a drop-in replacement for the newer version * * of the DS1307RTC library at * * http://www.pjrc.com/teensy/td_libs_DS1307RTC.html * * * * In addition, this library implements functions to support the * * additional features of the DS3232. * * * * This library will also work with the DS3231 RTC, which has the same * * features of the DS3232 except: (1) Battery-backed SRAM, (2) Battery- * * backed 32kHz output (BB32kHz bit in Control/Status register 0x0F), * * and (3) Adjustable temperature sensor sample rate (CRATE1:0 bits in * * the Control/Status register). * * * * Whether used with the DS3232 or DS3231, the user is responsible for * * ensuring reads and writes do not exceed the device's address space * * (0x00-0x12 for DS3231, 0x00-0xFF for DS3232); no bounds checking * * is done by this library. * * * * Jack Christensen 06Mar2013 * * http://github.com/JChristensen/DS3232RTC * * * * CC BY-SA 4.0 * * "Arduino DS3232RTC Library" by Jack Christensen is licensed under * * CC BY-SA 4.0, http://creativecommons.org/licenses/by-sa/4.0/ * *----------------------------------------------------------------------*/ #ifndef DS3232RTC_h #define DS3232RTC_h #include #if defined(ARDUINO) && ARDUINO >= 100 #include #else #include #endif //DS3232 I2C Address #define RTC_ADDR 0x68 //DS3232 Register Addresses #define RTC_SECONDS 0x00 #define RTC_MINUTES 0x01 #define RTC_HOURS 0x02 #define RTC_DAY 0x03 #define RTC_DATE 0x04 #define RTC_MONTH 0x05 #define RTC_YEAR 0x06 #define ALM1_SECONDS 0x07 #define ALM1_MINUTES 0x08 #define ALM1_HOURS 0x09 #define ALM1_DAYDATE 0x0A #define ALM2_MINUTES 0x0B #define ALM2_HOURS 0x0C #define ALM2_DAYDATE 0x0D #define RTC_CONTROL 0x0E #define RTC_STATUS 0x0F #define RTC_AGING 0x10 #define TEMP_MSB 0x11 #define TEMP_LSB 0x12 #define SRAM_START_ADDR 0x14 //first SRAM address #define SRAM_SIZE 236 //number of bytes of SRAM //Alarm mask bits #define A1M1 7 #define A1M2 7 #define A1M3 7 #define A1M4 7 #define A2M2 7 #define A2M3 7 #define A2M4 7 //Control register bits #define EOSC 7 #define BBSQW 6 #define CONV 5 #define RS2 4 #define RS1 3 #define INTCN 2 #define A2IE 1 #define A1IE 0 //Status register bits #define OSF 7 #define BB32KHZ 6 #define CRATE1 5 #define CRATE0 4 #define EN32KHZ 3 #define BSY 2 #define A2F 1 #define A1F 0 //Square-wave output frequency (TS2, RS1 bits) enum SQWAVE_FREQS_t {SQWAVE_1_HZ, SQWAVE_1024_HZ, SQWAVE_4096_HZ, SQWAVE_8192_HZ, SQWAVE_NONE}; //Alarm masks enum ALARM_TYPES_t { ALM1_EVERY_SECOND = 0x0F, ALM1_MATCH_SECONDS = 0x0E, ALM1_MATCH_MINUTES = 0x0C, //match minutes *and* seconds ALM1_MATCH_HOURS = 0x08, //match hours *and* minutes, seconds ALM1_MATCH_DATE = 0x00, //match date *and* hours, minutes, seconds ALM1_MATCH_DAY = 0x10, //match day *and* hours, minutes, seconds ALM2_EVERY_MINUTE = 0x8E, ALM2_MATCH_MINUTES = 0x8C, //match minutes ALM2_MATCH_HOURS = 0x88, //match hours *and* minutes ALM2_MATCH_DATE = 0x80, //match date *and* hours, minutes ALM2_MATCH_DAY = 0x90, //match day *and* hours, minutes }; #define ALARM_1 1 //constants for calling functions #define ALARM_2 2 //Other #define DS1307_CH 7 //for DS1307 compatibility, Clock Halt bit in Seconds register #define HR1224 6 //Hours register 12 or 24 hour mode (24 hour mode==0) #define CENTURY 7 //Century bit in Month register #define DYDT 6 //Day/Date flag bit in alarm Day/Date registers class DS3232RTC { public: DS3232RTC(); static time_t get(void); //must be static to work with setSyncProvider() in the Time library byte set(time_t t); static byte read(tmElements_t &tm); byte write(tmElements_t &tm); byte writeRTC(byte addr, byte *values, byte nBytes); byte writeRTC(byte addr, byte value); byte readRTC(byte addr, byte *values, byte nBytes); byte readRTC(byte addr); void setAlarm(ALARM_TYPES_t alarmType, byte seconds, byte minutes, byte hours, byte daydate); void setAlarm(ALARM_TYPES_t alarmType, byte minutes, byte hours, byte daydate); void alarmInterrupt(byte alarmNumber, bool alarmEnabled); bool alarm(byte alarmNumber); void squareWave(SQWAVE_FREQS_t freq); bool oscStopped(bool clearOSF = true); //defaults to clear the OSF bit if argument not supplied int temperature(void); private: uint8_t dec2bcd(uint8_t n); static uint8_t bcd2dec(uint8_t n); }; extern DS3232RTC RTC; #endif