You've already forked M5Unit-RTC
mirror of
https://github.com/m5stack/M5Unit-RTC.git
synced 2026-05-20 10:33:20 -07:00
Init
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
+5
-5
@@ -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"
|
||||
}
|
||||
}
|
||||
+6
-6
@@ -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
|
||||
|
||||
@@ -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);
|
||||
@@ -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 <Wire.h>
|
||||
|
||||
#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);
|
||||
Reference in New Issue
Block a user