10 eink
作者:沈园园 | 最后修改:2026-04-14
一、概述
eink墨水屏操作库是LuatOS的电子墨水屏驱动库,支持微雪电子多种尺寸和型号的黑白电子墨水屏;
eink 库提供了如下几大类功能:
1、墨水屏初始化配置:支持多种型号的墨水屏初始化;
2、基本图形绘制:直线、圆、矩形、二维码等基本图形的绘制;
3、文本显示:支持中英文字体显示;
4、位图显示:支持 XBM 格式位图显示;
5、二维码生成:支持二维码生成和显示;
6、电池图标绘制:支持电池电量图标绘制;
注意事项:墨水屏刷新速度较慢,不适合频繁更新的场景;
二、演示功能概述
2.1 核心主程序模块
- main.lua - 主程序入口,负责系统初始化和任务调度
- ui_main.lua - 用户界面主控模块,管理页面切换和事件分发
2.2 显示页面模块
- home_page.lua - 主页模块,提供应用入口和导航功能
- eink_page.lua - eink核心库演示模块
- time_page.lua - 时间显示演示模块
2.3 驱动模块
- eink_drv.lua - eink显示驱动模块,基于eink核心库
- key_drv.lua - 按键驱动模块,管理BOOT键和PWR键
三、按键功能说明
3.1 按键消息
"KEY_EVENT" - 按键事件消息,包含按键类型和状态
- boot键事件:
boot_down(按下)、boot_up(释放) - pwr键事件:
pwr_down(按下)、pwr_up(释放)
3.2 按键功能定义
1、主页页面:
- BOOT键:切换选项(eink演示 ↔ 时间显示)
- PWR键:确认进入选中的页面
2、eink演示页面:
- PWR键:返回主页
- BOOT键:无功能
3、时间显示页面:
- BOOT键:切换时间显示格式(共6种格式)
- PWR键:返回主页
四、准备硬件环境

1、Air780EGH核心板 × 1
2、微雪1.54寸墨水屏 × 1 demo所使用的墨水屏购买链接
3、母对母杜邦线 × 8
4、TYPE-C 数据线 × 1
5、Air780EGH核心板和微雪1.54寸墨水屏的硬件接线方式为
- Air780EGH核心板通过 TYPE-C USB 口供电(核心板正面开关拨到 ON 一端),此种供电方式下,VDD_EXT 引脚为 3.3V,可以直接给微雪1.54寸墨水屏供电;
- 为了演示方便,所以 Air780EGH核心板上电后直接通过VDD_EXT引脚给微雪1.54寸墨水屏供电;
- 客户在设计实际项目时,一般来说,需要通过一个 GPIO 来控制 LDO 给配件板供电,这样可以灵活地控制配件板的供电,可以使项目的整体功耗降到最低;
接线方式
| Air780EHM/Air780EHV/Air780EGH核心板 | 墨水屏引脚 |
|---|---|
| 107/GPIO21 | BUSY |
| 25/GPIO26 | RST |
| 23/GPIO2 | DC |
| 22/GPIO1 | CS |
| 86/SPI0CLK | SCK |
| 85/SPI0MOSI | DIN |
| 24/VDD_EXT | VCC |
| GND | GND |
五、准备软件环境
5.1 软件环境
在开始实践本示例之前,先筹备一下软件环境:
1、烧录工具:Luatools 下载调试工具
2、本demo开发测试时使用的固件为LuatOS-SoC_V2018_Air780EGH 1,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试;
3、脚本文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air780EHM_Air780EHV_Air780EGH/demo/ui/eink
4、lib脚本文件:使用Luatools烧录时,勾选 添加默认lib 选项,使用默认lib脚本文件
准备好软件环境之后,接下来查看如何烧录项目文件到Air780EGH核心板,将本篇文章中演示使用的项目文件烧录到Air780EGH核心板中。
5.2 API 介绍
eink - 墨水屏操作库:https://docs.openluat.com/osapi/core/eink/
六、程序结构
ui/eink
│── main.lua
│── ui
│── eink_page.lua
│── home_page.lua
│── time_page.lua
│── ui_main.lua
│── eink_drv.lua
│── key_drv.lua
│── readme.md
6.1 文件说明
1、main.lua:整个项目的入口点。它负责初始化系统环境
2、ui:
eink_page.lua:eink核心库演示模块home_page.lua:主页模块,提供应用入口和导航功能time_page.lua:时间显示演示模块ui_main.lua:用户界面主控模块,管理页面切换和事件分发
3、eink_drv.lua:eink显示驱动模块,基于eink核心库
4、key_drv.lua:按键驱动模块,管理BOOT键和PWR键
七、代码详解
7.1 main.lua
主程序文件 main.lua 是整个项目的入口点。它负责初始化系统环境。
7.2 eink_page.lua
本模块为eink核心库演示功能模块,主要功能包括:
1、展示eink核心库的基本图形绘制功能;
2、演示线、矩形、圆形等基本图形绘制;
3、显示文本和二维码生成功能;
4、提供电池图标显示功能;
local eink_page = {}
--[[
绘制eink演示页面;
绘制eink演示页面的所有图形和UI元素;
@api eink_page.draw()
@summary 绘制eink演示页面的所有图形和UI元素
@return nil
@usage
-- 在UI主循环中调用
eink_page.draw()
]]
function eink_page.draw()
-- 清除绘图缓冲区(使用白色背景)
eink.clear(1, true)
-- 绘制外边框(水平+垂直线组合)
eink.line(5, 5, 195, 5, 0) -- 上边框水平线
eink.line(5, 195, 195, 195, 0) -- 下边框水平线
eink.line(5, 5, 5, 195, 0) -- 左边框垂直线
eink.line(195, 5, 195, 195, 0) -- 右边框垂直线
-- 标题区域(22号英文字体)
eink.setFont(eink.font_opposansm22)
eink.rect(10, 10, 190, 40, 0, 0) -- 标题背景(无斜线)
eink.print(35, 34, "LuatOS-eink", 0) -- 黑色文字
-- 区域分隔线(水平)
eink.line(10, 50, 190, 50, 0) -- 标题与内容分隔线
eink.line(100, 55, 100, 190, 0) -- 左右区域分隔线(垂直)
-- 左侧区域(左半屏)
-- 1. 文本演示,中文目前仅支持12号中文字体
eink.setFont(eink.font_opposansm12_chinese)
eink.print(15, 65, "1. 12中文字体", 0)
eink.print(20, 85, "按PWR键返回", 0)
-- 2. 矩形与线条演示
eink.print(15, 110, "2. 图形演示", 0)
eink.circle(33, 135, 15, 0, 0) -- 空心圆形
eink.circle(73, 135, 15, 0, 1) -- 实心圆形
eink.rect(20, 160, 60, 185, 0, 0) -- 空心矩形
eink.rect(70, 160, 90, 185, 0, 1) -- 实心矩形
-- 右侧区域(右半屏)
-- 3. 二维码演示
eink.print(110, 65, "3. 二维码", 0)
eink.qrcode(115, 70, "https://docs.openluat.com/osapi/core/eink/", 69)
-- 4. 电池与位图演示
eink.print(110, 160, "4. 状态图标", 0)
eink.bat(120, 170, 3750) -- 电池图标
eink.print(150, 180, "电量", 0)
-- 刷新屏幕(不清屏)
eink.show(0, 0, true)
end
--[[
处理按键事件;
根据按键类型执行相应的操作;
@api eink_page.handle_key(key_type, switch_page)
@summary 处理eink页面按键事件
@string key_type 按键类型
@valid_values "pwr_up"
@function switch_page 页面切换回调函数
@return bool 事件处理成功返回true,否则返回false
@usage
-- 在UI主循环中调用
local handled = eink_page.handle_key("pwr_up", switch_page)
]]
function eink_page.handle_key(key_type, switch_page)
log.info("eink_page.handle_key", "key_type:", key_type)
if key_type == "pwr_up" then
-- PWR键:返回首页
switch_page("home")
return true
end
-- BOOT键无功能
return false
end
--[[
页面进入时重置状态;
@api eink_page.on_enter()
@summary 页面进入时重置状态
@return nil
@usage
-- 在页面切换时调用
eink_page.on_enter()
]]
function eink_page.on_enter()
log.info("eink_page", "进入eink演示页面")
end
--[[
页面离开时执行清理操作;
@api eink_page.on_leave()
@summary 页面离开时执行清理操作
@return nil
@usage
-- 在页面切换时调用
eink_page.on_leave()
]]
function eink_page.on_leave()
log.info("eink_page", "离开eink演示页面")
end
return eink_page
7.3 home_page.lua
本模块为主页模块,主要功能包括:
1、提供应用入口和导航功能;
2、显示系统标题和操作提示;
3、管理两个功能选项的选中状态;
4、处理主页面的按键事件;
local home_page = {}
-- 选项区域定义(eink屏幕200x200,需合理布局)
local options = {
{name = "eink_demo", text = "eink演示", x1 = 20, y1 = 80, x2 = 90, y2 = 130, color = 0},
{name = "time_demo", text = "时间显示", x1 = 110, y1 = 80, x2 = 180, y2 = 130, color = 0}
}
-- 当前选中项索引
local selected_index = 1
--[[
绘制主页界面;
绘制主页面所有UI元素,包括选中指示;
@api home_page.draw()
@summary 绘制主页面所有UI元素,包括选中指示
@return nil
@usage
-- 在UI主循环中调用
home_page.draw()
]]
function home_page.draw()
-- 清除绘图缓冲区
eink.clear(1, true)
-- 显示标题
eink.setFont(eink.font_opposansm12_chinese)
eink.rect(10, 10, 190, 45, 0, 0) -- 标题背景框
eink.print(60, 30, "eink演示系统", 0)
-- 显示操作提示
eink.print(30, 65, "BOOT:切换 PWR:确认", 0)
-- 绘制分隔线
eink.line(10, 70, 190, 70, 0)
-- 绘制所有选项框
for i, opt in ipairs(options) do
-- 绘制选项框
if i == selected_index then
-- 选中状态:实心矩形
eink.rect(opt.x1, opt.y1, opt.x2, opt.y2, 0, 1)
eink.print(opt.x1 + 15, opt.y1 + 25, opt.text, 1) -- 白色文字
else
-- 未选中状态:空心矩形
eink.rect(opt.x1, opt.y1, opt.x2, opt.y2, 0, 0)
eink.print(opt.x1 + 15, opt.y1 + 25, opt.text, 0) -- 黑色文字
end
end
-- 绘制底部信息
eink.print(50, 155, "eink核心库演示", 0)
eink.print(60, 175, "微雪1.54寸", 0)
-- 刷新屏幕
eink.show(0, 0, true)
end
--[[
处理主页按键事件;
根据按键类型执行相应的操作;
@api home_page.handle_key(key_type, switch_page)
@summary 处理主页按键事件
@string key_type 按键类型
@valid_values "confirm", "next", "prev", "back"
@function switch_page 页面切换回调函数
@return bool 事件处理成功返回true,否则返回false
@usage
-- 在UI主循环中调用
local handled = home_page.handle_key("next", switch_page)
]]
function home_page.handle_key(key_type, switch_page)
log.info("home_page.handle_key", "key_type:", key_type, "selected_index:", selected_index)
if key_type == "confirm" or key_type == "pwr_up" then
-- 确认键:切换到选中的页面
local opt = options[selected_index]
switch_page(opt.name)
return true
elseif key_type == "boot_up" then
-- BOOT键:切换选项
selected_index = selected_index % #options + 1
return true
elseif key_type == "back" then
-- 返回键:当前主页不需要返回功能
return false
end
return false
end
--[[
页面进入时重置选中状态;
重置选中状态为第一个选项;
@api home_page.on_enter()
@summary 重置选中状态
@return nil
@usage
-- 在页面切换时调用
home_page.on_enter()
]]
function home_page.on_enter()
selected_index = 1 -- 默认选中第一个
log.info("home_page", "进入主页")
end
--[[
页面离开时执行清理操作;
@api home_page.on_leave()
@summary 页面离开时执行清理操作
@return nil
@usage
-- 在页面切换时调用
home_page.on_leave()
]]
function home_page.on_leave()
log.info("home_page", "离开主页")
end
return home_page
7.4 time_page.lua
本模块为时间显示演示功能模块,主要功能包括:
1、使用os.date接口获取当前时间;
2、显示多种时间格式;
3、支持实时时间更新;
local time_page = {}
-- 时间显示状态
local time_state = {
format_index = 1, -- 当前显示格式索引
last_update = 0, -- 最后更新时间
update_interval = 5000, -- 更新间隔(5秒)
display_formats = { -- 时间显示格式列表
{name = "完整格式", format = "%Y年%m月%d日 %H:%M:%S"},
{name = "简洁格式", format = "%Y-%m-%d %H:%M"},
{name = "时间格式", format = "%H:%M:%S"},
{name = "日期格式", format = "%Y/%m/%d"},
{name = "星期格式", format = "%A %H:%M"},
{name = "UTC时间", format = "!%Y-%m-%d %H:%M:%S"}
}
}
--[[
获取当前时间字符串
@local
@return string 格式化后的时间字符串
]]
local function get_time_string()
local format_info = time_state.display_formats[time_state.format_index]
return os.date(format_info.format)
end
--[[
绘制时间显示页面;
绘制时间显示页面的所有UI元素;
@api time_page.draw()
@summary 绘制时间显示页面的所有UI元素
@return nil
@usage
-- 在UI主循环中调用
time_page.draw()
]]
function time_page.draw()
-- 清除绘图缓冲区
eink.clear(1, true)
-- 显示标题
eink.setFont(eink.font_opposansm12_chinese)
eink.rect(10, 10, 190, 45, 0, 0) -- 标题背景框
eink.print(70, 30, "时间显示", 0)
-- 显示当前时间
local time_str = get_time_string()
-- 时间显示框
eink.rect(20, 60, 180, 110, 0, 0)
-- 统一使用12号中文字体显示时间
eink.setFont(eink.font_opposansm12_chinese)
-- 根据字符串长度微调显示位置
if #time_str > 20 then
-- 长字符串向左偏移
eink.print(25, 85, time_str, 0)
else
-- 短字符串居中显示
eink.print(30, 85, time_str, 0)
end
-- 显示格式信息
local format_info = time_state.display_formats[time_state.format_index]
eink.print(30, 130, "当前时间格式:", 0)
eink.print(130, 130, format_info.name, 0)
-- 显示格式索引
eink.print(80, 145, string.format("%d/%d",
time_state.format_index,
#time_state.display_formats), 0)
-- 绘制分隔线
eink.line(10, 150, 190, 150, 0)
-- 显示操作提示
eink.print(55, 175, "BOOT键:切换格式", 0)
eink.print(55, 190, "PWR键:返回主页", 0)
-- 刷新屏幕
eink.show(0, 0, true)
-- 更新最后更新时间
time_state.last_update = mcu.ticks()
end
--[[
处理按键事件;
根据按键类型执行相应的操作;
@api time_page.handle_key(key_type, switch_page)
@summary 处理时间页面按键事件
@string key_type 按键类型
@valid_values "boot_up", "pwr_up"
@function switch_page 页面切换回调函数
@return bool 事件处理成功返回true,否则返回false
@usage
-- 在UI主循环中调用
local handled = time_page.handle_key("boot_up", switch_page)
]]
function time_page.handle_key(key_type, switch_page)
log.info("time_page.handle_key", "key_type:", key_type)
if key_type == "boot_up" then
-- BOOT键:切换时间显示格式
time_state.format_index = time_state.format_index % #time_state.display_formats + 1
log.info("time_page", "切换到格式:", time_state.format_index)
return true
elseif key_type == "pwr_up" then
-- PWR键:返回首页
switch_page("home")
return true
end
return false
end
--[[
检查是否需要更新时间;
基于时间间隔判断是否需要刷新显示;
@api time_page.need_update()
@summary 检查是否需要更新时间显示
@return bool 需要更新返回true,否则返回false
@usage
-- 在UI主循环中调用
if time_page.need_update() then
time_page.draw()
end
]]
function time_page.need_update()
local current_time = mcu.ticks()
return (current_time - time_state.last_update) >= time_state.update_interval
end
--[[
页面进入时重置状态;
@api time_page.on_enter()
@summary 页面进入时重置状态
@return nil
@usage
-- 在页面切换时调用
time_page.on_enter()
]]
function time_page.on_enter()
time_state.format_index = 1
time_state.last_update = 0
log.info("time_page", "进入时间显示页面")
end
--[[
页面离开时执行清理操作;
@api time_page.on_leave()
@summary 页面离开时执行清理操作
@return nil
@usage
-- 在页面切换时调用
time_page.on_leave()
]]
function time_page.on_leave()
log.info("time_page", "离开时间显示页面")
end
return time_page
7.5 ui_main.lua
本模块为eink用户界面主控模块,主要功能包括:
1、管理页面切换和事件分发;
2、处理按键事件并调用对应页面的处理函数;
3、协调各页面之间的状态转移;
4、控制界面刷新频率;
-- 加载子页面
local home_page = require "home_page"
local eink_page = require "eink_page"
local time_page = require "time_page"
-- 当前页面状态
local current_page = "home"
local last_page = ""
--[[
切换页面;
从当前页面切换到目标页面;
@api switch_page(new_page)
@summary 执行页面切换操作
@string new_page 目标页面名称
@valid_values "home", "eink_demo", "time_demo"
@return nil
@usage
-- 切换到主页
switch_page("home")
-- 切换到eink演示页面
switch_page("eink_demo")
-- 切换到时间显示页面
switch_page("time_demo")
]]
local function switch_page(new_page)
log.info("switch_page", "从", current_page, "切换到", new_page)
-- 调用旧页面的退出函数
if current_page == "home" and home_page.on_leave then
home_page.on_leave()
elseif current_page == "eink_demo" and eink_page.on_leave then
eink_page.on_leave()
elseif current_page == "time_demo" and time_page.on_leave then
time_page.on_leave()
end
last_page = current_page
current_page = new_page
-- 调用新页面的进入函数
if new_page == "home" and home_page.on_enter then
home_page.on_enter()
elseif new_page == "eink_demo" and eink_page.on_enter then
eink_page.on_enter()
elseif new_page == "time_demo" and time_page.on_enter then
time_page.on_enter()
end
log.info("ui_main", "已切换到页面:", current_page)
end
--[[
处理按键事件;
根据按键类型和当前页面调用对应的处理函数;
@api handle_key_event(key_event)
@summary 处理按键事件并分发到对应页面
@string key_event 按键事件类型
@valid_values "boot_up", "pwr_up"
@return bool 事件处理成功返回true,否则返回false
@usage
-- 在ui_main任务中调用
local handled = handle_key_event("boot_up")
]]
local function handle_key_event(key_event)
log.info("按键事件", "event:", key_event, "当前页面:", current_page)
if key_event == "boot_up" then
-- BOOT键:在主页作为方向键,在时间页面切换格式
if current_page == "home" then
-- 主页:切换选项
return home_page.handle_key("boot_up", switch_page)
elseif current_page == "time_demo" then
-- 时间页面:切换时间格式
if time_page.handle_key then
return time_page.handle_key("boot_up", switch_page)
end
end
-- 其他页面BOOT键无功能
return false
elseif key_event == "pwr_up" then
-- PWR键:确认/返回功能
if current_page == "home" then
return home_page.handle_key("confirm", switch_page)
elseif current_page == "eink_demo" then
-- eink演示页面:返回首页
if eink_page.handle_key then
return eink_page.handle_key("pwr_up", switch_page)
end
elseif current_page == "time_demo" then
-- 时间页面:返回首页
if time_page.handle_key then
return time_page.handle_key("pwr_up", switch_page)
end
end
end
return false
end
--[[
用户界面主任务;
初始化显示和按键驱动,启动UI主循环;
@api ui_main()
@summary 初始化显示和按键驱动,启动UI主循环
@return nil
@usage
-- 在主程序中通过sys.taskInit调用
sys.taskInit(ui_main)
]]
local function ui_main()
-- 调用主页的进入函数
if home_page.on_enter then
home_page.on_enter()
end
while true do
-- 根据当前页面绘制内容
if current_page == "home" then
home_page.draw()
elseif current_page == "eink_demo" then
eink_page.draw()
elseif current_page == "time_demo" then
time_page.draw()
end
local result, key_event = sys.waitUntil("KEY_EVENT")
if result then
-- 处理按键事件
handle_key_event(key_event)
else
-- 超时:时间页面需要刷新显示
if current_page == "time_demo" then
if time_page.need_update then
time_page.draw()
end
end
end
end
end
sys.taskInit(ui_main)
7.6 eink_drv.lua
本模块为eink墨水屏显示驱动功能模块,主要功能包括:
1、初始化微雪1.54寸墨水屏(eink.MODEL_1in54_V2);
2、配置SPI通信参数和设备对象;
local function eink_drv_init()
-- 按接线引脚正确配置GPIO号
local spi_id = 0
local pin_busy = 21
local pin_reset = 26
local pin_dc = 2
local pin_cs = 1
-- 开启异步刷新
eink.async(1)
-- 注意:eink初始化之前需要先初始化spi,使用spi对象方式初始化
spi_eink = spi.deviceSetup(spi_id, pin_cs, 0, 0, 8, 20 * 1000 * 1000, spi.MSB, 1, 1)
-- 初始化接到spi0的eink.MODEL_1in54_V2
eink.init(eink.MODEL_1in54_V2,
{ port = "device", pin_dc = pin_dc, pin_busy = pin_busy, pin_rst = pin_reset },
spi_eink)
-- 设置显示窗口和方向
eink.setWin(200, 200, 0)
eink.clear(1, true)
log.info("eink_drv.init")
end
eink_drv_init()
7.7 key_drv.lua
本文件为按键驱动功能模块,核心业务逻辑为:
1、初始化BOOT键和PWR键的GPIO;
2、配置按键事件的中断处理函数;
3、实现按键防抖功能,防止误触发;
4、对外发布按键消息;
-- 按键定义
local key_boot = 0 -- GPIO0按键(BOOT键)
local key_pwr = gpio.PWR_KEY -- 电源按键
-- 按键事件处理函数
local function handle_boot_key(val)
-- print("key_boot", val)
if val == 1 then
sys.publish("KEY_EVENT", "boot_down")
else
sys.publish("KEY_EVENT", "boot_up")
end
end
local function handle_pwr_key(val)
-- print("key_pwr", val)
if val == 1 then
sys.publish("KEY_EVENT", "pwr_up")
else
sys.publish("KEY_EVENT", "pwr_down")
end
end
--[[
初始化按键GPIO;
配置BOOT键和PWR键的GPIO中断;
@api init()
@summary 配置BOOT键和PWR键的GPIO中断
@return bool 初始化只会返回true
@usage
]]
local function init()
gpio.setup(key_boot, handle_boot_key, gpio.PULLDOWN, gpio.BOTH)
gpio.debounce(key_boot, 50, 0) -- 防抖,防止频繁触发
gpio.setup(key_pwr, handle_pwr_key, gpio.PULLUP, gpio.BOTH)
gpio.debounce(key_pwr, 50, 0) -- 防抖,防止频繁触发
log.info("key_drv", "按键初始化完成")
end
init()
八、显示效果展示
8.1 硬件准备
- 按照接线表连接eink屏幕
- 确保电源连接正确,通过TYPE-C USB口供电
- 确保所有连接正确无误
8.2 软件配置
在main.lua中选择加载对应的驱动模块:
-- 加载eink显示驱动管理功能模块
require "eink_drv"
-- 加载按键驱动管理功能模块
require "key_drv"
-- 加载eink核心库实现的用户界面功能模块
-- 实现多页面切换、按键事件分发和界面渲染功能
-- 包含主页、eink演示页和时间显示页
require "ui_main"
8.3 软件烧录
- 使用Luatools烧录最新内核固件
- 下载并烧录本项目所有脚本文件
- 设备自动重启后开始运行
8.4 功能测试
主页操作
- 设备启动后显示主页
- 使用BOOT键在两个选项间切换
- 使用PWR键进入选中的页面

eink演示页面
- 查看基本图形绘制示例
- 查看文本显示效果
- 查看二维码和电池图标
- 按PWR键返回主页

时间显示页面
- 查看当前时间显示
- 使用BOOT键切换不同的时间格式
- 按PWR键返回主页

8.5 预期效果
- 主页:清晰显示两个选项,选中状态明显
- eink演示页面:图形绘制清晰,布局合理
- 时间显示页面:时间格式切换流畅
- 按键交互:响应及时准确,页面切换正常
九、注意事项
- eink屏幕刷新较慢,请勿频繁切换页面
- 按键操作后请等待屏幕刷新完成
- 长时间运行请确保电源稳定
- 避免在高温高湿环境下使用
十、常见问题
- 屏幕不显示:检查SPI接线,确认电源供电
- 按键无响应:确认GPIO配置正确
- 时间显示异常:检查系统时间设置
- 页面切换异常:检查内存使用情况,适当调整刷新间隔