Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

86 righe
2.0 KiB

  1. #include "Debug.h"
  2. #include "Rtc.h"
  3. #include "Pins.h"
  4. #include <Wire.h>
  5. #include <uDS3231.h>
  6. #define LOGGER_NAME "Rtc"
  7. using namespace utils;
  8. namespace rtc {
  9. void setup() {
  10. VERBOSE("setup");
  11. hardware::i2c::powerOn();
  12. RTC.control(DS3231_12H, DS3231_OFF); //24 hours clock
  13. RTC.control(DS3231_A1_INT_ENABLE, DS3231_OFF); //Alarm 1 OFF
  14. RTC.control(DS3231_INT_ENABLE, DS3231_ON); //INTCN ON
  15. hardware::i2c::powerOff();
  16. }
  17. float getTemperature() {
  18. hardware::i2c::powerOn();
  19. float temperature = RTC.readTempRegister();
  20. hardware::i2c::powerOff();
  21. return temperature;
  22. }
  23. bool isAccurate() {
  24. hardware::i2c::powerOn();
  25. bool accurate = RTC.status(DS3231_HALTED_FLAG) == DS3231_OFF;
  26. hardware::i2c::powerOff();
  27. return accurate;
  28. }
  29. timestamp_t getTime() {
  30. tmElements_t time;
  31. getTime(time);
  32. return time::makeTimestamp(time);
  33. }
  34. void getTime(tmElements_t &time) {
  35. hardware::i2c::powerOn();
  36. RTC.readTime(time);
  37. hardware::i2c::powerOff();
  38. VERBOSE_FORMAT("getTime", "%d/%d/%d %d:%d:%d", tmYearToCalendar(time.Year), time.Month, time.Day, time.Hour, time.Minute, time.Second);
  39. }
  40. void setTime(const tmElements_t &time) {
  41. VERBOSE_FORMAT("setTime", "%d/%d/%d %d:%d:%d", tmYearToCalendar(time.Year), time.Month, time.Day, time.Hour, time.Minute, time.Second);
  42. hardware::i2c::powerOn();
  43. RTC.writeTime(time);
  44. RTC.control(DS3231_HALTED_FLAG, DS3231_OFF);
  45. hardware::i2c::powerOff();
  46. }
  47. void setAlarm(uint16_t seconds) {
  48. tmElements_t currentTime;
  49. tmElements_t alarmTime;
  50. getTime(currentTime);
  51. time::breakTime(time::makeTimestamp(currentTime) + seconds, alarmTime);
  52. setAlarm(alarmTime);
  53. }
  54. void setAlarm(const tmElements_t &time) {
  55. hardware::i2c::powerOn();
  56. RTC.writeAlarm1(DS3231_ALM_HMS, time);
  57. RTC.control(DS3231_A1_FLAG, DS3231_OFF); //reset Alarm 1 flag
  58. RTC.control(DS3231_A1_INT_ENABLE, DS3231_ON); //Alarm 1 ON
  59. RTC.control(DS3231_INT_ENABLE, DS3231_ON); //INTCN ON
  60. NOTICE_FORMAT("setAlarm", "Next alarm : %d:%d:%d", time.Hour, time.Minute, time.Second);
  61. hardware::i2c::powerOff();
  62. }
  63. }