《ESP32-S3使用指南—MicroPython版 V1.0》第十八章 RTC实验

第十八章 RTC实验


       machine.RTC 类是 machine 模块下面的一个硬件类,它用于控制实时时钟(RTC)。实时时钟是一种计算机内部或外部的硬件设备,用于提供计算机系统的当前时间和日期。本章,我们将介绍ESP32-S3的内部实时时钟(RTC)。我们将使用SPILCD模块来显示日期和时间,实现一个简单的实时时钟。

       本章分为如下几个小节:

       18.1 machine.RTC类

       18.2 硬件设计

       18.3 软件设计

       18.4 下载验证


        18.1 machine.RTC类

       machine.RTC是一个硬件类,用于控制实时时钟(RTC)设备。RTC 设备是一种计算机内部或外部的硬件设备,它独立于其他系统操作,能够提供计算机系统的当前时间和日期。实时时钟的主要功能是提供精确的实时时间,可以用于产生年、月、日、时、分、秒等信息。

       通过 Machine.RTC类,用户可以在MicroPython环境下获取和设置RTC的当前时间,以及读取和写入RTC的寄存器。


       1,machine.RTC类的构造方法

       RTC的构造对象方法如下:

class machine.RTC()
使用示例:rtc = RTC()

        返回值:RTC对象。


       2,machine.RTC类的方法


       ①:初始化RTC设备起始时间。

       其方法原型如下:

rtc.init([datatimetuple])

        该方法的参数描述,如下表所示。


表18.1.2 RTC.init方法参数描述


       返回值:RTC对象。


       ②:关闭RTC设备。

       其方法原型如下:

rtc.deinit()

        返回值:无。


       ③:获取当前时间。

       其方法原型如下:

rtc.datetime([datetimetuple])

        返回值:当前时间元组。


        18.2 硬件设计


       1. 例程功能

       本章实验功能简介:通过LCD显示模块实时显示RTC时间,包括年、月、日、时、分、秒等信息。


       2. 硬件资源


       1)XL9555

              IIC_INT-IO0(需在P5连接IO0)

              IIC_SDA-IO41

              IIC_SCL-IO42


       2)SPILCD

              CS-IO21

              SCK-IO12

              SDA-IO11

              DC-IO40(在P5端口,使用跳线帽将IO_SET和LCD_DC相连)

              PWR- IO1_3(XL9555)

              RST- IO1_2(XL9555)


       3)RTC


       3. 原理图

       本章实验使用的RTC为ESP32-S3的片上资源,因此并没有相应的连接原理图。


        18.3 软件设计


       18.3.1 程序流程图

       程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:


图18.3.1.1 程序流程图


       18.3.2 程序解析

       本书籍的代码都在main.py脚本下编写的,读者可在光盘资料下找到对应的源码。RTC实验main.py源码如下:

from machine import Pin,RTC,SPI,I2C
import atk_xl9555 as io_ex
import atk_lcd as lcd
import time
 
 
"""
 * @brief       程序入口
 * @param       无
 * @retval      无
"""
if __name__ == '__main__':
    
    # 初始化LED并输出高电平
    led = Pin(1,Pin.OUT,value = 1)
    # IIC初始化
    i2c0 = I2C(0, scl = Pin(42), sda = Pin(41), freq = 400000)
    # XL9555初始化
    xl9555 = io_ex.init(i2c0)
    
    # 复位LCD
    xl9555.write_bit(io_ex.SLCD_RST,0)
    time.sleep_ms(100)
    xl9555.write_bit(io_ex.SLCD_RST,1)
    time.sleep_ms(100)
    # 初始化SPI
    spi = SPI(2,baudrate = 80000000, sck = Pin(12), mosi=Pin(11), miso=Pin(13))
    # 初始化LCD,lcd = 0为正点原子2.4寸屏幕;lcd = 1为正点原子1.3寸SPILCD屏幕;
    display = lcd.init(spi,dc = Pin(40,Pin.OUT),cs=Pin(21, Pin.OUT),dir=1,lcd=0)
    # 开启背光
    xl9555.write_bit(io_ex.SLCD_PWR,1)
    time.sleep_ms(100)
    # 显示实验信息
    display.string(0, 5, 240, 32, 32, "ESP32-S3",lcd.RED)
    display.string(30, 70, 200, 16, 16, "RTC TEST", lcd.RED)
    display.string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", lcd.RED)
    display.string(30, 110, 200, 16, 16, "Specific:", lcd.RED)
    display.string(30, 130, 200, 16, 16, "Time:", lcd.RED)
    display.string(30, 150, 200, 16, 16, "Date:", lcd.RED)
    # 初始化RTC
    rtc = RTC()
    
    if rtc.datetime()[0] != 2023:
        rtc.datetime((2023, 12, 7, 2, 0, 0, 0, 0))
    
    while True:
 
        data_time = rtc.datetime()
        display.string(110, 110, 200, 16, 16, str(data_time[0:3]), lcd.RED)
        display.string(110, 130, 200, 16, 16, str(data_time[4:7]), lcd.RED)
        display.string(110, 150, 200, 16, 16, str(int(data_time[3])+1), lcd.RED)

       这示例代码主要是在ESP32-S3微控制器上初始化各种硬件接口和设备,包括LED、I2C、SPI、LCD显示屏,以及XL9555芯片和RTC(实时时钟)。

       首先,代码初始化了LED灯并使其输出高电平。然后,它初始化了I2C接口,并使用这个接口初始化了XL9555芯片。接着,代码复位了LCD显示屏,然后初始化了SPI接口和LCD显示屏。在LCD显示屏上,它显示了一些实验信息。

       此后,代码初始化了RTC芯片,如果获取的RTC时间不是2023,那么就设置RTC时间为2023年12月7日。

       最后,代码进入一个无限循环,在这个循环中,它获取RTC的时间,并将其显示在LCD显示屏上。这个显示包括年、月、日等信息。需要注意的是,获取的RTC时间是一个Python元组类型,所以需要使用索引来获取年、月、日等具体的时间信息。同时,这个代码还使用了time.sleep_ms()函数来进行延时操作,以确保操作的正确性和稳定性。


        18.4 下载验证

       将程序下载到开发板后,系统首先获取当前的时间(年、月、日、时、分和秒),然后在SPILCD显示屏上显示当前时间,如下图所示。


图18.5.1 SPILCD显示效果图


请使用浏览器的分享功能分享到微信等