MicroPython[ESP32-S3]:开启WIFI设置NTP时间同步并显示当前日期和周

bilibili-视频演示

点击本文字,打开哔哩哔哩APP

NO.1
本期功能

本文记录NTP时间同步并显示日期

  1. 开启WIFI

  2. 同步NTP时间

  3. LVGL显示当前日期(年月日时分秒)和周几

img

NO.2
开启WIFI

官网文档

https://docs.micropython.org/en/latest/esp32/quickref.html#networking

文档已有示例,只需要修改对应的wifi名称和密码

ssid为wifi名

key为wifi密码

img

def do_connect():    import network    wlan = network.WLAN(network.STA_IF)    wlan.active(True)    if not wlan.isconnected():        print('connecting to network...')        wlan.connect('ssid', 'key')        while not wlan.isconnected():            pass    print('network config:', wlan.ifconfig())

wifi连接

img

NO.3
同步NTP网络时间

官方文档

https://mpython.readthedocs.io/en/master/library/micropython/ntptime.html

img

MicroPython Lib ntptime源码地址

https://github.com/micropython/micropython-lib/blob/master/micropython/net/ntptime/ntptime.py

img

使用方法

引入依赖

import ntptime

设置时区

ntptime.NTP_DELTA = 3155644800

设置NTP服务器

根据网络情况来

官方默认为pool.ntp.org,可以改为国内源,如阿里,淘宝等

阿里的NTP服务地址 ntp1.aliyun.com

ntptime.host = 'ntp1.aliyun.com'

封装方法

因为NTP同步时间不是每次都能成功,所以要做容错处理

使用try except

def sync_ntp():    print("开始同步网络时间")    import ntptime    try:        ntptime.NTP_DELTA = 3155644800  # 可选 UTC+8偏移时间(秒),不设置就是UTC0        ntptime.host = 'ntp1.aliyun.com'  # 可选,ntp服务器,默认是"pool.ntp.org" 这里使用阿里服务器        ntptime.settime()  # 修改设备时间,到这就已经设置好了    except Exception as e:        print("同步ntp时间错误",repr(e))

同步后查看当前时间

import timelocaltime_now=time.localtime()print("localtime_now",localtime_now)

代码运行

Double bufferILI9488 initialization completedFT6X36 touch IC ready (fw id 0x3 rel 1, lib 300A)connecting to network...network config: ('192.168.1.182', '255.255.255.0', '192.168.1.1', '192.168.1.1')开始同步网络时间localtime_now (2023, 5, 31, 10, 7, 34, 2, 151)

img

time.localtime结果说明

localtime_now(2023, 5, 31, 10, 7, 34, 2, 151)

依次是(年,月,日,时,分,秒,0-6,0-365)

前六位年月日时分秒,需要时获取对应的值即可

0-6代表本周周几,0为周一,1为周二,依次类推

0-365代表本年的第几天,1月1日为0,1月2日为1,依次类推

转换为指定的字符串(年-月-日 时:分:秒)

localtime_now=time.localtime()print("localtime_now",localtime_now)time_str='%s-%s-%s-%s:%s:%s'%(localtime_now[0],localtime_now[1],localtime_now[2],localtime_now[3],localtime_now[4],localtime_now[5])print("time_str",time_str)

运行结果

注意,默认年月日没有补零

也就是会出现 2023-1-1 1:5:3这种时间

但实际上想要展示的是2023-01-01 01:05:03,看起来会舒服一些

localtime_now (2023, 5, 31, 10, 15, 19, 2, 151)time_str 2023-5-31-10:15:19

img

设置补零函数

# 补零函数def zero_str(str_num):    num=int(str_num)    num_str=None    if num>9:        num_str=str_num    else:        num_str="0"+str(str_num)    return num_str

补零效果

time_str 2023-05-31-10:20:32

代码

def zero_str(str_num):    num=int(str_num)    num_str=None    if num>9:        num_str=str_num    else:        num_str="0"+str(str_num)    return num_str
localtime_now=time.localtime()print("localtime_now",localtime_now)# time_str='%s-%s-%s-%s:%s:%s'%(localtime_now[0],localtime_now[1],localtime_now[2],localtime_now[3],localtime_now[4],localtime_now[5])time_str='%s-%s-%s-%s:%s:%s'%(localtime_now[0],zero_str(localtime_now[1]),zero_str(localtime_now[2]),zero_str(localtime_now[3]),zero_str(localtime_now[4]),zero_str(localtime_now[5]))print("time_str",time_str)

img

获取当天星期几

设置列表

week_arr=["星期一","星期二","星期三","星期四","星期五","星期六","星期日"]

直接按索引获取对应的值即可

week_arr=["星期一","星期二","星期三","星期四","星期五","星期六","星期日"]week_text=week_arr[localtime_now[6]]

值为

week_text 星期三

img

NO.4
LVGL显示文字

获取屏幕实例并清屏

每次启动之后先把屏幕清空

scr = lv.scr_act()scr.clean()

创建LVGL Label(文本)

label_date = lv.label(scr)

设置文本内容

label_date.set_text("str")

设置文本显示在屏幕的x坐标50,y坐标80

备注:横屏为480*320

label_date.set_x(50)label_date.set_y(80)

设置日期显示

# 补零函数def zero_str(str_num):    num=int(str_num)    num_str=None    if num>9:        num_str=str_num    else:        num_str="0"+str(str_num)    return num_str
localtime_now=time.localtime()time_str='%s-%s-%s-%s:%s:%s'%(localtime_now[0],zero_str(localtime_now[1]),zero_str(localtime_now[2]),zero_str(localtime_now[3]),zero_str(localtime_now[4]),zero_str(localtime_now[5]))
scr = lv.scr_act()scr.clean()
label_date = lv.label(scr)label_date.set_text(time_str)label_date.set_x(50)label_date.set_y(80)

实际效果

img

同样的,显示今天周几

代码如下

localtime_now=time.localtime()week_list=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]week_str=week_list[localtime_now[6]]
label_week = lv.label(scr)label_week.set_text(week_str)label_week.set_x(50)label_week.set_y(50)

实际效果

img

现在还不能显示中文

没有经过中文字体处理,会显示乱码

img

NO.5
Tips

到此为止,已经实现NTP同步,并且显示日期和星期

后期再整理

  1. 定时器,时间按秒刷新文字

  2. 设置中文字体,如沐瑶手写体并展示在屏幕

往期文章参考

MicroPython[ESP32-S3]:刷入LVGL+MicroPython固件支持16M 外扩flash/8M PSRAM

MicroPython[ESP32-S3]:使用esptool刷入固件,支持lvgl

MicroPython[ESP32-S3]:LVGL点亮屏幕并设置触摸事件