RTC

RTC(实时时钟)用于跟踪当前的日期和时间,即使在设备断电后也能保持时间。

  • 大多数开发板都内置 RTC
  • 一些板子需要外部电池来保持时间(如 Raspberry Pi Pico 需要 CR2032 电池)

基本用法

from machine import RTC

# 创建 RTC 对象
rtc = RTC()

# 设置时间(年, 月, 日, 星期, 时, 分, 秒, 微秒)
rtc.datetime((2024, 1, 1, 1, 12, 0, 0, 0))  # 2024年1月1日 星期一 12:00:00

# 获取当前时间
time = rtc.datetime()
print(time)

时间格式

RTC 的 datetime() 方法返回一个 8 元组:

  • (年, 月, 日, 星期, 时, 分, 秒, 微秒)
  • 星期:0=星期一,6=星期日
# 解析时间元组
t = rtc.datetime()
year, month, day, weekday, hour, minute, second, microsecond = t
print(f'{year}-{month:02d}-{day:02d} {hour:02d}:{minute:02d}:{second:02d}')
print(f'星期: {weekday}')  # 0=星期一

常用操作

1. 获取当前时间
import machine

rtc = machine.RTC()
t = rtc.datetime()
print(f'当前时间: {t[0]}-{t[1]:02d}-{t[2]:02d} {t[4]:02d}:{t[5]:02d}:{t[6]:02d}')
2. 设置时间
import machine

rtc = machine.RTC()
# 设置为 2024年3月15日 星期五 14:30:00
rtc.datetime((2024, 3, 15, 4, 14, 30, 0, 0))
print('时间已设置')
3. 与 time 模块配合使用
import machine
import time

rtc = machine.RTC()

# 设置 RTC 时间
rtc.datetime((2024, 1, 1, 1, 12, 0, 0, 0))

# 获取格式化时间
t = time.localtime()
print(time.strftime('%Y-%m-%d %H:%M:%S', t))

示例1:实时时钟显示

import machine
import time

rtc = machine.RTC()

# 确保时间已设置
if rtc.datetime()[0] < 2020:  # 如果年份小于 2020,认为时间未设置
    rtc.datetime((2024, 1, 1, 1, 12, 0, 0, 0))
    print('时间已初始化')

while True:
    # 获取当前时间
    t = rtc.datetime()
    # 格式化显示
    time_str = f'{t[0]}-{t[1]:02d}-{t[2]:02d} {t[4]:02d}:{t[5]:02d}:{t[6]:02d}'
    print(f'\r当前时间: {time_str}', end='')
    # 每秒更新一次
    time.sleep(1)

示例2:定时任务

import machine
import time

rtc = machine.RTC()

# 检查是否到达指定时间
def check_time(target_hour, target_minute):
    t = rtc.datetime()
    return t[4] == target_hour and t[5] == target_minute

# 定时任务:每天 8:30 执行
target_hour = 8
target_minute = 30

print(f'等待到 {target_hour:02d}:{target_minute:02d}...')

while True:
    if check_time(target_hour, target_minute):
        print(f'时间到!执行任务...')
        # 这里执行定时任务
        print('任务执行完成')
        # 等待到下一天
        time.sleep(60)  # 避免重复执行
    time.sleep(30)  # 每 30 秒检查一次

注意事项

  • 电池备份:Raspberry Pi Pico 需要外接 CR2032 电池才能在断电后保持时间
  • 精度:内置 RTC 的精度可能有限,长期运行会有误差
  • 初始化:首次使用时需要设置初始时间
  • 时区:RTC 通常使用 UTC 时间,需要自行处理时区转换
  • 闰年:RTC 通常能正确处理闰年

不同板子的 RTC 差异

板子 RTC 特性
Raspberry Pi Pico 需要外接电池,使用 RP2040 内置 RTC
ESP32 内置 RTC,支持 deep sleep 时保持时间
Arduino boards 部分型号需要外部 RTC 模块
STM32 内置 RTC,通常需要备份电池