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