From c5ebe0c82ed3765e8b1fdf06255cb5b36702a50f Mon Sep 17 00:00:00 2001 From: Tinyu Date: Fri, 15 Jul 2022 17:13:24 +0800 Subject: [PATCH] Init --- README.md | 8 +- .../Unit_RTC_M5Series/Unit_RTC_M5Series.ino | 56 +++++++++++ examples/set_date/set_date.ino | 42 -------- library.json | 10 +- library.properties | 12 +-- src/{M5_BM8563.cpp => Unit_RTC.cpp} | 96 +++++++++---------- src/{M5_BM8563.h => Unit_RTC.h} | 25 +++-- 7 files changed, 132 insertions(+), 117 deletions(-) create mode 100644 examples/Unit_RTC_M5Series/Unit_RTC_M5Series.ino delete mode 100644 examples/set_date/set_date.ino rename src/{M5_BM8563.cpp => Unit_RTC.cpp} (77%) rename src/{M5_BM8563.h => Unit_RTC.h} (81%) diff --git a/README.md b/README.md index c478142..a30e429 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,15 @@ -# M5_BM8563 +# M5Unit-RTC ## Overview +### SKU:U126 + M5Stack-**UNIT RTC** related programs.compatible with BM8563 and HYM8563. ## Related Link -[Document & Datasheet](https://docs.m5stack.com/en/unit/rtc) +[Document & Datasheet - M5Unit-RTC](https://docs.m5stack.com/en/unit/rtc) ## License -[UNIT_ENV - MIT](LICENSE) +[M5Unit-RTC - MIT](LICENSE) diff --git a/examples/Unit_RTC_M5Series/Unit_RTC_M5Series.ino b/examples/Unit_RTC_M5Series/Unit_RTC_M5Series.ino new file mode 100644 index 0000000..4520ae9 --- /dev/null +++ b/examples/Unit_RTC_M5Series/Unit_RTC_M5Series.ino @@ -0,0 +1,56 @@ +/* +******************************************************************************* +* Copyright (c) 2021 by M5Stack +* Equipped with M5Series sample source code +* 配套 M5Series 示例源代码 +* Visit for more information: https://docs.m5stack.com/en/unit/rtc +* 获取更多资料请访问: https://docs.m5stack.com/zh_CN/unit/rtc +* +* Describe: Unit RTC. +* Date: 2022/7/15 +******************************************************************************* + Real-time time output on serial port every one second + 每个一秒在串口输出实时时间 +*/ +#include "Unit_RTC.h" + +Unit_RTC RTC; + +rtc_time_type rtc_time; +rtc_date_type rtc_date; + +char str_buffer[64]; + +void showlog(rtc_time_type *rtc_time, rtc_date_type *rtc_date) { + sprintf(str_buffer, "RTC Time Now is %02d:%02d:%02d", rtc_time->Hours, + rtc_time->Minutes, rtc_time->Seconds); + Serial.println(str_buffer); + sprintf(str_buffer, "RTC Date Now is %02d:%02d:%02d WeekDay:%02d", + rtc_date->Year, rtc_date->Month, rtc_date->Date, rtc_date->WeekDay); + Serial.println(str_buffer); +} + +void setup() { + RTC.begin(); + Serial.begin(115200); + delay(10); + rtc_time.Hours = 14; + rtc_time.Minutes = 40; + rtc_time.Seconds = 5; + + rtc_date.WeekDay = 4; + rtc_date.Month = 7; + rtc_date.Date = 15; + rtc_date.Year = 2021; + + RTC.setTime(&rtc_time); + RTC.setDate(&rtc_date); +} + +void loop() { + RTC.getTime(&rtc_time); + RTC.getDate(&rtc_date); + + showlog(&rtc_time, &rtc_date); + delay(300); +} diff --git a/examples/set_date/set_date.ino b/examples/set_date/set_date.ino deleted file mode 100644 index 8206d9a..0000000 --- a/examples/set_date/set_date.ino +++ /dev/null @@ -1,42 +0,0 @@ -#include "M5_BM8563.h" - -BM8563 RTC; - -rtc_time_type rtc_time_unit; -rtc_date_type rtc_date_unit; - -char str_buffer[64]; - -void showlog(rtc_time_type *rtc_time, rtc_date_type *rtc_date) { - sprintf(str_buffer, "RTC Time Now is %02d:%02d:%02d", rtc_time->Hours, - rtc_time->Minutes, rtc_time->Seconds); - Serial.println(str_buffer); - sprintf(str_buffer, "RTC Date Now is %02d:%02d:%02d WeekDay:%02d", - rtc_date->Year, rtc_date->Month, rtc_date->Date, rtc_date->WeekDay); - Serial.println(str_buffer); -} - -void setup() { - RTC.begin(); - Serial.begin(115200); - delay(10); - rtc_time_unit.Hours = 14; - rtc_time_unit.Minutes = 40; - rtc_time_unit.Seconds = 5; - - rtc_date_unit.WeekDay = 4; - rtc_date_unit.Month = 7; - rtc_date_unit.Date = 15; - rtc_date_unit.Year = 2021; - - RTC.setTime(&rtc_time_unit); - RTC.setDate(&rtc_date_unit); -} - -void loop() { - RTC.getTime(&rtc_time_unit); - RTC.getDate(&rtc_date_unit); - - showlog(&rtc_time_unit, &rtc_date_unit); - delay(300); -} diff --git a/library.json b/library.json index fbcca49..7126325 100644 --- a/library.json +++ b/library.json @@ -1,16 +1,16 @@ { - "name": "M5_BM8563", - "description": "Library for M5_BM8563 RTC", - "keywords": "BM8563 RTC", + "name": "M5Unit-RTC", + "description": "Library for M5Stack Unit RTC", + "keywords": "M5Stack Unit BM8563 RTC", "authors": { "name": "M5Stack", "url": "http://www.m5stack.com" }, "repository": { "type": "git", - "url": "https://github.com/m5stack/M5_BM8563.git" + "url": "https://github.com/m5stack/M5Unit-RTC.git" }, "version": "0.0.1", "frameworks": "arduino", "platforms": "espressif32" -} +} \ No newline at end of file diff --git a/library.properties b/library.properties index e6016e5..46a2844 100644 --- a/library.properties +++ b/library.properties @@ -1,10 +1,10 @@ -name=M5_BM8563 +name=M5Unit-RTC version=0.0.1 author=M5Stack -maintainer=M5Stack,Sean -sentence=Library for M5_BM8563 RTC -paragraph=See more on http://M5Stack.com +maintainer=M5Stack +sentence=Library for BM8563 RTC +paragraph=See more on https://docs.m5stack.com/en/unit/rtc category=Device Control -url=https://github.com/m5stack/M5_BM8563 +url=https://github.com/m5stack/M5Unit-RTC architectures=esp32 -includes=M5_BM8563.h +includes=Unit_RTC.h diff --git a/src/M5_BM8563.cpp b/src/Unit_RTC.cpp similarity index 77% rename from src/M5_BM8563.cpp rename to src/Unit_RTC.cpp index 20acfa3..7091a6c 100644 --- a/src/M5_BM8563.cpp +++ b/src/Unit_RTC.cpp @@ -1,10 +1,15 @@ -#include "M5_BM8563.h" +#include "Unit_RTC.h" -BM8563::BM8563() { _addr = DEVICE_ADDR; } +Unit_RTC::Unit_RTC() { + _addr = DEVICE_ADDR; +} -BM8563::BM8563(uint8_t addr) { _addr = addr; } +Unit_RTC::Unit_RTC(uint8_t addr) { + _addr = addr; +} -void BM8563::begin() { +/*! @brief Initialize the RTC. */ +void Unit_RTC::begin() { _wire = &Wire; _wire->begin(); writeReg(0x00, 0x00); @@ -12,7 +17,8 @@ void BM8563::begin() { writeReg(0x0D, 0x00); } -void BM8563::begin(TwoWire *wire) { +/*! @brief Initialize the RTC. */ +void Unit_RTC::begin(TwoWire *wire) { _wire = wire; _wire->begin(); writeReg(0x00, 0x00); @@ -20,50 +26,34 @@ void BM8563::begin(TwoWire *wire) { writeReg(0x0D, 0x00); } -void BM8563::begin(TwoWire *wire, uint8_t scl, uint8_t sda, uint32_t i2c_freq) { +/*! @brief Initialize the RTC. */ +void Unit_RTC::begin(TwoWire *wire, uint8_t scl, uint8_t sda, + uint32_t i2c_freq) { _wire = wire; - _wire->begin(sda, scl, i2c_freq); + _wire->begin(DEVICE_ADDR, sda, scl, i2c_freq); writeReg(0x00, 0x00); writeReg(0x01, 0x00); writeReg(0x0D, 0x00); } -void BM8563::writeReg(uint8_t reg, uint8_t data) { - _wire->beginTransmission(0x51); +/*! @brief Write data to register. */ +void Unit_RTC::writeReg(uint8_t reg, uint8_t data) { + _wire->beginTransmission(DEVICE_ADDR); _wire->write(reg); _wire->write(data); _wire->endTransmission(); } -uint8_t BM8563::ReadReg(uint8_t reg) { - _wire->beginTransmission(0x51); +/*! @brief Read data from register. */ +uint8_t Unit_RTC::ReadReg(uint8_t reg) { + _wire->beginTransmission(DEVICE_ADDR); _wire->write(reg); _wire->endTransmission(false); - _wire->requestFrom(0x51, 1); + _wire->requestFrom(DEVICE_ADDR, 1); return _wire->read(); } -void BM8563::getBm8563Time(void) { - _wire->beginTransmission(0x51); - _wire->write(0x02); - _wire->endTransmission(false); - _wire->requestFrom(0x51, 7); - while (_wire->available()) { - _trdata[0] = _wire->read(); - _trdata[1] = _wire->read(); - _trdata[2] = _wire->read(); - _trdata[3] = _wire->read(); - _trdata[4] = _wire->read(); - _trdata[5] = _wire->read(); - _trdata[6] = _wire->read(); - } - - DataMask(); - Bcd2asc(); - Str2Time(); -} - -void BM8563::Str2Time(void) { +void Unit_RTC::Str2Time(void) { Second = (asc[0] - 0x30) * 10 + asc[1] - 0x30; Minute = (asc[2] - 0x30) * 10 + asc[3] - 0x30; Hour = (asc[4] - 0x30) * 10 + asc[5] - 0x30; @@ -76,7 +66,7 @@ void BM8563::Str2Time(void) { */ } -void BM8563::DataMask() { +void Unit_RTC::DataMask() { _trdata[0] = _trdata[0] & 0x7f; //秒 _trdata[1] = _trdata[1] & 0x7f; //分 _trdata[2] = _trdata[2] & 0x3f; //时 @@ -95,7 +85,7 @@ void BM8563::DataMask() { 入口参数: 返 回 值:无 ***********************************************************************/ -void BM8563::Bcd2asc(void) { +void Unit_RTC::Bcd2asc(void) { uint8_t i, j; for (j = 0, i = 0; i < 7; i++) { asc[j++] = @@ -104,13 +94,13 @@ void BM8563::Bcd2asc(void) { } } -uint8_t BM8563::Bcd2ToByte(uint8_t Value) { +uint8_t Unit_RTC::Bcd2ToByte(uint8_t Value) { uint8_t tmp = 0; tmp = ((uint8_t)(Value & (uint8_t)0xF0) >> (uint8_t)0x4) * 10; return (tmp + (Value & (uint8_t)0x0F)); } -uint8_t BM8563::ByteToBcd2(uint8_t Value) { +uint8_t Unit_RTC::ByteToBcd2(uint8_t Value) { uint8_t bcdhigh = 0; while (Value >= 10) { @@ -121,14 +111,14 @@ uint8_t BM8563::ByteToBcd2(uint8_t Value) { return ((uint8_t)(bcdhigh << 4) | Value); } -void BM8563::getTime(rtc_time_type *RTC_TimeStruct) { +void Unit_RTC::getTime(rtc_time_type *RTC_TimeStruct) { // if() uint8_t buf[3] = {0}; - _wire->beginTransmission(0x51); + _wire->beginTransmission(DEVICE_ADDR); _wire->write(0x02); _wire->endTransmission(false); - _wire->requestFrom(0x51, 3); + _wire->requestFrom(DEVICE_ADDR, 3); while (_wire->available()) { buf[0] = _wire->read(); @@ -141,12 +131,12 @@ void BM8563::getTime(rtc_time_type *RTC_TimeStruct) { RTC_TimeStruct->Hours = Bcd2ToByte(buf[2] & 0x3f); //时 } -int BM8563::setTime(rtc_time_type *RTC_TimeStruct) { +int Unit_RTC::setTime(rtc_time_type *RTC_TimeStruct) { if (RTC_TimeStruct == NULL || RTC_TimeStruct->Hours > 24 || RTC_TimeStruct->Minutes > 60 || RTC_TimeStruct->Seconds > 60) return 0; - _wire->beginTransmission(0x51); + _wire->beginTransmission(DEVICE_ADDR); _wire->write(0x02); _wire->write(ByteToBcd2(RTC_TimeStruct->Seconds)); _wire->write(ByteToBcd2(RTC_TimeStruct->Minutes)); @@ -155,13 +145,13 @@ int BM8563::setTime(rtc_time_type *RTC_TimeStruct) { return 1; } -void BM8563::getDate(rtc_date_type *RTC_DateStruct) { +void Unit_RTC::getDate(rtc_date_type *RTC_DateStruct) { uint8_t buf[4] = {0}; - _wire->beginTransmission(0x51); + _wire->beginTransmission(DEVICE_ADDR); _wire->write(0x05); _wire->endTransmission(false); - _wire->requestFrom(0x51, 4); + _wire->requestFrom(DEVICE_ADDR, 4); while (_wire->available()) { buf[0] = _wire->read(); @@ -181,11 +171,11 @@ void BM8563::getDate(rtc_date_type *RTC_DateStruct) { } } -int BM8563::setDate(rtc_date_type *RTC_DateStruct) { +int Unit_RTC::setDate(rtc_date_type *RTC_DateStruct) { if (RTC_DateStruct == NULL || RTC_DateStruct->WeekDay > 7 || RTC_DateStruct->Date > 31 || RTC_DateStruct->Month > 12) return 0; - _wire->beginTransmission(0x51); + _wire->beginTransmission(DEVICE_ADDR); _wire->write(0x05); _wire->write(ByteToBcd2(RTC_DateStruct->Date)); _wire->write(ByteToBcd2(RTC_DateStruct->WeekDay)); @@ -203,7 +193,7 @@ int BM8563::setDate(rtc_date_type *RTC_DateStruct) { return 1; } -int BM8563::setAlarmIRQ(int afterSeconds) { +int Unit_RTC::setAlarmIRQ(int afterSeconds) { uint8_t reg_value = 0; reg_value = ReadReg(0x01); @@ -234,7 +224,7 @@ int BM8563::setAlarmIRQ(int afterSeconds) { return afterSeconds * div; } -int BM8563::setAlarmIRQ(const rtc_time_type &RTC_TimeStruct) { +int Unit_RTC::setAlarmIRQ(const rtc_time_type &RTC_TimeStruct) { uint8_t irq_enable = false; uint8_t out_buf[4] = {0x80, 0x80, 0x80, 0x80}; @@ -267,8 +257,8 @@ int BM8563::setAlarmIRQ(const rtc_time_type &RTC_TimeStruct) { return irq_enable ? 1 : 0; } -int BM8563::setAlarmIRQ(const rtc_date_type &RTC_DateStruct, - const rtc_time_type &RTC_TimeStruct) { +int Unit_RTC::setAlarmIRQ(const rtc_date_type &RTC_DateStruct, + const rtc_time_type &RTC_TimeStruct) { uint8_t irq_enable = false; uint8_t out_buf[4] = {0x80, 0x80, 0x80, 0x80}; @@ -308,11 +298,11 @@ int BM8563::setAlarmIRQ(const rtc_date_type &RTC_DateStruct, return irq_enable ? 1 : 0; } -void BM8563::clearIRQ() { +void Unit_RTC::clearIRQ() { uint8_t data = ReadReg(0x01); writeReg(0x01, data & 0xf3); } -void BM8563::disableIRQ() { +void Unit_RTC::disableIRQ() { clearIRQ(); uint8_t data = ReadReg(0x01); writeReg(0x01, data & 0xfC); diff --git a/src/M5_BM8563.h b/src/Unit_RTC.h similarity index 81% rename from src/M5_BM8563.h rename to src/Unit_RTC.h index 7f5cba5..fd062fd 100644 --- a/src/M5_BM8563.h +++ b/src/Unit_RTC.h @@ -1,8 +1,15 @@ -#ifndef __M5_BM8563_RTC_H__ -#define __M5_BM8563_RTC_H__ +/*! + * @brief A programmable real-time clock module From M5Stack + * @copyright Copyright (c) 2022 by M5Stack[https://m5stack.com] + * + * @Links [Unit RTC](https://docs.m5stack.com/en/unit/rtc) + * @version V0.0.1 + * @date 2022-07-15 + */ +#ifndef _Unit_RTC_H__ +#define _Unit_RTC_H__ #include - #include "Arduino.h" #define DEVICE_ADDR 0x51 @@ -12,7 +19,8 @@ struct rtc_time_type { uint8_t Minutes; uint8_t Seconds; rtc_time_type(uint8_t hours = 0, uint8_t minutes = 0, uint8_t seconds = 0) - : Hours{hours}, Minutes{minutes}, Seconds{seconds} {} + : Hours{hours}, Minutes{minutes}, Seconds{seconds} { + } }; struct rtc_date_type { @@ -22,10 +30,11 @@ struct rtc_date_type { uint8_t WeekDay; rtc_date_type(uint16_t year = 2000, uint8_t month = 0, uint8_t date = 0, uint8_t weekDay = 0) - : Year{year}, Month{month}, Date{date}, WeekDay{weekDay} {} + : Year{year}, Month{month}, Date{date}, WeekDay{weekDay} { + } }; -class BM8563 { +class Unit_RTC { private: void Bcd2asc(void); void DataMask(); @@ -44,8 +53,8 @@ class BM8563 { TwoWire *_wire; public: - BM8563(); - BM8563(uint8_t addr); + Unit_RTC(); + Unit_RTC(uint8_t addr); void begin(); void begin(TwoWire *wire); void begin(TwoWire *wire, uint8_t scl, uint8_t sda, uint32_t i2c_freq);