33 #if (defined(__AVR__) || defined(ARDUINO_ARCH_SAM)) 34 #include <avr/pgmspace.h> 142 #ifdef ARDUINO_ARCH_AVR 164 #ifdef ARDUINO_ARCH_AVR 192 if (!
readBuffer(0x00, buffer,
sizeof(buffer))) {
193 memset(dt, 0,
sizeof(
struct tm));
198 memset(dt, 0,
sizeof(
struct tm));
201 dt->tm_sec =
bcdToDec(buffer[0] & 0x7F);
202 dt->tm_min =
bcdToDec(buffer[1] & 0x7F);
203 dt->tm_hour =
bcdToDec(buffer[2] & 0x3F);
204 dt->tm_wday =
bcdToDec(buffer[3] & 0x07);
205 dt->tm_mday =
bcdToDec(buffer[4] & 0x3F);
206 dt->tm_mon =
bcdToDec(buffer[5] & 0x1F);
207 dt->tm_year =
bcdToDec(buffer[6]) + 100;
220 if ((dt->tm_sec > 59) || (dt->tm_min > 59) || (dt->tm_hour > 23) ||
221 (dt->tm_mday < 1) || (dt->tm_mday > 31) || (dt->tm_mon > 11) || (dt->tm_year > 199) ||
253 buffer[0] =
decToBcd(dt->tm_sec) & 0x7F;
254 buffer[1] =
decToBcd(dt->tm_min) & 0x7F;
255 buffer[2] =
decToBcd(dt->tm_hour) & 0x3F;
256 buffer[3] =
decToBcd(dt->tm_wday + 1) & 0x07;
257 buffer[4] =
decToBcd(dt->tm_mday) & 0x3F;
258 buffer[5] =
decToBcd(dt->tm_mon + 1) & 0x1F;
259 buffer[6] =
decToBcd(dt->tm_year % 100);
311 if (!
readBuffer(0x00, buffer,
sizeof(buffer))) {
321 if ((*sec > 59) || (*min > 59) || (*hour > 23)) {
355 uint8_t mday, uint8_t mon, uint16_t year,
366 dt.tm_year = year - 1900;
395 uint8_t *mday, uint8_t *mon, uint16_t *year,
410 *mon = dt.tm_mon + 1;
411 *year = dt.tm_year + 1900;
445 uint8_t dayDate, uint8_t hours, uint8_t minutes, uint8_t seconds)
456 if (alarmType & 0x01) { buffer[0] |= (1 <<
DS3231_A1M1); }
457 if (alarmType & 0x02) { buffer[1] |= (1 <<
DS3231_A1M2); }
458 if (alarmType & 0x04) { buffer[2] |= (1 <<
DS3231_A1M3); }
459 if (alarmType & 0x08) { buffer[3] |= (1 <<
DS3231_A1M4); }
460 if (alarmType & 0x10) { buffer[3] |= (1 <<
DS3231_DYDT); }
505 if (alarmType & 0x02) { buffer[0] |= (1 <<
DS3231_A1M2); }
506 if (alarmType & 0x04) { buffer[1] |= (1 <<
DS3231_A1M3); }
507 if (alarmType & 0x08) { buffer[2] |= (1 <<
DS3231_A1M4); }
508 if (alarmType & 0x10) { buffer[2] |= (1 <<
DS3231_DYDT); }
549 controlReg |= (1 << (alarmId - 1));
551 controlReg &= ~(1 << (alarmId - 1));
604 statusReg &= ~(1 << (alarmId - 1));
637 controlReg |= squareWave;
691 regVal = ~(-val) + 1;
694 regVal = (uint8_t)val;
724 return regVal | ~((1 << 8) - 1);
779 *temperature = temp[0];
782 if (*temperature & 0x80) {
783 *temperature |= ~((1 << 8) - 1);
787 *fraction = (temp[1] >> 6) * 25;
801 return (uint8_t)(10 * ((bcd & 0xF0) >> 4) + (bcd & 0x0F));
813 return (uint8_t)(((dec / 10) << 4) | (dec % 10));
874 for (uint8_t i = 0; i < writeLen; i++) {
875 Wire.write(((uint8_t *)buffer)[i]);
877 if (Wire.endTransmission(
true) != 0) {
903 if (Wire.endTransmission(
false) != 0) {
907 for (uint8_t i = 0; i < readLen; i++) {
908 ((uint8_t *)buffer)[i] = (uint8_t)Wire.read();
uint8_t readRegister(uint8_t reg)
Read register.
bool getDateTime(uint8_t *hour, uint8_t *min, uint8_t *sec, uint8_t *mday, uint8_t *mon, uint16_t *year, uint8_t *wday)
Get date time.
bool alarmInterruptEnable(AlarmId alarmId, bool enable)
Enable or disable Alarm 1 or 2 interrupt.
#define DS3231_REG_AGING_OFFSET
Aging offset register.
#define DS3231_ADDR
DS3231 I2C 7-bit address.
uint8_t bcdToDec(uint8_t bcd)
BCD to decimal conversion.
#define DS3231_CTRL_BBSQW
Battery-Backed Square-Wave Enable.
#define DS3231_STAT_EN32KHZ
Enable 32kHz clock output.
time_t getEpoch()
Read Unix UTC epoch time_t.
#define DS3231_A1M3
Alarm 1 bit 7 hours register.
bool clearAlarmFlag(AlarmId alarmId)
Clear alarm flag.
#define DS3231_REG_ALARM2_MIN
Alarm 2 seconds register.
bool setAlarm1(Alarm1Type alarmType, uint8_t dayDate, uint8_t hours, uint8_t minutes, uint8_t seconds)
Set Alarm 1.
bool startTemperatureConversion()
Start temperature conversion.
bool setAgingOffset(int8_t val)
Set aging offset register.
#define DS3231_CTRL_EOSC
Enable oscillator.
Alarm2Type
Alarm 2 types enum.
bool readBuffer(uint8_t reg, void *buffer, uint8_t len)
Read buffer from RTC.
bool setDateTime(uint8_t hour, uint8_t min, uint8_t sec, uint8_t mday, uint8_t mon, uint16_t year, uint8_t wday)
Set date time.
bool write(const struct tm *dt)
Write date and time to RTC.
#define DS3231_CTRL_INTCN
Interrupt control.
bool writeRegister(uint8_t reg, uint8_t value)
Write register.
#define DS3231_REG_CONTROL
Control register.
#define DS3231_A1M4
Alarm 1 bit 7 day/date register.
bool read(struct tm *dt)
Read date and time from RTC.
uint8_t decToBcd(uint8_t dec)
Decimal to BCD conversion.
bool getTime(uint8_t *hour, uint8_t *min, uint8_t *sec)
Read time from RTC.
#define DS3231_CTRL_RS1
Square wave rate-select 1.
#define DS3231_CTRL_RS2
Square wave rate-select 2.
DS3231 high precision RTC library for Arduino.
bool clockEnable(bool enable=true)
Enable or disable oscillator when running on V-BAT.
bool setTime(uint8_t hour, uint8_t min, uint8_t sec)
Write time to RTC.
Alarm1Type
Alarm 1 types enum.
#define DS3231_STAT_BSY
Temperature conversion busy flag.
bool setEpoch(time_t t)
Write Unix epoch UTC time to RTC.
#define DS3231_REG_ALARM1_SEC
Alarm 1 seconds register.
#define DS3231_CTRL_CONV
Start temperature conversion.
bool getTemperature(int8_t *temperature, uint8_t *fraction)
Read temperature.
#define DS3231_STAT_OSF
Oscillator Stop Flag.
bool getAlarmFlag(AlarmId alarmId)
Get Alarm 1 or 2 flag.
bool begin()
Initialize and detect DS3231 RTC.
#define DS3231_REG_STATUS
Status register.
bool isRunning()
Read RTC OSF (Oscillator Stop Flag) from status register.
#define DS3231_A1M2
Alarm 1 bit 7 minutes register.
bool setAlarm2(Alarm2Type alarmType, uint8_t dayDate, uint8_t hours, uint8_t minutes)
Set Alarm 2.
bool writeBuffer(uint8_t reg, void *buffer, uint8_t len)
Write buffer to RTC.
bool setSquareWave(SquareWave squareWave)
Configure SQW (Square Wave) output pin.
SquareWave
Squarewave enum.
#define DS3231_A1M1
Alarm 1 bit 7 seconds register.
int8_t getAgingOffset()
Get aging offset register.
#define DS3231_REG_TEMP_MSB
Temperature MSB register.
#define DS3231_DYDT
Alarm 2 bit 6.
bool outputClockPinEnable(bool enable)
Enable or disable 32kHz output clock pin.