ESP32使用PCF8563时钟模块进行网络校时
关于PCF8563时钟模块的介绍
最近在做基于 esp32的点阵时钟,需要对时钟模块进行选择,现在用的最多的莫过于DS3231,这个模块的特点是高精度,价格大概8元左右,但用为一个追求极致的创客来说,选择最具备性价比的元件组合出最好的作品是每一个创客的终极目标,在头条上一次偶然的机会看到了飞利浦 公司的PCF8563芯片,于是乎在某宝里查了一下价格,惊喜的发现只有2元,本着实践出真知的原则,采购了一大堆元件,这其中就包括DS3231和PCF8563,那废话不多说,两个东西首先在体积上就不一样,DS3231明显大了一圈,因为PCF8563我买的是排针不焊接的版本,所以一直到今天才焊接上开始调试,让我们来体验这款高性比的产品吧。
接线
关于esp32的开发环境在这里就不再赘述,不懂的同学请自行百度搜索,我目前是使用arduino ide来进行esp32的程序开发,后续将转战vscode平台用platformio进行开发,貌似编译速度以及编程体验度都有大幅提高。那言归正传,首先让大家了解一下PCF8563长什么样:
PCF8563 是PHILIPS 公司推出的一款工业级内含I2C总线接口功能的具有极低功耗的多功能时钟/日历芯片。PCF8563 的多种报警功能、定时器功能、时钟输出功能以及中断输出功能能完成各种复杂的定时服务,甚至可为单片机提供看门狗功能。是一款性价比极高的时钟芯片,它已被广泛用于电表、水表、气表、电话、传真机、便携式仪器以及电池供电的仪器仪表等产品领域。
我们可以看到PCF8563有6个针脚,其中SDA和SCL以及VSS、GND是必要的。细心的同学可能通过上图看到了晶振,对,这个晶振保持这款芯片稳定、准确的走时,配合这个价格,真是良心产品。好下面我们将这四个针脚连接esp32的GPIO口,接线如下:
针脚 | ESP对应IO |
---|---|
SDA | D21 |
SCL | D22 |
VCC | 3V3 |
GND | GND |
下载Arduino的PCF8563库
这里我们下载I2C_BM8563库:
上代码
下载完成之后我们可以在示例中看到这个时钟模块的各种用法,我将示例代码作了本地化的修改,主要是采用了中国的时区,替换了阿里云的校时服务器,除此以个将校时封闭成了独立函数,下面上代码:
#include "I2C_BM8563.h"
#include <WiFi.h>
// RTC BM8563 I2C port
// I2C pin definition for M5Stick & M5Stick Plus & M5Stack Core2
#define BM8563_I2C_SDA 21
#define BM8563_I2C_SCL 22
// I2C pin definition for M5Stack TimerCam
// #define BM8563_I2C_SDA 12
// #define BM8563_I2C_SCL 14
I2C_BM8563 rtc(I2C_BM8563_DEFAULT_ADDRESS, Wire1);
const char* ntpServer = "ntp.aliyun.com";
void setup() {
// Init Serial
Serial.begin(115200);
delay(50);
Wire1.begin(BM8563_I2C_SDA, BM8563_I2C_SCL);
// Init RTC
rtc.begin();
GetNtpTime();
}
void loop() {
I2C_BM8563_DateTypeDef dateStruct;
I2C_BM8563_TimeTypeDef timeStruct;
// Get RTC
rtc.getDate(&dateStruct);
rtc.getTime(&timeStruct);
// Print RTC
Serial.printf("%04d/%02d/%02d %02d:%02d:%02d\n",
dateStruct.year,
dateStruct.month,
dateStruct.date,
timeStruct.hours,
timeStruct.minutes,
timeStruct.seconds
);
// Wait
delay(1000);
}
void GetNtpTime(){ //获取网络校时
// Connect to an access point
//WiFi.begin(); // Connect to the access point of the last connection
WiFi.begin("SSID", "PASSWD"); // Or, Connect to the specified access point
Serial.print("Connecting to Wi-Fi ");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");
// Set ntp time to local
configTime(8 * 3600, 0, ntpServer);
// Init I2C
// Get local time
struct tm timeInfo;
if (getLocalTime(&timeInfo)) {
// Set RTC time
I2C_BM8563_TimeTypeDef timeStruct;
timeStruct.hours = timeInfo.tm_hour;
timeStruct.minutes = timeInfo.tm_min;
timeStruct.seconds = timeInfo.tm_sec;
rtc.setTime(&timeStruct);
// Set RTC Date
I2C_BM8563_DateTypeDef dateStruct;
dateStruct.weekDay = timeInfo.tm_wday;
dateStruct.month = timeInfo.tm_mon + 1;
dateStruct.date = timeInfo.tm_mday;
dateStruct.year = timeInfo.tm_year + 1900;
rtc.setDate(&dateStruct);
}
}
这段代码先将esp32连上家里的无线路由器(上面的代码中的SSID和PASSWD改成自己家的路由器密码),然后通过阿里云的校时服务器获取中国的日期与时间,并且将这个时间设置到PCF8563时钟芯片中,这样以后我们可以在串口监视器中看到日期与时间
如果你下次家里网络没开的话,这个程序也会从PCF8563芯片中获取日期与时间信息。
飞利浦的这款芯片是目前最稳定的、走时最准的、功耗最低的芯片之一,像DS1302之类的时钟芯片简直弱爆了,相信同学们看到这里也会有一种马上去体验的冲动了!!!
最后预告一下,我的点阵时钟正在进行外壳设计中了,相信在近期马上可以给大家展示,请大家期待吧!