目录
基础资料
基于ESP32C3-CORE开发板:开发板简介
探讨重点
对官方LuatOS-SOC接口文档中eink - 墨水屏操作库功能的复现,进行相关内容的学习及探讨,并简单演示基于WLAN的墨水屏日期显示功能。
参考博文:
合宙ESP32系列|自定义固件|在线云编译|本地编译|Windows|luat_conf_bsp.h|(2)、CORE-ESP32S3编译_打酱油的工程师的博客-CSDN博客
Lua基础|CORE-ESP32C3|eink|日期格式化|os.date|weekarray|tonumber|SOC固件编译|汉字星期|墨水屏:今天星期几?
实现功能
功能2:WLAN连接示例;
功能3: SNTP时间服务器的动态更新时间。
硬件准备
ESP32C3-CORE开发板(经典款)1块,面包板1块,EINK1.54墨水屏。
ESP32C3-CORE开发板pinout
EINK1.54墨水屏
软件版本
CORE-ESP32C3:LuatOS@ESP32C3 base 22.12 bsp V1003 32bit
日志及soc下载工具
luatools 版本:2.1.88
Luatools软件安装目录下存放有各型号的SOC,可用于刷机。
软件使用
接口文档可参考: eink - 墨水屏操作库
接线示意图
显示屏为合宙 1.54寸v2,200x200,快刷屏,SPI标准屏
硬件接线:
显示屏SPI --> CORE-ESP32
GND GND
VCC 3.3V
SCL (IO02)
SDA (IO03)
RES (IO10)
DC (IO06)
CS (IO07)
BUSY (IO11)-IO11默认配置为SPI-FLASH的VDD,需解锁配置为GPIO使用。如不考虑解锁,可选择右侧IO,但后期存在复用冲突风险。
按以上配置,且IO11解锁后,接线示意如下:
IO11解锁教程可参考:
https://blog.csdn.net/Medlar_CN/article/details/128885223
功能1:基于墨水屏的日期显示;
初始化:
V1003版本SOC,墨水屏初始化前需要先初始化SPI设备:
local spi_id=2 --设置spi_id
--注意:eink初始化之前需要先初始化spi
spi.setup(spi_id,nil,0,0,8,20*1000*1000)
--不初始化会显示以下错误:
-- [0;31mE (30865) spi_mam
-- [0;31mE (32424) spi_master: check_trans_valid(679): invalid dev handle[0m
-- [0;31mE (32425) spi_master: check_trans_valid(679): invalid dev handle[0m
-- [0;31mE (32426) spi_master: check_trans_valid(679): invalid dev handle[0m
墨水屏初始化并设置全局刷新:
eink.model(eink.MODEL_1in54)
log.info("eink.setup",eink.setup(0, 2,11,10,6,7)) --设置全局刷新
eink.setWin(200, 200, 2)
--稍微等一会,免得墨水屏没初始化完成
日期显示需要局部刷新,设置如下:
--eink.model(eink.MODEL_1in54) --若不改变屏幕参数可不执行
--重新配置eink
--显示spi状态及配置epd: D/eink spi setup complete, now setup epd
log.info("eink.setup",eink.setup(1,2,11,10,6,7)) --设置局部刷新
eink.setWin(200, 200, 2)
--稍微等一会,免得墨水屏没初始化完成
日期显示:
os.date函数及汉字字体说明见博文:
Lua基础|CORE-ESP32C3|eink|日期格式化|os.date|weekarray|tonumber|SOC固件编译|汉字星期|墨水屏:今天星期几?_打酱油的工程师的博客-CSDN博客
日期显示代码:
eink.clear(1,0) --解决局部刷新频闪问题
--E/eink only font pointer is allow
--eink.setFont(eink.font_opposansm10_chinese)
eink.setFont(eink.font_opposansm24_chinese) --需编译时选择该字体
--eink.setFont(fonts.get("sarasa_light_24")) --v1003版中不支持该函数
eink.print(0,30,"时间显示测试")
eink.print(5,70,os.date("%Y-%m-%d"))
eink.print(30,110,os.date("%X"))
local weekarray={"日","一","二","三","四","五","六"} --索引从1开始
eink.print(50,150,"星期"..weekarray[tonumber(os.date("%w")+1)])
eink.print(0,190,"恭祝兔年大吉")
eink.show(30,110,0)
功能2:WLAN连接示例;
连接示例代码:
function get_ip()
log.info("wlan", "wlan_init:", wlan.init())
log.info("mode", wlan.setMode(wlan.STATION))
log.info("connect", wlan.connect("你的wlan", "你的wlan密码"))
-- 等待连上路由,此时还没获取到ip
result, _ = sys.waitUntil("WLAN_STA_CONNECTED")
log.info("wlan", "WLAN_STA_CONNECTED", result)
-- 等到成功获取ip就代表连上局域网了
result, data = sys.waitUntil("IP_READY")
log.info("wlan", "IP_READY", result, data)
--等待连接成功消息
sys.wait(2000)
end
功能3:SNTP时间服务器的动态更新时间;
V1003的http库中已集成ntp时间自动同步,成功获得ip后自动连接至ntp服务器并同步更新系统时间。
完成后提示日志中显示:D/sntp time sync done
不再支持采用NTP函数手动同步。
成功同步后的log:
[2023-02-04 01:15:49.692] D/eink spi setup complete, now setup epd
[2023-02-04 01:15:49.695] I/user.eink.setup true
[2023-02-04 01:15:49.801] I/user.e-paper 1.54 Testing Go
[2023-02-04 01:15:54.045] I/user.e-paper 1.54 Testing End
[2023-02-04 01:15:54.451] D/eink spi setup complete, now setup epd
[2023-02-04 01:15:54.451] I/user.eink.setup true
[2023-02-04 01:16:15.114] D/sntp time sync done
最终效果:
Sntp完成同步前 Sntp同步后
完整代码(IO11已解锁状态下):
PROJECT = "wifidemo"
VERSION = "1.0.0"
--测试支持硬件:ESP32C3
--测试固件版本:LuatOS@ESP32C3 base 22.12 bsp V1003 32bit
-- sys库是标配
_G.sys = require("sys")
--[[特别注意, 使用http库需要下列语句]]
_G.sysplus = require("sysplus")
local spi_id=2
--注意:eink初始化之前需要先初始化spi
spi.setup(spi_id,nil,0,0,8,20*1000*1000)
function eink_init()
--eink.model(eink.MODEL_1in54) --若不改变屏幕参数可不执行
--重新配置eink
--显示spi状态及配置epd: D/eink spi setup complete, now setup epd
log.info("eink.setup",eink.setup(1,2,11,10,6,7)) --设置局部刷新
eink.setWin(200, 200, 2)
--稍微等一会,免得墨水屏没初始化完成
sys.wait(100)
eink.clear(1)
eink.show()
end
function eink_init_all_purge()
eink.model(eink.MODEL_1in54)
log.info("eink.setup",eink.setup(0, 2,11,10,6,7)) --设置全局刷新
eink.setWin(200, 200, 2)
--稍微等一会,免得墨水屏没初始化完成
sys.wait(100)
log.info("e-paper 1.54", "Testing Go")
eink.clear()
--画几条线一个圆,显示图形OK
eink.circle(50, 100, 40)
eink.line(100, 20, 105, 180)
eink.line(100, 100, 180, 20)
eink.line(100, 100, 180, 180)
eink.show()
log.info("e-paper 1.54", "Testing End")
end
function get_ip()
log.info("wlan", "wlan_init:", wlan.init())
log.info("mode", wlan.setMode(wlan.STATION))
log.info("connect", wlan.connect("MERCURY_57B3", "madlar##king@@13124"))
-- 等待连上路由,此时还没获取到ip
result, _ = sys.waitUntil("WLAN_STA_CONNECTED")
log.info("wlan", "WLAN_STA_CONNECTED", result)
-- 等到成功获取ip就代表连上局域网了
result, data = sys.waitUntil("IP_READY")
log.info("wlan", "IP_READY", result, data) --成功获得ip后自动连接ntp服务器并同步更新系统时间,完成后提示:D/sntp time sync done
sys.wait(2000)
end
sys.taskInit(function()
get_ip() --成功获得ip后自动连接ntp服务器并同步更新系统时间,完成后提示:D/sntp time sync done
--eink_init_all_purge()
eink_init()
while true do
eink.clear(1,0)
--E/eink only font pointer is allow
--eink.setFont(eink.font_opposansm10_chinese)
eink.setFont(eink.font_opposansm24_chinese) --自行编译引入该字体
--eink.setFont(fonts.get("sarasa_light_24")) --v1003中已不支持
eink.print(0,30,"时间显示测试")
eink.print(5,70,os.date("%Y-%m-%d"))
eink.print(30,110,os.date("%X"))
local weekarray={"日","一","二","三","四","五","六"} --索引从1开始
eink.print(50,150,"星期"..weekarray[tonumber(os.date("%w")+1)])
--eink.print(50,150,"星期"..os.date("%w"))
eink.print(0,190,"恭祝兔年大吉")
eink.show(30,110,0)
sys.wait(500)--每秒刷新2次
end
end)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!