AceTime  1.7.4
Date and time classes for Arduino that support timezones from the TZ Database, and a system clock that can synchronize from an NTP server or an RTC chip.
DS3231Module.h
1 /*
2  * MIT License
3  * Copyright (c) 2021 Brian T. Park
4  */
5 
6 #ifndef ACE_TIME_HW_DS3231_MODULE_H
7 #define ACE_TIME_HW_DS3231_MODULE_H
8 
9 #include <stdint.h>
10 #include <AceCommon.h> // bcdToDec(), decToBcd()
11 #include "HardwareDateTime.h"
12 #include "HardwareTemperature.h"
13 
14 namespace ace_time {
15 namespace hw {
16 
17 class HardwareDateTime;
18 class HardwareTemperature;
19 
28  public:
29  virtual void readDateTime(HardwareDateTime* dateTime) = 0;
30  virtual void setDateTime(const HardwareDateTime& dateTime) = 0;
31  virtual void readTemperature(HardwareTemperature* temperature) = 0;
32 };
33 
42 template <typename T_WIREI>
43 class DS3231Module : public DS3231Interface {
44  private:
45  static const uint8_t kAddress = 0x68;
46 
47  public:
49  explicit DS3231Module(T_WIREI& wireInterface)
50  : mWireInterface(wireInterface) {}
51 
53  void readDateTime(HardwareDateTime* dateTime) override {
54  using ace_common::bcdToDec;
55 
56  mWireInterface.beginTransmission(kAddress);
57  mWireInterface.write(0); // set DS3231 register pointer to 00h
58  mWireInterface.endTransmission();
59 
60  // request seven bytes from DS3231 starting from register 00h
61  mWireInterface.requestFrom(kAddress, (uint8_t) 7);
62  dateTime->second = bcdToDec(mWireInterface.read() & 0x7F);
63  dateTime->minute = bcdToDec(mWireInterface.read());
64  dateTime->hour = bcdToDec(mWireInterface.read() & 0x3F);
65  dateTime->dayOfWeek = bcdToDec(mWireInterface.read());
66  dateTime->day = bcdToDec(mWireInterface.read());
67  dateTime->month = bcdToDec(mWireInterface.read());
68  dateTime->year = bcdToDec(mWireInterface.read());
69  }
70 
72  void setDateTime(const HardwareDateTime& dateTime) override {
73  using ace_common::decToBcd;
74 
75  mWireInterface.beginTransmission(kAddress);
76  mWireInterface.write(0); // set next input to start at 'seconds' register
77  mWireInterface.write(decToBcd(dateTime.second));
78  mWireInterface.write(decToBcd(dateTime.minute));
79  mWireInterface.write(decToBcd(dateTime.hour));
80  mWireInterface.write(decToBcd(dateTime.dayOfWeek));
81  mWireInterface.write(decToBcd(dateTime.day));
82  mWireInterface.write(decToBcd(dateTime.month));
83  mWireInterface.write(decToBcd(dateTime.year));
84  mWireInterface.endTransmission();
85  }
86 
88  void readTemperature(HardwareTemperature* temperature) override {
89  mWireInterface.beginTransmission(kAddress);
90  mWireInterface.write(0x11); // set DS3231 register pointer to 11h
91  mWireInterface.endTransmission();
92 
93  mWireInterface.requestFrom(kAddress, (uint8_t) 2);
94  temperature->msb = mWireInterface.read();
95  temperature->lsb = mWireInterface.read();
96  }
97 
98  private:
99  T_WIREI mWireInterface;
100 };
101 
102 } // hw
103 } // ace_time
104 
105 #endif
ace_time::hw::DS3231Interface
Abstract interface to the DS3231Module to allow different template instantiations (using different Ac...
Definition: DS3231Module.h:27
ace_time::hw::DS3231Module::setDateTime
void setDateTime(const HardwareDateTime &dateTime) override
Set the DS3231 with the HardwareDateTime values.
Definition: DS3231Module.h:72
ace_time::hw::DS3231Module::readTemperature
void readTemperature(HardwareTemperature *temperature) override
Read the temperature into the HardwareTemperature object.
Definition: DS3231Module.h:88
ace_time::hw::HardwareTemperature
The temperature in Celcius as a signed (8.8) fixed-point integer.
Definition: HardwareTemperature.h:22
ace_time::hw::DS3231Module
Same as the hw/DS3231 class, but designed for use with one of the templatized interface classes of Ac...
Definition: DS3231Module.h:43
ace_time::hw::DS3231Module::DS3231Module
DS3231Module(T_WIREI &wireInterface)
Constructor.
Definition: DS3231Module.h:49
ace_time::hw::DS3231Module::readDateTime
void readDateTime(HardwareDateTime *dateTime) override
Read the time into the HardwareDateTime object.
Definition: DS3231Module.h:53
ace_time::hw::HardwareDateTime
The date (year, month, day) and time (hour, minute, second) fields supported by the DS3231 RTC chip.
Definition: HardwareDateTime.h:19