> 文章列表 > 【Micropython】ESP8266通过NTP同步本地RTC时间

【Micropython】ESP8266通过NTP同步本地RTC时间

【Micropython】ESP8266通过NTP同步本地RTC时间

【Micropython】ESP8266通过NTP同步本地RTC时间


  • 📌相关篇《【MicroPython esp8266】固件烧写教程》
  • ✨本案例基于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

【Micropython】ESP8266通过NTP同步本地RTC时间

📗设置本地RTC时间代码

from machine import RTC, Pin
import time  # 用于调用延时sleep函数
led = Pin(2,Pin.OUT)	#板载ledrtc = RTC()
rtc.datetime((2023, 4, 19, 2, 7, 48, 0, 0)) # set a specific date and timewhile True:tm = rtc.datetime()  # 从RTC获取本地时间    print("Local time: ", tm)  # 打印本地时间led.value(not led.value())        # 反转LED状态time.sleep(1)                     # 休眠1

【Micropython】ESP8266通过NTP同步本地RTC时间

📖通过引入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))

【Micropython】ESP8266通过NTP同步本地RTC时间