MicroPython[ESP32]:ESP32-S3设置ntp时间同步日期显示,哔哩哔哩粉丝计数,博客实时在线人数

NO.1
内容汇总

ESP32-S3当前进度

  1. 已设置开机连接wifi

  2. 已设置NTP时间同步并显示日期和星期在屏幕(每小时同步一次)

  3. 已设置获取哔哩哔哩粉丝数并显示在屏幕(每10分钟获取一次)(GIF图片)

  4. 已设置现在当前博客实时在线人数(仅占位,尚未设置MQTT,后续设置)(PNG图片)

  5. 已设置建简易3D打印外壳

此图片的alt属性为空;文件名为image-794-1024x767.png

NO.2
屏幕对比

左侧ESP32+2.8寸触摸屏(电容屏)

右侧ESP32-S3+3.5触摸屏(电阻屏)

按照屏幕显示区域分别设置了3D打印外壳

同样的外壳大小,3.5寸的显示区域明显更大,窄边框,显示效果也明显好一些,价格也更贵

 

NO.3
笔记梳理

NTP时间同步

导入NTP时间模块

import ntptime

设置NTP参数

设置UTC时间

ntptime.NTP_DELTA = 3155644800

设置NTP服务器

ntptime.host = 'ntp1.aliyun.com'

修改设备时间

ntptime.settime()

到此NTP时间设置完成

注意事项

  1. NTP时间依赖于网络,请先连接wifi,确保网络畅通

  2. 默认NTP服务器地址为pool.ntp.org,国内适合改用阿里云或者淘宝NTP服务器

  3. settime并非一次就可以设置成功,有时候需要多次,有时间一次,无明显规律,需要做容错处理(try except)

下图为报错信息

此图片的alt属性为空;文件名为image-795-1024x151.png

校准时间后,建议仍然设置8小时使用网络同步一次,因为时间的精确性在7小时左右会有秒级之类的误差(网上看到的)

使用定时器即可

NO.4
定时器

需要设置定时器

  1. 不要使用while Ture来阻塞进程

  2. 不要设置time.sleep来阻塞进程,阻塞画面渲染等

可以使用Timer

from machine import Timer

实例化定时器

tim1 = Timer(1)

设置回调函数

def delay_func(label_date):
  print("delay_func")

执行定时器

tim1.init(period=1000, mode=Timer.PERIODIC, callback=lambda t:delay_func(label_date))

period参数

  1. period为定时时长,单位为毫秒

mode参数

  1. mode=Timer.PERIODIC为循环执行

  2. mode=Timer.ONE_SHOT 为只执行一次

callback参数

  1. callback为回调函数

  2. 想要传参可以使用lambda表达式(不适用的话会默认有一个timer参数,导致传参各种错误)

NO.5
设置组件

设置Lvgl显示组件

  1. 文本

  2. JPG或者PNG图片

  3. GIF动图

组件需要设置x坐标和y坐标

组件需要动态更新文本内容(本地时间日期或者从网络获取粉丝数)

NO.6
遇到的问题

问题汇总

一.文件系统不生效

import fs_driver
fs_drv = lv.fs_drv_t()
fs_driver.fs_register(fs_drv, 'S')

原本可以使用set_src(“S:bilibili.gif”)这样的方式读取存储在闪存中的文件,现在不可以了

不清楚是不是ESP32-S3的问题,或者是Lvgl固件的问题,需要后续插上SD卡后排查

目前的解决方式

读取二进制文件流

try:
    with open('./bilibili.gif', 'rb') as f:
        png_data = f.read()
except:
    print("找不到图片文件...")

二.无法加载中文字体

把需要的中文字符和指定的字体转为bin文件后,无论是fs_driver还是open二进制

这两种方法都失效,无法加载字体指针文件

以下方法无反应

font_cn=lv.font_load("S:./online.bin")

以下方法会报错

# try:
#     with open('./online.bin', 'rb') as f:
#         font_cn = f.read()
# except:
#     print("找不到图片文件...")

设置字体

abel_online.set_style_text_font(font_cn, 0)

解决方法

待搜索引擎查找,或者等SD卡设置后再看

NO.7
获取日期

当设置NTP时间同步成功后

通过以下代码获取日期

mytime=time.localtime()

获取到的结果,0-5为年月日,时分秒

以下函数转化字符串

转化为2023-05-24 23:00:00 这样的字符

其中zero_str为自己加的补零函数

mytime2='%s-%s-%s %s:%s:%s'%(mytime[0],zero_str(mytime[1]),zero_str(mytime[2]),zero_str(mytime[3]),zero_str(mytime[4]),zero_str(mytime[5]))

补零函数

# 补零函数
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.localtime()的第六个数据结果为星级几

可能得结果有0-6,0为星期一,1为星期二以此类推

文案设置

week_arr=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]
week_text=week_arr[mytime[6]]
NO.8
Tips

博客试试在线人数已经写好了样式

就差MQTT JS文件部署到博客,同时ESP32-S3开启MQTT通信,然后动态改变文本即可

希望在开启WIFI+MQTT+LVGL(GIF)+HTTP(GET)的情况下,R16N8的性能可以正常运行

等MQTT连接成功,也可以把哔哩哔哩粉丝计数起一个服务端的MQTT定时查询,只有变化时ESP32-S3才接收消息,这样就不用十分钟请求一次HTTP了

然后加上温湿度传感器+画仪表盘

END.