跳转至

08 eink

作者:沈园园 | 最后修改:2026-04-09

一、概述

eink墨水屏操作库是LuatOS的电子墨水屏驱动库,支持微雪电子多种尺寸和型号的黑白电子墨水屏;

eink 库提供了如下几大类功能:

1、墨水屏初始化配置:支持多种型号的墨水屏初始化;

2、基本图形绘制:直线、圆、矩形、二维码等基本图形的绘制;

3、文本显示:支持中英文字体显示;

4、位图显示:支持 XBM 格式位图显示;

5、二维码生成:支持二维码生成和显示;

6、电池图标绘制:支持电池电量图标绘制;

注意事项:墨水屏刷新速度较慢,不适合频繁更新的场景;

二、演示功能概述

2.1 核心主程序模块

  1. main.lua - 主程序入口,负责系统初始化和任务调度
  2. ui_main.lua - 用户界面主控模块,管理页面切换和事件分发

2.2 显示页面模块

  1. home_page.lua - 主页模块,提供应用入口和导航功能
  2. eink_page.lua - eink核心库演示模块
  3. time_page.lua - 时间显示演示模块

2.3 驱动模块

  1. eink_drv.lua - eink显示驱动模块,基于eink核心库
  2. 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、Air780EPM核心板 × 1

2、微雪1.54寸墨水屏 × 1 demo所使用的墨水屏购买链接

3、母对母杜邦线 × 8

4、TYPE-C 数据线 × 1

5、Air780EPM核心板和微雪1.54寸墨水屏的硬件接线方式为

  • Air780EPM 核心板通过 TYPE-C USB 口供电(核心板正面开关拨到 ON 一端),此种供电方式下,VDD_EXT 引脚为 3.3V,可以直接给微雪1.54寸墨水屏供电;
  • 为了演示方便,所以 Air780EPM 核心板上电后直接通过VDD_EXT引脚给微雪1.54寸墨水屏供电;
  • 客户在设计实际项目时,一般来说,需要通过一个 GPIO 来控制 LDO 给配件板供电,这样可以灵活地控制配件板的供电,可以使项目的整体功耗降到最低;

接线方式

Air780EPM核心板 墨水屏引脚
26/GPIO33 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_Air780EPM 1号固件,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件Air780EPM固件Air780EHM固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试;

3、脚本文件:

4、lib脚本文件:使用Luatools烧录时,勾选 添加默认lib 选项,使用默认lib脚本文件

准备好软件环境之后,接下来查看如何烧录项目文件到Air780EPM核心板,将本篇文章中演示使用的项目文件烧录到Air780EPM/Air780EHM核心板中。

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、提供电池图标显示功能;

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)
    eink.print(15, 65, "1. Font-12px", 0)
    eink.print(20, 85, "PWR:Return", 0)

    -- 2. 矩形与线条演示
    eink.print(15, 110, "2. Graphics", 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. QR Code", 0)
    eink.qrcode(115, 70, "https://docs.openluat.com/osapi/core/eink/", 69)

    -- 4. 电池与位图演示
    eink.print(110, 160, "4. Icons", 0)
    eink.bat(120, 170, 3750) -- 电池图标
    eink.print(148, 178, "Battery", 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 Demo", x1 = 20, y1 = 80, x2 = 90, y2 = 130, color = 0},
    {name = "time_demo", text = "Time Demo", 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_opposansm20)
    -- 显示标题
    eink.rect(10, 10, 190, 45, 0, 0)     -- 标题背景框
    eink.print(50, 35, "eink Demo", 0)

    eink.setFont(eink.font_opposansm12)
    -- 显示操作提示
    eink.print(22, 65, "BOOT:Select PWR:Confirm", 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 + 3, opt.y1 + 25, opt.text, 1)  -- 白色文字
        else
            -- 未选中状态:空心矩形
            eink.rect(opt.x1, opt.y1, opt.x2, opt.y2, 0, 0)
            eink.print(opt.x1 + 3, opt.y1 + 25, opt.text, 0)  -- 黑色文字
        end
    end

    -- 绘制底部信息
    eink.print(50, 155, "eink Core Library", 0)
    eink.print(55, 175, "Waveshare 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 = "Full Format",  format = "%Y/%m/%d %H:%M:%S" },
        { name = "Short Format", format = "%Y-%m-%d %H:%M" },
        { name = "Time Only",    format = "%H:%M:%S" },
        { name = "Date Only",    format = "%Y/%m/%d" },
        { name = "Weekday",      format = "%A %H:%M" },
        { name = "UTC Time",     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_opposansm22)
    eink.rect(10, 10, 190, 45, 0, 0) -- 标题背景框
    eink.print(30, 35, "Time Display", 0)

    eink.setFont(eink.font_opposansm16)
    -- 显示当前时间
    local time_str = get_time_string()

    -- 时间显示框
    eink.rect(15, 60, 185, 110, 0, 0)

    -- 显示时间
    eink.print(21, 90, time_str, 0)

    -- 显示格式信息
    eink.setFont(eink.font_opposansm12)
    local format_info = time_state.display_formats[time_state.format_index]
    eink.print(30, 130, "Format:", 0)
    eink.print(110, 130, format_info.name, 0)

    -- 显示格式索引
    eink.print(90, 145, string.format("%d/%d",
        time_state.format_index,
        #time_state.display_formats), 0)

    -- 绘制分隔线
    eink.line(10, 150, 190, 150, 0)

    -- 显示操作提示
    eink.print(35, 175, "BOOT:Change Format", 0)
    eink.print(35, 190, "PWR: Return to Home", 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 = 33
    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 硬件准备

  1. 按照接线表连接eink屏幕
  2. 确保电源连接正确,通过TYPE-C USB口供电
  3. 确保所有连接正确无误

8.2 软件配置

main.lua中选择加载对应的驱动模块:

-- 加载eink显示驱动管理功能模块
require "eink_drv"

-- 加载按键驱动管理功能模块
require "key_drv"

-- 加载eink核心库实现的用户界面功能模块
-- 实现多页面切换、按键事件分发和界面渲染功能
-- 包含主页、eink演示页和时间显示页
require "ui_main"

8.3 软件烧录

  1. 使用Luatools烧录最新内核固件
  2. 下载并烧录本项目所有脚本文件
  3. 设备自动重启后开始运行

8.4 功能测试

主页操作

  1. 设备启动后显示主页
  2. 使用BOOT键在两个选项间切换
  3. 使用PWR键进入选中的页面

eink演示页面

  1. 查看基本图形绘制示例
  2. 查看文本显示效果
  3. 查看二维码和电池图标
  4. 按PWR键返回主页

时间显示页面

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

8.5 预期效果

  • 主页:清晰显示两个选项,选中状态明显
  • eink演示页面:图形绘制清晰,布局合理
  • 时间显示页面:时间格式切换流畅
  • 按键交互:响应及时准确,页面切换正常

九、注意事项

  1. eink屏幕刷新较慢,请勿频繁切换页面
  2. 按键操作后请等待屏幕刷新完成
  3. 长时间运行请确保电源稳定
  4. 避免在高温高湿环境下使用

十、常见问题

  1. 屏幕不显示:检查SPI接线,确认电源供电
  2. 按键无响应:确认GPIO配置正确
  3. 时间显示异常:检查系统时间设置
  4. 页面切换异常:检查内存使用情况,适当调整刷新间隔