Dzbj_ESP32-S3_Key/按键版电子吧唧功能变更总结.md
Rdzleo 75586b3744 ESP32-S3按键版电子吧唧功能完整实现
1、按键驱动重构:从GPIO中断改为iot_button组件,支持BOOT/KEY2的单击/双击/长按6种事件;
2、新增按键导航管理器(key_nav):9种上下文状态机,统一分发按键事件到对应界面业务逻辑;
3、BLE模块改造:广播默认关闭由按键触发,新增设备间图片传输(GATT Client),支持扫描配对→MTU协商→分包发送;
4、新增6个UI界面:配对(Peiwang)、更新(Update)、发送等待(ImageShar)、接收等待(ImageReception)、发送中(Sharing)、接收中(Receiving);
5、新增电池指示器组件(battery_ui):支持多界面真实电量显示,3秒渐隐效果;
6、Home界面重构:移除手势事件,改为airhub背景图+电池指示器;
7、Img界面重构:移除触摸事件,新增删除二次确认边框机制;
8、禁用ScreenSet/ScreenChar界面(保留文件),禁用触摸初始化(保留代码可恢复);
9、sleep_mgr简化:移除ScreenSet亮度UI依赖,按键唤醒由key_nav统一处理;
10、新增9张图片资源(airhub背景、配对、传输状态、电池图标等);

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-26 17:35:05 +08:00

6.9 KiB
Raw Permalink Blame History

按键版电子吧唧ESP32-S3功能变更总结

项目背景

本项目从触摸屏版 Dzbj_ESP32_S3 复制而来将触摸手势操作全面替换为两键BOOT + KEY2按键控制适配非触摸屏硬件。


一、按键驱动重构

1.1 iot_button 组件集成

  • 文件: main/button/button.c, main/button/include/button.h
  • 变更: 从原始 GPIO ISR 轮询改为 ESP Component Registry 的 iot_button 组件
  • 新接口: 6 种事件回调注册BOOT/KEY2 × 单击/双击/长按)
  • 参数优化: 长按阈值 1200ms双击检测窗口 300ms

1.2 依赖添加

  • 文件: main/idf_component.yml
  • 新增: button: ">=3.2.0" 依赖

二、按键导航管理器key_nav

2.1 新建模块

  • 文件: main/key_nav/key_nav.c, main/key_nav/include/key_nav.h
  • 功能: 根据当前界面上下文nav_context_t分发 BOOT/KEY2 的单击/双击/长按事件

2.2 导航上下文状态机

NAV_CTX_HOME              → Home 界面
NAV_CTX_IMG               → 图片浏览
NAV_CTX_IMG_DELETE        → 删除确认(第一步)
NAV_CTX_IMG_DELETE_CONFIRM→ 删除二次确认(第二步)
NAV_CTX_PEIWANG           → APP 蓝牙配对
NAV_CTX_UPDATE            → 更新界面
NAV_CTX_IMAGE_SHAR        → 发送方等待配对
NAV_CTX_IMAGE_RECEPTION   → 接收方等待配对
NAV_CTX_SHARING           → 发送方传输中
NAV_CTX_RECEIVING         → 接收方接收中

2.3 按键功能映射

界面 BOOT 单击 BOOT 双击 BOOT 长按 KEY2 单击 KEY2 双击 KEY2 长按
Home → Img - - 开蓝牙→配对 → 接收等待 初始化图片列表→分享等待
Img 下一张 上一张 删除确认 → Home → 接收等待 → 分享等待
删除确认 显示白色边框→二次确认 - - 取消 - -
二次确认 执行删除 - - 取消 - -
配对/分享等待/接收等待 取消→Home - - 取消→Home - -
更新/传输中/接收中 不响应 - - 不响应 - -

2.4 关键设计

  • 所有 iot_button 回调通过 xTaskCreate 派发到独立任务(避免阻塞 esp_timer
  • 屏幕关闭状态下任意按键仅唤醒屏幕,不触发业务逻辑
  • 切图时自动显示电池指示器

三、BLE 模块改造

3.1 BLE 按需启停

  • 文件: main/ble/ble.c, main/ble/include/ble.h
  • 新增接口: ble_start() / ble_stop() / ble_is_active()
  • 行为: 开机默认不广播KEY2 单击后才启动;退出配对界面自动关闭

3.2 BLE 设备间图片传输

  • 新建文件: main/ble/ble_transfer.c, main/ble/include/ble_transfer.h
  • 功能: GATT Client/Server 模式的设备间图片传输
  • 流程:
    • 发送方: 启动扫描 → 发现接收设备 → 连接 → GATT 写入图片数据
    • 接收方: 启动广播 → 等待连接 → 接收图片数据 → 保存到 SPIFFS

3.3 传输后处理

  • APP 传图(通过已有 BLE 服务)→ 自动跳转 Update 界面 → 完成后显示 Img
  • 设备间传图完成 → 自动跳转 Img 显示传输的图片 + 关闭蓝牙
  • 扫描未发现接收设备 → 保持分享界面,等待用户手动退出
  • 图片发送失败 → 自动切换回 Img 界面

四、UI 界面变更

4.1 新增 4 个分享/接收界面

界面 文件 用途 图片
ScreenImageShar ui_ScreenImageShar.c/.h 发送方等待配对 image_shar_png (260×300)
ScreenImageReception ui_ScreenImageReception.c/.h 接收方等待配对 image_reception_png (260×300)
ScreenSharing ui_ScreenSharing.c/.h 发送方传输中 sharing_png (260×310)
ScreenReceiving ui_ScreenReceiving.c/.h 接收方接收中 receiving_png (260×310)

4.2 Img 界面删除确认重设计

  • ContainerDle: 220×220 半透明黑色正圆容器,底部对齐 + 向下偏移 120px露出顶部约 100px
  • 删除图标: S13 图片48×48居中于 68×68 正圆容器 (ui_ImageDel)
  • 两步确认: 第一次按 BOOT → 显示白色正圆边框;第二次按 BOOT → 执行删除
  • 取消: KEY2 单击隐藏容器 + 重置边框

4.3 手势事件移除

  • 移除 ScreenHome、ScreenImg、ScreenPeiwang、ScreenUpdate 的手势回调
  • ScreenImg 保留 LV_EVENT_SCREEN_LOADED 延迟加载逻辑

4.4 ScreenSet 界面禁用

  • CMakeLists.txt 注释掉编译
  • ui.h / ui.c 注释掉相关 include 和初始化

五、电池指示器重设计

5.1 显示策略

  • 文件: main/ui/battery_ui.c, main/ui/battery_ui.h
  • 适用界面: 仅 Home 和 Img
  • 触发时机: 进入 Home/Img 界面、切换图片时
  • 显示时长: 2 秒后自动渐隐500ms fade-out 动画)

5.2 实现方式

  • 药丸形容器50×20黑色背景圆角 10悬浮于屏幕顶部
  • 电池图标使用 LVGL 基元绘制(主体 + 电池帽 + 填充条)
  • 初始状态透明LV_OPA_TRANSPshow_briefly() 时设为不透明 + 启动定时器
  • lv_anim_t 实现 opacity 从 255→0 的渐隐动画
  • battery_ui_update_level() 仅缓存电量值,不主动更新 UI

六、sleep_mgr 适配

  • 移除 KEY2 唤醒回调注册(由 key_nav 统一处理)
  • 保留 sleep_mgr_notify_activity()sleep_mgr_is_screen_off() 接口

七、main.c 更新

  • 移除旧 boot_btn_handler 和 flashlight 引用
  • ble_init() 保留但不自动广播
  • 新增 key_nav_init() 调用
  • 移除 button_on_boot_press() 注册

八、按键时序参数

参数 原值 新值
长按阈值 2000ms 1200ms
双击检测窗口 180ms 300ms
电池显示时长 3000ms 2000ms
渐隐动画时长 - 500ms

九、文件变更汇总

操作 文件
新建 main/key_nav/key_nav.c, main/key_nav/include/key_nav.h
新建 main/ble/ble_transfer.c, main/ble/include/ble_transfer.h
新建 main/ui/battery_ui.c, main/ui/battery_ui.h
新建 main/ui/screens/ui_ScreenImageShar.c/.h
新建 main/ui/screens/ui_ScreenImageReception.c/.h
新建 main/ui/screens/ui_ScreenSharing.c/.h
新建 main/ui/screens/ui_ScreenReceiving.c/.h
新建 main/ui/images/ 下 4 张新图片资源
重写 main/button/button.c, main/button/include/button.h
修改 main/ble/ble.c, main/ble/include/ble.h
修改 main/main.c
修改 main/ui/screens/ui_ScreenHome.c, ui_ScreenImg.c/.h
修改 main/ui/screens/ui_ScreenPeiwang.c, ui_ScreenUpdate.c
修改 main/battery/battery.c
修改 main/sleep_mgr/sleep_mgr.c
修改 main/ui/ui.c, main/ui/ui.h, main/ui/CMakeLists.txt
修改 main/CMakeLists.txt, main/idf_component.yml
禁用 main/ui/screens/ui_ScreenSet.c(注释掉编译)