【Micropython】ESP8266通过NTP同步本地RTC时间
- ✨本案例基于
Thonny
平台开发。✨
📋实时时钟 (RTC)
- 🔖RTC属于machine模块中的子类。
datetime([value])
: 获取或设置当前时间。如果没有指定参数,则返回当前时间。如果指定了参数,格式为一个时间元组(year, month, day, weekday, hours, minutes, seconds, subseconds)
,则将这个时间设置到 RTC 上。memory([index[, value]])
: 获取或设置内置 RTC 芯片的备份 RAM 中的字节数据。备份 RAM 的大小取决于具体的 ESP8266 硬件型号,通常为 256 字节或 512 字节。备份 RAM 可以用于保存一些不易丢失的数据,例如设备 ID、配置信息、用户数据等。如果没有指定参数,则返回备份 RAM 的全部数据。如果指定了 index 参数,则返回备份 RAM 中从 index 开始的所有数据。如果同时指定了 index 和 value 参数,则将 value 写入备份 RAM 中从 index 开始的所有位置。battery_voltage()
: 获取内置 RTC 芯片的电池电压值。由于 ESP8266 内置 RTC 没有连接外部电源,因此需要使用备用电池来维持 RTC 的运行,一般使用 CR2032、CR1225 或类似型号的电池。这个函数将返回当前备用电池的电压值,单位为 V。alarm(id, time=None, mode=RTC.ALARM_SINGLE, callback=None, wakeup=RTC.ALARM_NOWAKEUP)
: 设置 RTC 的闹钟。这个函数可以设置 2 个不同的闹钟,分别用 id=0 和 id=1 表示。如果不是用 id 参数指定的某个闹钟,则将默认使用 id=0 的闹钟。time 参数表示闹钟触发时间,格式和取值范围与 datetime() 函数的参数相同。mode 参数表示闹钟的模式,取值为 RTC.ALARM_SINGLE 或 RTC.ALARM_REPEAT。如果设置为 RTC.ALARM_SINGLE,则这个闹钟只会在指定的时间点触发一次;如果设置为 RTC.ALARM_REPEAT,则这个闹钟会在每天的指定时间点触发。callback 参数指定闹钟触发时的回调函数,函数原型为:callback(id),其中 id 是当前触发的闹钟 ID。如果未指定回调函数,则默认会将系统唤醒。wakeup 参数表示是否允许闹钟触发时唤醒系统。如果将 wakeup 设置为 RTC.ALARM_WAKEUP,则允许闹钟触发时唤醒系统;如果将其设置为 RTC.ALARM_NOWAKEUP,则不允许唤醒系统,默认值为 RTC.ALARM_NOWAKEUP。cancel(id=0)
: 取消 RTC 中的指定闹钟。如果没有指定 id 参数,则默认取消 id=0 的闹钟。
📓获取本地RTC时间程序代码
from machine import RTC
from machine import I2C, Pin
import time # 用于调用延时sleep函数
led = Pin(2,Pin.OUT) #板载led
# 获取本地RTC
rtc = RTC()
while True:
tm = rtc.datetime() # 从RTC获取本地时间
print("Local time: ", tm) # 打印本地时间
led.value(not led.value()) # 反转LED状态
time.sleep(1) # 休眠1秒
📗设置本地RTC时间代码
from machine import RTC, Pin
import time # 用于调用延时sleep函数
led = Pin(2,Pin.OUT) #板载led
rtc = RTC()
rtc.datetime((2023, 4, 19, 2, 7, 48, 0, 0)) # set a specific date and time
while True:
tm = rtc.datetime() # 从RTC获取本地时间
print("Local time: ", tm) # 打印本地时间
led.value(not led.value()) # 反转LED状态
time.sleep(1) # 休眠1秒
📖通过引入ntptime
模块从NTP获取时间设置RTC
- 🔖由于时区的差异,在获取的UTC0时间基础上加8个小时。
import machine
import network
import ntptime
#import utime
# Set up the RTC
rtc = machine.RTC()
# 配置wifi
ssid = "######"
password = "********"
wifi = network.WLAN(network.STA_IF)
if not wifi.isconnected():
wifi.active(True)
wifi.connect(ssid, password)
while not wifi.isconnected():
pass
print("Connected to Wi-Fi")
# 从NTP服务器同时时间到RTC本地
ntptime.settime()
print("Time set successfully")
# Get the current date and time from RTC
(year, month, day, weekday, hours, minutes, seconds, subseconds) = rtc.datetime()
print("Current date/time: %s/%s/%s %s:%s:%s" % (day, month, year, hours+8, minutes, seconds))