Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

92 строки
1.7 KiB

  1. #include "Rtc.h"
  2. #include "Pins.h"
  3. #include <Wire.h>
  4. #include <MD_DS3231.h>
  5. #define LOGGER_NAME "Rtc"
  6. namespace rtc {
  7. namespace details {
  8. timestamp_t readTimeFromRegisters() {
  9. tmElements_t tmElements = {
  10. RTC.s,
  11. RTC.m,
  12. RTC.h,
  13. RTC.dow,
  14. RTC.dd,
  15. RTC.mm,
  16. CalendarYrToTm(RTC.yyyy)
  17. };
  18. return makeTime(tmElements);
  19. }
  20. void writeTimeToRegisters(timestamp_t &time) {
  21. tmElements_t tmElements;
  22. breakTime(time, tmElements);
  23. RTC.s = tmElements.Second;
  24. RTC.m = tmElements.Minute;
  25. RTC.h = tmElements.Hour;
  26. RTC.dow = tmElements.Wday;
  27. RTC.dd = tmElements.Day;
  28. RTC.mm = tmElements.Month;
  29. RTC.yyyy = tmYearToCalendar(tmElements.Year);
  30. }
  31. }
  32. void powerOn() {
  33. digitalWrite(RTC_PWR, HIGH);
  34. pinMode(RTC_PWR, OUTPUT);
  35. Wire.begin();
  36. }
  37. void powerOff() {
  38. pinMode(RTC_PWR, INPUT);
  39. digitalWrite(RTC_PWR, LOW);
  40. //turn off i2c
  41. TWCR &= ~(bit(TWEN) | bit(TWIE) | bit(TWEA));
  42. //disable i2c internal pull ups
  43. digitalWrite(A4, LOW);
  44. digitalWrite(A5, LOW);
  45. }
  46. void setup() {
  47. RTC.control(DS3231_12H, DS3231_OFF); //24 hours clock
  48. RTC.control(DS3231_INT_ENABLE, DS3231_OFF); //INTCN OFF
  49. }
  50. timestamp_t getTime() {
  51. RTC.readTime();
  52. return details::readTimeFromRegisters();
  53. }
  54. void setTime(timestamp_t &time) {
  55. details::writeTimeToRegisters(time);
  56. RTC.writeTime();
  57. }
  58. void setAlarm(uint16_t seconds) {
  59. timestamp_t t = getTime();
  60. t = t + seconds;
  61. setAlarm(t);
  62. }
  63. void setAlarm(timestamp_t &time) {
  64. details::writeTimeToRegisters(time);
  65. RTC.writeAlarm1(DS3231_ALM_S);
  66. RTC.control(DS3231_A1_FLAG, DS3231_OFF);
  67. RTC.control(DS3231_A1_INT_ENABLE, DS3231_ON); //Alarm 1 ON
  68. RTC.control(DS3231_INT_ENABLE, DS3231_ON); //INTCN ON
  69. }
  70. }