跳转至

Real time clock (RTC)

概要

RTC是独立的时钟,可以跟踪日期和时间。本节内容为大家介绍RTC的使用以及时间的校准方法。

RTC的API文档

构造

RTC类的构造不接受任何参数,你按照下面的代码来实例化一个RTC对象

>>> from machine import RTC
>>> rtc = RTC()

初始化时间

RTC对象的初始化使用init()函数, 传入参数为一个元组,包含8个数值。

rtc.init((2018, 11, 18, 6, 12, 15, 5, 607409))

这8个数值分别对应着:

星期 毫秒部分
2018 11 18 6 12 15 5 607409

注意: 星期一到星期天分别对应的是 [0-6] 而不是 [1-7]

注意:毫秒部分的数值其实是秒数的小数点位后的数值,并不是实际的607409毫秒,而是5.607409秒

查看当前时间

我们可以使用datetime()函数来查看时间

>>> rtc.datetime()
(2018, 11, 18, 6, 12, 15, 8, 142409)

同时,datetime()函数也可以像init()一样进行初始化

>>> rtc.datetime((2018, 11, 18, 6, 12, 15, 5, 607409))
(2018, 11, 18, 6, 12, 15, 8, 142409)

RTC的不足之处

精度

虽然RTC能够为我们进行时间和日期的跟踪,但是在MicroPython 8266上,RTC的精度存在一定的缺陷,每过7:45h便会有秒级别的误差溢出,所以8266上,官方建议每隔7小时进行一次时间的校准。

既然在MicroPython8266的文档中指出了RTC的缺陷,那么很可能ESP32和ESP8266可能存在同样的问题,因此建议大家也每7小时对时间进行一次校准。

掉电后无法继续计时

因为没有板载电池之类的措施,所以ESP32的计时器无法在掉电后进行计时工作,这就会导致你的设备在下次开机前进入初始的时间2000年1月1号。所以如果要对时间进行精准的掌控,我们需要在开机时进行时间的校准, 这一点,EMP项目可以帮助你完成。

通过网络校准时间

针对以上的不足之处,解决办法似乎也只剩下通过网络来校准时间了。

正如我之前所说,EMP项目是为了让事情变得简单。所以我们在emp-1zlab包中,就加入了RTC网络时间校准的接口,你只需要简单的调用,即可完成时间的校准。

>>> from emp_utils import sync_time
>>> sync_time()
before sync:  (2000, 1, 1, 5, 0, 3, 19, 182131)
after sync:  (2018, 11, 27, 1, 11, 8, 42, 175)