ESP32-S3当前进度
-
已设置开机连接wifi
-
已设置NTP时间同步并显示日期和星期在屏幕(每小时同步一次)
-
已设置获取哔哩哔哩粉丝数并显示在屏幕(每10分钟获取一次)(GIF图片)
-
已设置现在当前博客实时在线人数(仅占位,尚未设置MQTT,后续设置)(PNG图片)
-
已设置建简易3D打印外壳
左侧ESP32+2.8寸触摸屏(电容屏)
右侧ESP32-S3+3.5触摸屏(电阻屏)
按照屏幕显示区域分别设置了3D打印外壳
同样的外壳大小,3.5寸的显示区域明显更大,窄边框,显示效果也明显好一些,价格也更贵
NTP时间同步
导入NTP时间模块
import ntptime
设置NTP参数
设置UTC时间
ntptime.NTP_DELTA = 3155644800
设置NTP服务器
ntptime.host = 'ntp1.aliyun.com'
修改设备时间
ntptime.settime()
到此NTP时间设置完成
注意事项
-
NTP时间依赖于网络,请先连接wifi,确保网络畅通
-
默认NTP服务器地址为pool.ntp.org,国内适合改用阿里云或者淘宝NTP服务器
-
settime并非一次就可以设置成功,有时候需要多次,有时间一次,无明显规律,需要做容错处理(try except)
下图为报错信息
校准时间后,建议仍然设置8小时使用网络同步一次,因为时间的精确性在7小时左右会有秒级之类的误差(网上看到的)
使用定时器即可
需要设置定时器
-
不要使用while Ture来阻塞进程
-
不要设置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参数
-
period为定时时长,单位为毫秒
mode参数
-
mode=Timer.PERIODIC为循环执行
-
mode=Timer.ONE_SHOT 为只执行一次
callback参数
-
callback为回调函数
-
想要传参可以使用lambda表达式(不适用的话会默认有一个timer参数,导致传参各种错误)
设置Lvgl显示组件
-
文本
-
JPG或者PNG图片
-
GIF动图
组件需要设置x坐标和y坐标
组件需要动态更新文本内容(本地时间日期或者从网络获取粉丝数)
问题汇总
一.文件系统不生效
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卡设置后再看
当设置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]]
博客试试在线人数已经写好了样式
就差MQTT JS文件部署到博客,同时ESP32-S3开启MQTT通信,然后动态改变文本即可
希望在开启WIFI+MQTT+LVGL(GIF)+HTTP(GET)的情况下,R16N8的性能可以正常运行
等MQTT连接成功,也可以把哔哩哔哩粉丝计数起一个服务端的MQTT定时查询,只有变化时ESP32-S3才接收消息,这样就不用十分钟请求一次HTTP了
然后加上温湿度传感器+画仪表盘
END.