AceTime  1.7.1
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 #include <Wire.h>
7 #include <Print.h> // Print
8 #include <AceCommon.h> // bcdToDec(), decToBcd()
9 #include "HardwareDateTime.h"
10 #include "HardwareTemperature.h"
11 #include "DS3231.h"
12 
13 using ace_common::bcdToDec;
14 using ace_common::decToBcd;
15 
16 namespace ace_time {
17 namespace hw {
18 
19 void DS3231::readDateTime(HardwareDateTime* dateTime) const {
20  Wire.beginTransmission(kAddress);
21  Wire.write(0); // set DS3231 register pointer to 00h
22  Wire.endTransmission();
23 
24  // request seven bytes of data from DS3231 starting from register 00h
25  Wire.requestFrom(kAddress, (uint8_t) 7);
26  dateTime->second = bcdToDec(Wire.read() & 0x7F);
27  dateTime->minute = bcdToDec(Wire.read());
28  dateTime->hour = bcdToDec(Wire.read() & 0x3F);
29  dateTime->dayOfWeek = bcdToDec(Wire.read());
30  dateTime->day = bcdToDec(Wire.read());
31  dateTime->month = bcdToDec(Wire.read());
32  dateTime->year = bcdToDec(Wire.read());
33 }
34 
35 void DS3231::readTemperature(HardwareTemperature* temperature) const {
36  Wire.beginTransmission(kAddress);
37  Wire.write(0x11); // set DS3231 register pointer to 11h
38  Wire.endTransmission();
39 
40  Wire.requestFrom(kAddress, (uint8_t) 2);
41  temperature->msb = Wire.read();
42  temperature->lsb = Wire.read();
43 }
44 
45 void DS3231::setDateTime(const HardwareDateTime& dateTime) const {
46  Wire.beginTransmission(kAddress);
47  Wire.write(0); // set next input to start at the seconds register
48  Wire.write(decToBcd(dateTime.second));
49  Wire.write(decToBcd(dateTime.minute));
50  Wire.write(decToBcd(dateTime.hour));
51  Wire.write(decToBcd(dateTime.dayOfWeek));
52  Wire.write(decToBcd(dateTime.day));
53  Wire.write(decToBcd(dateTime.month));
54  Wire.write(decToBcd(dateTime.year));
55  Wire.endTransmission();
56 }
57 
58 } // hw
59 } // ace_time
ace_time::hw::DS3231::setDateTime
void setDateTime(const HardwareDateTime &dateTime) const
Set the DS3231 with the HardwareDateTime values.
Definition: DS3231.cpp:45
ace_time::hw::HardwareTemperature
The temperature in Celcius as a signed (8.8) fixed-point integer.
Definition: HardwareTemperature.h:22
ace_time::hw::DS3231::readDateTime
void readDateTime(HardwareDateTime *dateTime) const
Read the time into the HardwareDateTime object.
Definition: DS3231.cpp:19
ace_time::hw::DS3231::readTemperature
void readTemperature(HardwareTemperature *temperature) const
Read the temperature into the HardwareTemperature object.
Definition: DS3231.cpp:35
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