【雕爷学编程】MicroPython手册之 ESP32-C3 实时时钟(RTC)

发布于:2023-10-25 ⋅ 阅读:(187) ⋅ 点赞:(0)

在这里插入图片描述
MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

在这里插入图片描述
ESP32-C3是一款由乐鑫科技开发的物联网芯片,它具有以下主要特性:

搭载 RISC-V 32 位单核处理器,时钟频率高达 160 MHz,支持 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE)。
内置 400 KB SRAM,384 KB ROM,支持最大 16 MB 的外置 Flash。
集成了天线开关、射频巴伦、功率放大器、接收低噪声放大器、滤波器、电源管理模块等功能,仅需要 20 余个外围元件。
具有 22 个可编程 GPIO 管脚,支持 ADC、SPI、UART、I2C、I2S、RMT、TWAI 和 PWM。
具有完善的安全机制,包括安全启动、Flash 加密、数字签名和 HMAC 外设、世界控制器模块等。
沿用乐鑫成熟的物联网开发框架 ESP-IDF,支持 Arduino 和 MicroPython 等开源平台。

在这里插入图片描述
MicroPython的ESP32-C3具有实时时钟(RTC)功能,下面是对ESP32-C3实时时钟的主要特点、应用场景以及需要注意的事项的详细解释:

主要特点:

精确时间记录:ESP32-C3的实时时钟(RTC)能够提供精确的时间记录和计时功能。它可以在无需CPU干预的情况下,持续记录时间,包括年、月、日、小时、分钟和秒等信息。

低功耗模式:ESP32-C3的RTC模块支持低功耗模式,可以在主CPU处于休眠状态时继续运行。这使得实时时钟可以在低功耗应用中使用,例如电池供电的设备。

闹钟和定时器功能:实时时钟模块还支持闹钟和定时器功能。用户可以设置闹钟以触发特定事件,或者使用定时器进行定期任务的触发。这对于实现定时操作和事件调度非常有用。

外部中断触发:ESP32-C3的实时时钟模块可以通过外部中断触发来唤醒主CPU。这意味着可以使用实时时钟来监测外部事件或信号,并在发生时立即唤醒系统进行处理。

应用场景:

时间记录和时间戳:实时时钟可以用于记录事件的时间和日期,生成时间戳以用于数据记录、日志记录、事件追踪等应用。它在数据采集、监测系统和日志记录等领域非常有用。

闹钟和定时任务:实时时钟的闹钟功能可以用于触发特定事件,例如定时提醒、报警通知、定时采集数据等。定时器功能可以用于周期性任务的触发,如周期性数据传输、定时控制操作等。

电源管理:实时时钟模块的低功耗特性使其非常适用于电池供电的设备或需要长时间待机的应用。它可以提供实时时钟功能而不会过度消耗电池能量。

系统唤醒和事件触发:通过外部中断触发功能,实时时钟可以用于系统唤醒和事件触发。当外部事件发生时,实时时钟可以发出中断信号,唤醒主CPU并触发相应的处理。

需要注意的事项:

时钟精度:虽然实时时钟可以提供相对精确的时间记录,但其精度可能会受到一些因素的影响,如温度变化、晶体振荡器的稳定性等。在对时间精度要求较高的应用中,需要进行适当的校准和校验。

电源管理:虽然实时时钟模块具有低功耗特性,但在设计中仍需注意电源管理,以确保在待机或低功耗模式下的能耗控制,以延长电池寿命或减少功耗。

闹钟和定时器设置:在使用闹钟和定时器功能时,需要注意设置正确的时间和触发条件,以确保事件的准确触发和执行。

RTC备份电源:为了保持实时时钟的时间记录,通常需要使用RTC备份电源。在设计中需要考虑备份电源的供电和管理,以防止时间记录丢失。

总结:MicroPython的ESP32-C3实时时钟(RTC)具有精确时间记录、低功耗模式、闹钟和定时器功能以及外部中断触发等特点。它适用于时间记录和时间戳、闹钟和定时任务、电源管理以及系统唤醒和事件触发等应用场景。在使用实时时钟时,需要注意时钟精度、电源管理、闹钟和定时器设置以及RTC备份电源的供电和管理。

案例一:获取当前时间

from machine import RTC
import time

rtc = RTC()
while True:
    print("当前时间:", rtc.datetime())
    time.sleep(1)

要点解读:这个程序首先导入了machine模块中的RTC类,然后创建了一个RTC对象。在无限循环中,我们使用rtc.datetime()方法获取当前的日期和时间,并将其打印出来。每次打印之间,程序会暂停1秒。

案例二:设置时间

from machine import RTC
import time

rtc = RTC()
rtc.datetime((2022, 1, 1, 0, 0, 0, 0, 0))  # 设置时间为2022年1月1日0时0分0秒
time.sleep(1)
print("设置后的时间:", rtc.datetime())

要点解读:这个程序首先导入了machine模块中的RTC类,然后创建了一个RTC对象。接着,我们使用rtc.datetime()方法设置时间为2022年1月1日0时0分0秒。设置完成后,程序会暂停1秒,然后打印出设置后的时间。

案例三:实时时钟同步

import network
import time
from machine import RTC
from ntp import NTPClient

# 连接到WiFi网络
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('your_wifi_ssid', 'your_wifi_password')
while not sta_if.isconnected():
    time.sleep(1)

# 初始化RTC和NTP客户端
rtc = RTC()
ntp_client = NTPClient()

# 同步时间
while True:
    ntp_client.query_ntp_server('pool.ntp.org')
    rtc.datetime(ntp_client.get_time())
    print("同步后的时间:", rtc.datetime())
    time.sleep(60)  # 每分钟同步一次

要点解读:这个程序首先连接到指定的WiFi网络,然后初始化RTC和NTP客户端。在无限循环中,我们使用NTP客户端查询NTP服务器并获取当前时间,然后将获取到的时间设置到RTC中。程序每分钟同步一次时间。

案例四:设置RTC并获取当前时间
这个程序将设置RTC并获取当前时间。首先,我们需要导入 machine 和 utime 模块。machine 模块包含一些硬件相关的函数,我们使用其中的 rtc_init 函数来初始化RTC。utime 模块包含一些与时间相关的函数,我们使用其中的 time 函数来获取当前时间。

import machine  
import utime  
  
# 初始化RTC  
rtc = machine.RTC()  
# 设置RTC时间  
rtc.datetime((2023, 7, 29, 10, 10, 0, 5, 30, -1))  
# 获取当前时间  
current_time = utime.localtime()  
print(current_time)

要点解读:这个程序首先初始化了RTC,然后设置了RTC的时间。设置的时间是2023年7月29日10点10分。然后,我们使用 utime.localtime 函数获取了当前的时间。这个程序可以帮助我们确保我们的设备的时间是准确的。

案例五:使用定时器定期更新RTC时间
这个程序将使用定时器定期更新RTC的时间。我们首先导入 machine 和 utime 模块,然后设置一个定时器,每分钟更新一次时间。

import machine  
import utime  
import uos  
  
# 初始化RTC  
rtc = machine.RTC()  
# 设置定时器,每分钟更新一次时间  
timer = machine.Timer(channel=1)  
timer.init(period=60*1000, mode=machine.Timer.PERIODIC, callback=lambda t: rtc.datetime((2023, 7, 29, utime.localtime().tm_hour, utime.localtime().tm_min, 0, 5, 30, -1)))

要点解读:这个程序首先初始化了RTC和定时器。然后,我们设置了定时器,使其每分钟更新一次时间。每次定时器触发时,我们都会设置RTC的时间为当前的时间。这样可以确保我们的设备的时间是实时更新的。

案例六:设置RTC时间并读取当前时间

import machine
import utime

rtc = machine.RTC()

# 设置RTC时间为2023年10月1日 12:30:00
rtc.datetime((2023, 10, 1, 12, 30, 0, 0, 0))

while True:
    # 读取当前RTC时间
    year, month, day, hour, minute, second, _, _ = rtc.datetime()
    print("Current time:", year, month, day, hour, minute, second)
    utime.sleep(1)

要点解读:
代码使用machine.RTC()创建一个RTC对象。
使用rtc.datetime()方法设置RTC的时间,传入一个元组表示年、月、日、小时、分钟、秒等信息。
在循环中,使用rtc.datetime()方法读取当前RTC时间,并将时间的各个字段打印输出。
使用utime.sleep()进行延迟,这里延迟1秒钟。

案例七:倒计时功能

import machine
import utime

rtc = machine.RTC()

# 设置倒计时时间为60秒
countdown_seconds = 60
rtc.alarm(rtc.ALARM0, countdown_seconds * 1000)

while True:
    # 等待RTC触发闹钟
    rtc.alarm_trigger(rtc.ALARM0)
    print("Countdown finished!")
    utime.sleep(1)

要点解读:
代码使用machine.RTC()创建一个RTC对象。
使用rtc.alarm()方法设置一个闹钟,这里使用ALARM0,并传入倒计时的毫秒数。
在循环中,使用rtc.alarm_trigger()方法等待RTC触发闹钟,一旦触发,打印输出"Countdown finished!"。
使用utime.sleep()进行延迟,这里延迟1秒钟。

案例八:定时器功能

import machine
import utime

rtc = machine.RTC()

# 设置定时器触发时间为每隔5秒
interval_seconds = 5
rtc.alarm(rtc.ALARM0, interval_seconds * 1000, periodic=True)

while True:
    # 等待RTC触发定时器
    rtc.alarm_trigger(rtc.ALARM0)
    print("Timer triggered!")
    utime.sleep(1)

要点解读:
代码使用machine.RTC()创建一个RTC对象。
使用rtc.alarm()方法设置一个定时器,这里使用ALARM0,并传入触发时间的毫秒数和设置periodic参数为True表示周期性触发。
在循环中,使用rtc.alarm_trigger()方法等待RTC触发定时器,一旦触发,打印输出"Timer triggered!"。
使用utime.sleep()进行延迟,这里延迟1秒钟。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。

在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到