当前位置:   article > 正文

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

esp32 rtc

在这里插入图片描述
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、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
ESP32 是一款功能丰富的微控制器,集成了 Wi-Fi 和蓝牙连接功能,适合物联网开发的强大而实惠的平台。ESP32 的主要特点有:

1、处理器:CPU:Xtensa 双核(或单核)32 位 LX6 微处理器,工作频率为 160 或 240 MHz,性能可达 600 DMIPS。超低功耗(ULP)协处理器。
2、内存:520 KiB RAM,448 KiB ROM。
3、无线连接:Wi-Fi:802.11 b/g/n。蓝牙:v4.2 BR/EDR 和 BLE。
4、外设:12 位 SAR ADC 最多支持 18 个通道,2 个 8 位 DAC,10 个触摸传感器,4 个 SPI,2 个 I2S,2 个 I2C,3 个 UART,SD/SDIO/MMC 主机控制器,SDIO/SPI 从设备控制器,以太网 MAC 接口,CAN 总线 2.0,红外远程控制器,电机 PWM,LED PWM 最多支持 16 通道。
4、安全性:硬件加速 AES、SHA-2、RSA、ECC、随机数生成器(RNG)等。
5、可靠性:工作温度范围为 –40°C 到 +125°C。具有动态电压调整和时钟门控等功能,可适应外部条件的变化和降低功耗。
6、灵活性:可作为独立系统运行应用程序或作为主机 MCU 的从设备,通过 SPI / SDIO 或 I2C / UART 接口提供 Wi-Fi 和蓝牙功能。具有高度集成的天线开关、RF balun、功率放大器、低噪声放大器、滤波器和电源管理模块等。

在这里插入图片描述
MicroPython的ESP32 实时时钟(RTC)是一种使用系统的底层硬件支持来执行实时时钟协议的方法。RTC是一个独立的时钟,用于跟踪日期和时间。

RTC的主要特点有:

可以使用任意的GPIO引脚作为SCK(时钟线)、WS(字选择线)和SD(数据线)。
可以设置时钟速率、超时时间、是否使用内部上拉电阻等参数。
可以扫描总线上连接的设备地址,也可以读写设备的寄存器或内存。

RTC的应用场景有:

设置和获取当前的日期和时间,以便进行定时任务或日志记录等功能。
设置和取消闹钟,以便在指定的时间执行某些操作或唤醒系统。
创建一个由实时时钟闹钟触发的IRQ对象,以便在中断发生时执行回调函数。

RTC需要注意的事项有:

在使用RTC之前,需要先导入machine模块,并创建RTC对象。
在使用RTC时,需要注意引脚的选择和连接,避免与其他功能冲突或影响性能。
在使用RTC时,需要注意日期和时间的格式,以及闹钟的设置和管理。

以下是MicroPython的ESP32 实时时钟(RTC)几个实际运用程序参考代码案例:

案例1:使用RTC设置和获取当前的日期和时间,并打印到终端:

from machine import RTC

# 创建一个RTC对象
rtc = RTC()

# 设置当前的日期和时间
rtc.datetime((2021, 9, 26, 2, 10, 23, 0, 0))

# 获取当前的日期和时间
dt = rtc.datetime()

# 打印当前的日期和时间
print('Date: %d-%d-%d' % (dt[0], dt[1], dt[2]))
print('Time: %d:%d:%d' % (dt[4], dt[5], dt[6]))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

案例2:使用RTC设置和取消一个闹钟,并在闹钟到期时打印一条消息:

from machine import RTC

# 创建一个RTC对象
rtc = RTC()

# 设置一个闹钟,在当前时间之后10秒触发
rtc.alarm(0, 10000)

# 定义一个回调函数,在闹钟触发时执行
def alarm_handler(alarm):
    print('Alarm triggered!')

# 创建一个IRQ对象,由实时时钟闹钟触发
rtc.irq(trigger=RTC.ALARM0, handler=alarm_handler)

# 等待一段时间
time.sleep(15)

# 取消正在运行的闹钟
rtc.cancel(0)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

案例3:使用RTC创建一个IRQ对象,并在中断发生时执行回调函数:

from machine import RTC

# 创建一个RTC对象
rtc = RTC()

# 设置当前的日期和时间
rtc.datetime((2021, 9, 26, 2, 10, 23, 0, 0))

# 定义一个回调函数,在中断发生时执行
def irq_handler(irq):
    print('IRQ triggered!')

# 创建一个IRQ对象,由实时时钟闹钟触发
rtc.irq(trigger=RTC.ALARM0, handler=irq_handler)

# 设置一个闹钟,在指定的日期和时间触发
rtc.alarm(0, (2021, 9, 26, 2, 10, 30, 0, 0))

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

这个程序的功能是在2021年9月26日2点10分30秒时,触发一个中断,并执行回调函数,打印一条消息。您可以根据您的需要修改日期和时间,以及回调函数的内容。

案例4:获取当前时间:

import machine
import utime

# 配置RTC
rtc = machine.RTC()

# 获取当前时间
rtc.datetime()
year, month, day, hour, minute, second, _, _ = rtc.datetime()

# 打印当前时间
print("当前时间:{}-{}-{} {}:{}:{}".format(year, month, day, hour, minute, second))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这个示例演示了如何使用MicroPython通过ESP32的实时时钟获取当前时间。首先创建一个RTC对象,然后调用datetime()方法获取当前日期和时间的元组。通过解析元组中的年、月、日、时、分、秒信息,可以获得当前时间。最后打印出当前的日期和时间。

案例5:设置RTC时间:

import machine

# 配置RTC
rtc = machine.RTC()

# 设置RTC时间
year = 2023
month = 9
day = 26
hour = 10
minute = 30
second = 0
rtc.datetime((year, month, day, hour, minute, second, 0, 0))

# 打印设置后的时间
print("已设置时间:{}-{}-{} {}:{}:{}".format(year, month, day, hour, minute, second))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

这个示例演示了如何使用MicroPython通过ESP32的实时时钟设置RTC时间。首先创建一个RTC对象,然后使用datetime()方法设置RTC的日期和时间。可以通过提供一个包含年、月、日、时、分、秒的元组来设置RTC时间。最后打印出已设置的日期和时间。

案例6:延时等待一段时间:

import utime

# 延时等待
delay_seconds = 5
print("开始等待 {} 秒".format(delay_seconds))
utime.sleep(delay_seconds)
print("等待完成")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这个示例演示了如何使用MicroPython在ESP32中使用实时时钟进行延时等待。使用utime.sleep()函数可以指定延时的秒数。在示例中,我们将延时设置为5秒,打印出开始等待和等待完成的信息。实时时钟(RTC)在ESP32上通常需要额外的电池供电来保持时间的持久性。在使用实时时钟之前,需要确保正确连接电池供电并设置好系统的RTC功能。

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

import machine
import utime

# 初始化RTC
rtc = machine.RTC()

# 设置RTC时间
rtc.datetime((2023, 9, 26, 12, 30, 0, 0, 0))  # (年, 月, 日, 时, 分, 秒, 微秒, 星期几)

# 读取当前时间
datetime = rtc.datetime()
print("Current time:", datetime)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在上述示例中,我们使用machine.RTC()初始化ESP32的RTC对象。通过调用rtc.datetime()并传递一个元组来设置RTC的日期和时间。元组的格式为(年, 月, 日, 时, 分, 秒, 微秒, 星期几)。然后,我们使用rtc.datetime()读取当前RTC时间,并将其存储在datetime变量中。最后,我们打印当前时间。

案例8:使用RTC定时唤醒ESP32::

import machine

# 初始化RTC
rtc = machine.RTC()

# 配置RTC定时唤醒
rtc.irq(trigger=machine.RTC.ALARM0, wake=machine.DEEPSLEEP)

# 设置RTC定时唤醒时间
rtc.alarm(machine.RTC.ALARM0, 5000)  # 5000毫秒后唤醒

# 进入深度睡眠
machine.deepsleep()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在上述示例中,我们使用machine.RTC()初始化ESP32的RTC对象。通过调用rtc.irq()并设置trigger参数为machine.RTC.ALARM0和wake参数为machine.DEEPSLEEP来配置RTC定时唤醒。然后,我们使用rtc.alarm()设置RTC定时唤醒的时间,以毫秒为单位(此处设置为5000毫秒,即5秒后唤醒)。最后,我们调用machine.deepsleep()进入深度睡眠状态,等待RTC定时唤醒。

案例9:使用RTC中断处理函数:

import machine

# 初始化RTC
rtc = machine.RTC()

# 配置RTC中断处理函数
def rtc_interrupt_handler():
    print("RTC interrupt occurred!")

rtc.irq(trigger=machine.RTC.ALARM0, wake=machine.DEEPSLEEP)
rtc.alarm(machine.RTC.ALARM0, 5000, handler=rtc_interrupt_handler)

# 进入深度睡眠
machine.deepsleep()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在上述示例中,我们使用machine.RTC()初始化ESP32的RTC对象。然后,我们定义了一个名为rtc_interrupt_handler()的函数作为RTC中断处理函数。在该函数中,我们简单地打印"RTC interrupt occurred!"的消息。通过调用rtc.irq()并设置trigger参数为machine.RTC.ALARM0和wake参数为machine.DEEPSLEEP来配置RTC中断。我们使用rtc.alarm()设置RTC定时唤醒的时间,并传递handler参数来指定RTC中断处理函数。最后,我们调用machine.deepsleep()进入深度睡眠状态,等待RTC定时唤醒和中断触发。当中断触发时,RTC中断处理函数将被调用,并打印相应的消息。

请特别注意,以上示例仅供参考,具体的使用方法可能因不同的硬件平台和MicroPython版本而有所差异。在实际编程中,你需要根据你所使用的硬件和具体需求进行适当的调整。

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/196216
推荐阅读
相关标签
  

闽ICP备14008679号