9 #include <avr/pgmspace.h> 13 #define DS1307_ADDRESS 0x68 15 #define PCF8563_ADDRESS 0x51 16 #define PCF8563_SEC_ADDR 0x02 24 #define DS3231_ADDRESS 0x68 //I2C Slave address 27 #define DS3231_SEC_REG 0x00 28 #define DS3231_MIN_REG 0x01 29 #define DS3231_HOUR_REG 0x02 30 #define DS3231_WDAY_REG 0x03 31 #define DS3231_MDAY_REG 0x04 32 #define DS3231_MONTH_REG 0x05 33 #define DS3231_YEAR_REG 0x06 35 #define DS3231_AL1SEC_REG 0x07 36 #define DS3231_AL1MIN_REG 0x08 37 #define DS3231_AL1HOUR_REG 0x09 38 #define DS3231_AL1WDAY_REG 0x0A 40 #define DS3231_AL2MIN_REG 0x0B 41 #define DS3231_AL2HOUR_REG 0x0C 42 #define DS3231_AL2WDAY_REG 0x0D 44 #define DS3231_CONTROL_REG 0x0E 45 #define DS3231_STATUS_REG 0x0F 46 #define DS3231_AGING_OFFSET_REG 0x0F 47 #define DS3231_TMP_UP_REG 0x11 48 #define DS3231_TMP_LOW_REG 0x12 51 #define PERIODIC_INTERRUPT 0x00 52 #define HM_INTERRUPT 0x01 54 #define RX8025_ADDRESS 0x32 //I2C Slave address 57 #define RX8025_SEC_REG 0x00 58 #define RX8025_MIN_REG 0x10 59 #define RX8025_HOUR_REG 0x20 60 #define RX8025_WDAY_REG 0x30 61 #define RX8025_MDAY_REG 0x40 62 #define RX8025_MONTH_REG 0x50 63 #define RX8025_YEAR_REG 0x60 64 #define RX8025_DIGOFF_REG 0x70 65 #define RX8025_ALWMIN_REG 0x80 66 #define RX8025_ALWHOUR_REG 0x90 67 #define RX8025_ALWWDAY_REG 0xA0 68 #define RX8025_ALDMIN_REG 0xB0 69 #define RX8025_ALDHOUR_REG 0xC0 70 #define RX8025_RESERVED_REG 0xD0 71 #define RX8025_CTRL1_REG 0xE0 72 #define RX8025_CTRL2_REG 0xF0 74 #define RX8025_CTRL1_CT_BIT (7 << 0) 77 #define RX8025_CTRL1_CT_PER_OFF 0 78 #define RX8025_CTRL1_CT_PER_SEC 4 79 #define RX8025_CTRL1_CT_PER_MIN 5 80 #define RX8025_CTRL1_CT_PER_HOUR 6 81 #define RX8025_CTRL1_CT_PER_MONTH 7 86 #define RX8025_CTRL1_TEST_BIT (1 << 3) 87 #define RX8025_CTRL1_1224_BIT (1 << 5) 88 #define RX8025_CTRL1_DALE_BIT (1 << 6) 89 #define RX8025_CTRL1_WALE_BIT (1 << 7) 91 #define RX8025_CTRL2_DAFG_BIT (1 << 0) 92 #define RX8025_CTRL2_WAFG_BIT (1 << 1) 93 #define RX8025_CTRL2_CTFG_BIT (1 << 2) 94 #define RX8025_CTRL2_CLEN1_BIT (1 << 3) 95 #define RX8025_CTRL2_PON_BIT (1 << 4) 96 #define RX8025_CTRL2_XST_BIT (1 << 5) 97 #define RX8025_CTRL2_VDET_BIT (1 << 6) 98 #define RX8025_CTRL2_VDSL_BIT (1 << 7) 106 #define DS1337_DATE 4 110 #define DS1337_BASE_YR 2000 112 #define DS1337_CTRL_ID B1101000 115 #define DS1337_CLOCKHALT B10000000 117 #define DS1337_LO_BCD B00001111 118 #define DS1337_HI_BCD B11110000 120 #define DS1337_HI_SEC B01110000 121 #define DS1337_HI_MIN B01110000 122 #define DS1337_HI_HR B00110000 123 #define DS1337_LO_DOW B00000111 124 #define DS1337_HI_DATE B00110000 125 #define DS1337_HI_MTH B00110000 126 #define DS1337_HI_YR B11110000 128 #define DS1337_ARLM1 0x07 129 #define DS1337_ARLM1_LO_SEC B00001111 130 #define DS1337_ARLM1_HI_SEC B01110000 131 #define DS1337_ARLM1_LO_MIN B01110000 132 #define DS1337_ARLM1_HI_MIN B00001111 134 #define DS1337_SP 0x0E 135 #define DS1337_SP_EOSC B10000000 136 #define DS1337_SP_RS2 B00010000 137 #define DS1337_SP_RS1 B00001000 138 #define DS1337_SP_INTCN B00000100 139 #define DS1337_SP_A2IE B00000010 140 #define DS1337_SP_A1IE B00000001 142 #define DS1337_STATUS 0x0F 143 #define DS1337_STATUS_OSF B10000000 144 #define DS1337_STATUS_A2F B00000010 145 #define DS1337_STATUS_A1F B00000001 157 #define DS1337_EVERY_SECOND B00010111 158 #define DS1337_EVERY_MINUTE B00010110 159 #define DS1337_EVERY_HOUR B00010100 160 #define DS1337_EVERY_DAY B00010000 161 #define DS1337_EVERY_WEEK B00001000 162 #define DS1337_EVERY_MONTH B00000000 168 static uint8_t bcd2bin (uint8_t val) {
return val - 6 * (val >> 4); }
169 static uint8_t bin2bcd (uint8_t val) {
return val + 6 * (val / 10); }
175 void RTC_DS1307::adjust(
const DateTime& dt) {
176 Wire.beginTransmission(DS1307_ADDRESS);
177 Wire.write((byte) 0);
178 Wire.write(bin2bcd(dt.second()));
179 Wire.write(bin2bcd(dt.minute()));
180 Wire.write(bin2bcd(dt.hour()));
181 Wire.write(bin2bcd(0));
182 Wire.write(bin2bcd(dt.day()));
183 Wire.write(bin2bcd(dt.month()));
184 Wire.write(bin2bcd(dt.year() - 2000));
185 Wire.write((byte) 0);
186 Wire.endTransmission();
190 Wire.beginTransmission(DS1307_ADDRESS);
191 Wire.write((byte) 0);
192 Wire.endTransmission();
194 Wire.requestFrom(DS1307_ADDRESS, 7);
195 uint8_t ss = bcd2bin(Wire.read());
196 uint8_t mm = bcd2bin(Wire.read());
197 uint8_t hh = bcd2bin(Wire.read());
199 uint8_t d = bcd2bin(Wire.read());
200 uint8_t m = bcd2bin(Wire.read());
201 uint16_t y = bcd2bin(Wire.read()) + 2000;
203 return DateTime (y, m, d, hh, mm, ss);
210 void RTC_PCF8563::adjust(
const DateTime& dt) {
211 Wire.beginTransmission(PCF8563_ADDRESS);
212 Wire.write((byte) 0);
213 Wire.write((byte) 0x0);
214 Wire.write((byte) 0x0);
215 Wire.write(bin2bcd(dt.second()));
216 Wire.write(bin2bcd(dt.minute()));
217 Wire.write(bin2bcd(dt.hour()));
218 Wire.write(bin2bcd(dt.day()));
219 Wire.write((byte) 0x01);
220 Wire.write(bin2bcd(dt.month()));
221 Wire.write(bin2bcd(dt.year() - 2000));
222 Wire.write((byte) 0x80);
223 Wire.write((byte) 0x80);
224 Wire.write((byte) 0x80);
225 Wire.write((byte) 0x80);
226 Wire.write((byte) 0x0);
227 Wire.write((byte) 0x0);
228 Wire.endTransmission();
232 Wire.beginTransmission(PCF8563_ADDRESS);
233 Wire.write(PCF8563_SEC_ADDR);
234 Wire.endTransmission();
236 Wire.requestFrom(PCF8563_ADDRESS, 7);
237 uint8_t ss = bcd2bin(Wire.read() & 0x7F);
238 uint8_t mm = bcd2bin(Wire.read() & 0x7F);
239 uint8_t hh = bcd2bin(Wire.read() & 0x3F);
240 uint8_t d = bcd2bin(Wire.read() & 0x3F);
242 uint8_t m = bcd2bin(Wire.read()& 0x1F);
243 uint16_t y = bcd2bin(Wire.read()) + 2000;
245 return DateTime (y, m, d, hh, mm, ss);
251 void RTC_Timer2::adjust(
const DateTime& dt) {
259 unsigned long s=_seconds;
267 long RTC_Millis::offset = 0;
269 void RTC_Millis::adjust(
const DateTime& dt) {
270 offset = dt.get() - millis() / 1000;
274 return offset + millis() / 1000;
280 void R8025::begin(
void) {
281 unsigned char ctReg1=0, ctReg2=0;
282 Wire.beginTransmission(RX8025_ADDRESS);
283 Wire.write((byte)RX8025_CTRL1_REG);
285 ctReg1 |= RX8025_CTRL1_1224_BIT;
286 Wire.write((byte)ctReg1);
288 Wire.write((byte)(RX8025_CTRL2_VDSL_BIT | RX8025_CTRL2_XST_BIT ));
289 Wire.endTransmission();
296 void R8025::adjust(
const DateTime& dt) {
298 Wire.beginTransmission(RX8025_ADDRESS);
299 Wire.write((byte)RX8025_SEC_REG);
301 Wire.write(bin2bcd(dt.second()));
302 Wire.write(bin2bcd(dt.minute()));
303 Wire.write(bin2bcd(dt.hour()));
304 Wire.write(dt.dayOfWeek());
305 Wire.write(bin2bcd(dt.day()));
306 Wire.write(bin2bcd(dt.month()));
307 Wire.write(bin2bcd(dt.year() - 2000));
309 Wire.endTransmission();
315 Wire.beginTransmission(RX8025_ADDRESS);
316 Wire.write((byte)0x00);
317 Wire.endTransmission();
319 Wire.requestFrom(RX8025_ADDRESS, 8);
322 uint8_t ss = bcd2bin(Wire.read());
323 uint8_t mm = bcd2bin(Wire.read());
324 uint8_t hh = bcd2bin(Wire.read());
325 uint8_t wd = Wire.read();
326 uint8_t d = bcd2bin(Wire.read());
327 uint8_t m = bcd2bin(Wire.read());
328 uint16_t y = bcd2bin(Wire.read()) + 2000;
330 return DateTime (y, m, d, hh, mm, ss);
336 void R8025::enableINTA_Interrupts(uint8_t periodicity)
338 intType=PERIODIC_INTERRUPT;
339 intPeriodicity=periodicity;
341 uint8_t ctReg1= periodicity + 4;
353 ctReg1 |= RX8025_CTRL1_1224_BIT ;
354 Wire.beginTransmission(RX8025_ADDRESS);
355 Wire.write(RX8025_CTRL1_REG);
357 Wire.endTransmission();
361 Wire.beginTransmission(RX8025_ADDRESS);
362 uint8_t ctReg2 = RX8025_CTRL2_XST_BIT | RX8025_CTRL2_VDSL_BIT;
363 Wire.write(RX8025_CTRL2_REG);
365 Wire.endTransmission();
371 void R8025::enableINTA_Interrupts(uint8_t hh24, uint8_t mm)
374 intType=HM_INTERRUPT;
378 Wire.beginTransmission(RX8025_ADDRESS);
379 Wire.write(RX8025_CTRL1_REG);
381 Wire.write(RX8025_CTRL1_1224_BIT);
382 Wire.endTransmission();
384 Wire.beginTransmission(RX8025_ADDRESS);
385 Wire.write(RX8025_ALDMIN_REG);
386 Wire.write(bin2bcd(mm));
387 Wire.write(bin2bcd(hh24));
388 Wire.endTransmission();
390 Wire.beginTransmission(RX8025_ADDRESS);
391 Wire.write(RX8025_CTRL2_REG);
393 Wire.write(RX8025_CTRL2_VDSL_BIT | RX8025_CTRL2_XST_BIT );
394 Wire.endTransmission();
396 Wire.beginTransmission(RX8025_ADDRESS);
397 Wire.write(RX8025_CTRL1_REG);
399 Wire.write(RX8025_CTRL1_1224_BIT | RX8025_CTRL1_DALE_BIT);
400 Wire.endTransmission();
405 void R8025::disableINTA_Interrupts()
411 void R8025::refreshINTA()
414 if(intType==PERIODIC_INTERRUPT)
418 enableINTA_Interrupts(intPeriodicity);
421 else if(intType==HM_INTERRUPT)
423 enableINTA_Interrupts(intHH24, intMM);
429 void R8025::changeOffset(uint8_t digitalOffset)
432 Wire.beginTransmission(RX8025_DIGOFF_REG);
433 Wire.write((digitalOffset & 0x7F));
434 Wire.endTransmission();
438 uint8_t DS3231::readRegister(uint8_t regaddress)
440 Wire.beginTransmission(DS3231_ADDRESS);
441 Wire.write(regaddress);
442 Wire.endTransmission();
444 Wire.requestFrom(DS3231_ADDRESS, 1);
448 void DS3231::writeRegister(uint8_t regaddress,uint8_t value)
450 Wire.beginTransmission(DS3231_ADDRESS);
451 Wire.write(regaddress);
453 Wire.endTransmission();
456 void DS3231::begin(
void) {
458 unsigned char ctReg=0;
460 writeRegister(DS3231_CONTROL_REG, ctReg);
464 uint8_t hrReg = readRegister(DS3231_HOUR_REG);
466 writeRegister(DS3231_HOUR_REG, hrReg);
473 void DS3231::adjust(
const DateTime& dt) {
475 Wire.beginTransmission(DS3231_ADDRESS);
476 Wire.write((byte)DS3231_SEC_REG);
478 Wire.write(bin2bcd(dt.second()));
479 Wire.write(bin2bcd(dt.minute()));
480 Wire.write(bin2bcd((dt.hour()) & 0b10111111));
481 Wire.write(dt.dayOfWeek());
482 Wire.write(bin2bcd(dt.day()));
483 Wire.write(bin2bcd(dt.month()));
484 Wire.write(bin2bcd(dt.year() - 2000));
485 Wire.endTransmission();
491 Wire.beginTransmission(DS3231_ADDRESS);
492 Wire.write((byte)0x00);
493 Wire.endTransmission();
495 Wire.requestFrom(DS3231_ADDRESS, 8);
496 uint8_t ss = bcd2bin(Wire.read());
497 uint8_t mm = bcd2bin(Wire.read());
499 uint8_t hrreg = Wire.read();
500 uint8_t hh = bcd2bin((hrreg & ~0b11000000));
502 uint8_t wd = Wire.read();
503 uint8_t d = bcd2bin(Wire.read());
504 uint8_t m = bcd2bin(Wire.read());
505 uint16_t y = bcd2bin(Wire.read()) + 2000;
507 return DateTime (y, m, d, hh, mm, ss);
512 void DS3231::enableInterrupts(uint8_t periodicity)
515 unsigned char ctReg=0;
517 writeRegister(DS3231_CONTROL_REG, ctReg);
522 writeRegister(DS3231_AL1SEC_REG, 0b10000000 );
523 writeRegister(DS3231_AL1MIN_REG, 0b10000000 );
524 writeRegister(DS3231_AL1HOUR_REG, 0b10000000 );
525 writeRegister(DS3231_AL1WDAY_REG, 0b10000000 );
530 writeRegister(DS3231_AL1SEC_REG, 0b00000000 );
531 writeRegister(DS3231_AL1MIN_REG, 0b10000000 );
532 writeRegister(DS3231_AL1HOUR_REG, 0b10000000 );
533 writeRegister(DS3231_AL1WDAY_REG, 0b10000000 );
538 writeRegister(DS3231_AL1SEC_REG, 0b00000000 );
539 writeRegister(DS3231_AL1MIN_REG, 0b00000000 );
540 writeRegister(DS3231_AL1HOUR_REG, 0b10000000 );
541 writeRegister(DS3231_AL1WDAY_REG, 0b10000000 );
548 void DS3231::enableInterrupts(uint8_t hh24, uint8_t mm, uint8_t ss)
550 unsigned char ctReg=0;
552 writeRegister(DS3231_CONTROL_REG, ctReg);
554 writeRegister(DS3231_AL1SEC_REG, 0b00000000 | bin2bcd(ss) );
555 writeRegister(DS3231_AL1MIN_REG, 0b00000000 | bin2bcd(mm));
556 writeRegister(DS3231_AL1HOUR_REG, (0b00000000 | (bin2bcd(hh24) & 0b10111111)));
557 writeRegister(DS3231_AL1WDAY_REG, 0b10000000 );
561 void DS3231::disableInterrupts()
568 void DS3231::clearINTStatus()
571 uint8_t statusReg = readRegister(DS3231_STATUS_REG);
572 statusReg &= 0b11111110;
573 writeRegister(DS3231_STATUS_REG, statusReg);
578 void DS3231::convertTemperature()
581 uint8_t ctReg = readRegister(DS3231_CONTROL_REG);
583 writeRegister(DS3231_CONTROL_REG,ctReg);
590 }
while ((readRegister(DS3231_CONTROL_REG) & 0b00100000) == 0b00100000 );
595 float DS3231::getTemperature()
597 int temperatureCelsius;
598 float fTemperatureCelsius;
599 uint8_t tUBYTE = readRegister(DS3231_TMP_UP_REG);
600 uint8_t tLRBYTE = readRegister(DS3231_TMP_LOW_REG);
602 if(tUBYTE & 0b10000000)
604 tUBYTE ^= 0b11111111;
606 fTemperatureCelsius = tUBYTE + ((tLRBYTE >> 6) * 0.25);
607 fTemperatureCelsius = fTemperatureCelsius * -1;
611 fTemperatureCelsius = tUBYTE + ((tLRBYTE >> 6) * 0.25);
614 return (fTemperatureCelsius);
623 const unsigned int monthdays[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
627 void DS1337::readTime(
void)
631 Wire.beginTransmission(DS1337_CTRL_ID);
632 Wire.write((uint8_t)0x00);
633 Wire.endTransmission();
636 Wire.requestFrom(DS1337_CTRL_ID, 7);
637 for(
int i=0; i<7; i++)
640 if (Wire.available())
641 rtc_bcd[i]=Wire.read();
646 void DS1337::readAlarm(
void)
652 Wire.beginTransmission(DS1337_CTRL_ID);
653 Wire.write((uint8_t)DS1337_ARLM1);
654 Wire.endTransmission();
658 Wire.requestFrom(DS1337_CTRL_ID, 4);
659 for(
int i=0; i<4; i++)
662 if (Wire.available())
665 rtc_bcd[i] = temp & B01111111;
671 if(rtc_bcd[3] & B01000000)
673 rtc_bcd[3] &= B10111111;
678 rtc_bcd[4] = rtc_bcd[3];
685 void DS1337::writeTime(
void)
687 Wire.beginTransmission(DS1337_CTRL_ID);
688 Wire.write((uint8_t)0x00);
689 for(
int i=0; i<7; i++)
691 Wire.write(rtc_bcd[i]);
693 Wire.endTransmission();
696 setRegister(DS1337_STATUS, getRegister(DS1337_STATUS) & !DS1337_STATUS_OSF);
704 void DS1337::writeAlarm(
void)
706 Wire.beginTransmission(DS1337_CTRL_ID);
707 Wire.write((uint8_t)DS1337_ARLM1);
709 Wire.write(rtc_bcd[DS1337_SEC] | ((alarm_repeat & B00000001 ) << 7));
710 Wire.write(rtc_bcd[DS1337_MIN] | ((alarm_repeat & B00000010 ) << 6));
711 Wire.write(rtc_bcd[DS1337_HR] | ((alarm_repeat & B00000100 ) << 5));
714 if(alarm_repeat & B00001000)
717 Wire.write(rtc_bcd[DS1337_DOW] | ((alarm_repeat & B00011000 ) << 3));
722 Wire.write(rtc_bcd[DS1337_DATE] | ((alarm_repeat & B00011000 ) << 3));
725 Wire.endTransmission();
729 void DS1337::writeAlarm(
unsigned long sse)
731 epoch_seconds_to_date(sse);
736 void DS1337::setAlarmRepeat(byte repeat)
738 alarm_repeat = repeat;
742 unsigned char DS1337::getRegister(
unsigned char registerNumber)
744 Wire.beginTransmission(DS1337_CTRL_ID);
745 Wire.write(registerNumber);
746 Wire.endTransmission();
748 Wire.requestFrom(DS1337_CTRL_ID, 1);
753 void DS1337::setRegister(
unsigned char registerNumber,
unsigned char value)
755 Wire.beginTransmission(DS1337_CTRL_ID);
756 Wire.write(registerNumber);
760 Wire.endTransmission();
763 unsigned char DS1337::time_is_set()
766 byte asdf = ((getRegister(DS1337_STATUS) & DS1337_STATUS_OSF) == 0);
769 unsigned char DS1337::alarm_is_set()
772 byte asdf = (getRegister(DS1337_SP) & DS1337_SP_A1IE);
776 void DS1337::enable_interrupt()
779 setRegister(DS1337_SP, getRegister(DS1337_SP) | DS1337_SP_INTCN | DS1337_SP_A1IE);
782 void DS1337::disable_interrupt()
784 setRegister(DS1337_SP, getRegister(DS1337_SP) & !DS1337_SP_A1IE);
787 void DS1337::clear_interrupt()
789 setRegister(DS1337_STATUS, getRegister(DS1337_STATUS) & !DS1337_STATUS_A1F);
792 unsigned char DS1337::getSeconds()
794 return bcd2bin(rtc_bcd[DS1337_SEC]);
797 unsigned char DS1337::getMinutes()
799 return bcd2bin(rtc_bcd[DS1337_MIN]);
801 unsigned char DS1337::getHours()
803 return bcd2bin(rtc_bcd[DS1337_HR]);
805 unsigned char DS1337::getDays()
807 return bcd2bin(rtc_bcd[DS1337_DATE]);
809 unsigned char DS1337::getDayOfWeek()
811 return bcd2bin(rtc_bcd[DS1337_DOW]);
813 unsigned char DS1337::getMonths()
815 return bcd2bin(rtc_bcd[DS1337_MTH]);
817 unsigned int DS1337::getYears()
819 return 2000 + bcd2bin(rtc_bcd[DS1337_YR]);
824 void DS1337::setSeconds(
unsigned char v)
826 rtc_bcd[DS1337_SEC] = bin2bcd(v);
829 void DS1337::setMinutes(
unsigned char v)
831 rtc_bcd[DS1337_MIN] = bin2bcd(v);
834 void DS1337::setHours(
unsigned char v)
836 rtc_bcd[DS1337_HR] = bin2bcd(v);
839 void DS1337::setDays(
unsigned char v)
841 rtc_bcd[DS1337_DATE] = bin2bcd(v);
844 void DS1337::setDayOfWeek(
unsigned char v)
846 rtc_bcd[DS1337_DOW] = bin2bcd(v);
849 void DS1337::setMonths(
unsigned char v)
851 rtc_bcd[DS1337_MTH] = bin2bcd(v);
854 void DS1337::setYears(
unsigned int v)
860 rtc_bcd[DS1337_YR] = bin2bcd(v);
864 byte DS1337::bcd2bin(byte v)
866 return (v&0x0F) + ((v>>4)*10);
869 byte DS1337::bin2bcd(byte v)
871 return ((v / 10)<<4) + (v % 10);
874 void DS1337::stop(
void)
876 setRegister(DS1337_SP, getRegister(DS1337_SP) | DS1337_SP_EOSC);
879 void DS1337::start(
void)
881 setRegister(DS1337_SP, getRegister(DS1337_SP) & !DS1337_SP_EOSC);
884 void DS1337::begin(
void){
887 void DS1337::adjust(
const DateTime& dt){
888 setSeconds(dt.second());
889 setMinutes(dt.minute());
892 setMonths(dt.month());
899 return DateTime (getYears(), getMonths(), getDays(), getHours(), getMinutes(), getSeconds());
903 void DS1337::epoch_seconds_to_date(
unsigned long seconds_left)
925 unsigned long seconds_left_2;
930 unsigned long leap_year_periods;
931 unsigned long days_since_current_lyear;
933 unsigned long days_since_first_of_year;
934 unsigned long days_to_month;
937 if(seconds_left >= 946684800)
939 seconds_left -= 946684800;
941 seconds_left_2 = seconds_left / 60;
942 rtc_bcd[DS1337_SEC] = bin2bcd(seconds_left - (60 * seconds_left_2));
944 seconds_left = seconds_left_2 / 60;
945 rtc_bcd[DS1337_MIN] = bin2bcd(seconds_left_2 - (60 * seconds_left));
947 seconds_left_2 = seconds_left / 24;
948 rtc_bcd[DS1337_HR] = bin2bcd(seconds_left - (24 * seconds_left_2));
951 leap_year_periods = seconds_left_2 / ((4 * 365) + 1);
953 days_since_current_lyear = seconds_left_2 % ((4 * 365) + 1);
956 if ((days_since_current_lyear >= (31 + 29))) {
959 seconds_left = (seconds_left_2 - leap_year_periods) / 365;
960 days_since_first_of_year = seconds_left_2 - (seconds_left * 365) - leap_year_periods;
962 if ((days_since_current_lyear <= 365) && (days_since_current_lyear >= 60)) {
963 days_since_first_of_year++;
974 while (days_since_first_of_year < days_to_month) {
976 days_to_month = monthdays[month-1];
977 if ((month > 2) && ((seconds_left % 4) == 0)) {
982 rtc_bcd[DS1337_DATE] = bin2bcd( days_since_first_of_year - days_to_month + 1);
984 rtc_bcd[DS1337_DOW] = bin2bcd((seconds_left_2 + 4) % 7);
992 rtc_bcd[DS1337_MTH] = bin2bcd(month);
993 rtc_bcd[DS1337_YR] = bin2bcd(seconds_left);
1000 rtc_bcd[DS1337_SEC] = 0;
1001 rtc_bcd[DS1337_MIN] = 0;
1002 rtc_bcd[DS1337_HR] = 0;
1003 rtc_bcd[DS1337_DATE] = 0;
1004 rtc_bcd[DS1337_DOW] = 0;
1005 rtc_bcd[DS1337_MTH] = 0;
1006 rtc_bcd[DS1337_YR] = 0;
1011 unsigned long DS1337::date_to_epoch_seconds(
unsigned int year, byte month, byte day, byte hour, byte minute, byte second)
1038 unsigned long sse = (((
unsigned long)year)*365*24*60*60) + ((((
unsigned long)year+3)>>2) + ((
unsigned long)year%4==0 && (
unsigned long)month>2))*24*60*60 + \
1039 ((
unsigned long)monthdays[month-1] + (
unsigned long)day-1) *24*60*60 + ((
unsigned long)hour*60*60) + ((
unsigned long)minute*60) + (
unsigned long)second;
1045 unsigned long DS1337::date_to_epoch_seconds()
1047 unsigned long asdf = date_to_epoch_seconds(
int(bcd2bin(rtc_bcd[DS1337_YR])), bcd2bin(rtc_bcd[DS1337_MTH]), bcd2bin(rtc_bcd[DS1337_DATE]), bcd2bin(rtc_bcd[DS1337_HR]), bcd2bin(rtc_bcd[DS1337_MIN]), bcd2bin(rtc_bcd[DS1337_SEC]));