AceTime  0.5.2
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.
DS3231.cpp
1 /*
2  * MIT License
3  * Copyright (c) 2018 Brian T. Park
4  */
5 
6 #if defined(ARDUINO)
7 
8 #include <Wire.h>
9 #include <Print.h> // Print
10 #include "../common/util.h" // bcdToDec(), decToBcd()
11 #include "HardwareDateTime.h"
12 #include "HardwareTemperature.h"
13 #include "DS3231.h"
14 
15 namespace ace_time {
16 
17 using common::bcdToDec;
18 using common::decToBcd;
19 
20 namespace hw {
21 
22 void DS3231::readDateTime(HardwareDateTime* dateTime) const {
23  Wire.beginTransmission(kAddress);
24  Wire.write(0); // set DS3231 register pointer to 00h
25  Wire.endTransmission();
26 
27  // request seven bytes of data from DS3231 starting from register 00h
28  Wire.requestFrom(kAddress, (uint8_t) 7);
29  dateTime->second = bcdToDec(Wire.read() & 0x7F);
30  dateTime->minute = bcdToDec(Wire.read());
31  dateTime->hour = bcdToDec(Wire.read() & 0x3F);
32  Wire.read(); // read, then discard
33  dateTime->day = bcdToDec(Wire.read());
34  dateTime->month = bcdToDec(Wire.read());
35  dateTime->year = bcdToDec(Wire.read());
36 }
37 
38 void DS3231::readTemperature(HardwareTemperature* temperature) const {
39  Wire.beginTransmission(kAddress);
40  Wire.write(0x11); // set DS3231 register pointer to 11h
41  Wire.endTransmission();
42 
43  Wire.requestFrom(kAddress, (uint8_t) 2);
44  temperature->msb = Wire.read();
45  temperature->lsb = Wire.read();
46 }
47 
48 void DS3231::setDateTime(const HardwareDateTime& dateTime) const {
49  Wire.beginTransmission(kAddress);
50  Wire.write(0); // set next input to start at the seconds register
51  Wire.write(decToBcd(dateTime.second));
52  Wire.write(decToBcd(dateTime.minute));
53  Wire.write(decToBcd(dateTime.hour));
54  Wire.write(decToBcd(dateTime.dayOfWeek));
55  Wire.write(decToBcd(dateTime.day));
56  Wire.write(decToBcd(dateTime.month));
57  Wire.write(decToBcd(dateTime.year));
58  Wire.endTransmission();
59 }
60 
61 }
62 }
63 
64 #endif