Files
xInfo/docs/epaper_refresh_mechanism.md
T
2026-08-31 15:05:13 +08:00

154 lines
9.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# xInfo 墨水屏刷新机制与显示管理技术文档
本文档详细介绍了 `xInfo` 环境监控终端中 **DEPG0420 / YMS400300(400×300)电子墨水屏** 的硬件特性、引脚分配、多级刷新机制、显存架构以及应用层智能自适应调度策略。
---
## 1. 硬件规格与物理特性
| 参数项 | 参数值 / 说明 |
| :--- | :--- |
| **屏幕型号** | **DEPG0420 / YMS400300** |
| **物理尺寸** | **91 × 77 mm**(不含排线) |
| **排线规格** | **24 Pin (24P)** |
| **屏幕分辨率** | **400 × 300 像素** |
| **色彩模式** | **黑 / 白 / 红 三色(BWR)** 或 纯黑白模式(BW) |
| **快刷特性** | **三色(BWR)模式下不支持快刷(必须全量三色刷新)**;在纯黑白(BW)模式下支持快速刷新 |
| **显示特性** | 双稳态显示(Bistable Display):断电后画面永久保持,仅在刷新瞬间消耗电量 |
| **通信接口** | 4-Wire SPI 接口(3.3V 供电) |
| **显存占用** | BWR 模式约 30KB(双 15KB FrameBuffer),BW 模式约 15KB |
### 1.1 ESP32-C3 接线定义表
| 墨水屏引脚 | ESP32-C3 引脚 | 功能描述 | 物理特性说明 |
| :--- | :--- | :--- | :--- |
| **BUSY** | **GPIO 1** | 忙碌状态输出 | 高电平表示空闲(Idle),低电平表示忙碌中(Busy) |
| **RST** | **GPIO 2** | 硬件复位引脚 | 低电平复位,高电平正常工作 |
| **DC** | **GPIO 3** | 数据 / 命令控制 | 低电平写命令(CMD),高电平写数据(DATA) |
| **CS** | **GPIO 4** | SPI 片选 (SPI CS) | 低电平有效选通 |
| **CLK (SCL)** | **GPIO 5** | SPI 时钟 (SPI SCK) | 时钟输入 |
| **DIN (SDA)** | **GPIO 6** | SPI 数据输入 (MOSI) | 数据输入 |
| **GND** | **GND** | 电源地 | 系统参考地 |
| **VCC** | **3.3V** | 供电正极 | 3.3V 电源 |
---
## 2. 刷新机制三层架构
```
┌─────────────────────────────────────────────────────────────┐
│ 3. 业务调度层 (App.cpp) │
│ - 数据变化检测 (跳过无意义刷新) │
│ - 红色图层变更指纹检测 │
│ - 连续快刷计数与周期性残影消除算法 │
└──────────────────────────────┬──────────────────────────────┘
│ 调度决策
┌──────────────────────────────▼──────────────────────────────┐
│ 2. 显示管理层 (DisplayManager.cpp) │
│ - 400×300 区域布局与组件排版 │
│ - 双图层/单图层显存分配与色彩切换 (switchColor) │
│ - 中英文矢量/点阵字库渲染 (Unifont 16×16) │
└──────────────────────────────┬──────────────────────────────┘
│ 驱动调用
┌──────────────────────────────▼──────────────────────────────┐
│ 1. 硬件驱动层 (epdiy_bwr: EPD.cpp / EPD_SPI.cpp) │
│ - 全量刷新波形 (Full Refresh Waveform, ~12-15s) │
│ - 快速刷新波形 (Fast Refresh Waveform, ~1.5s, 仅黑白) │
│ - 硬件控制器深度休眠 (Deep Sleep Command 0x10) │
└─────────────────────────────────────────────────────────────┘
```
---
## 3. 底层硬件刷新波形与接口
在驱动层 `components/epdiy_bwr/` 中,针对电子墨水微胶囊粒子的电泳物理特性,实现了两种不同驱动波形:
### 3.1 全量刷新 (Full Refresh)
* **对应 API**:`EPD_HW_Init_GUI()` + `EPD_Display(ImageBW, ImageRW)`
* **耗时**:三色模式 ~12 ~ 15 秒;纯黑白模式 ~3 ~ 4 秒
* **物理过程**:
控制器连续输出多阶段高低反转电压脉冲,驱动黑、白、红三色微胶囊粒子充分迁移。屏幕会经历数次黑白红剧烈翻转闪烁。
* **主要作用**:
1. **驱动红色粒子**:全量波形是激活红色微胶囊电泳迁移的唯一方式(DEPG0420 三色模式必须使用此波形);
2. **彻底清除残影**:中和残留在微胶囊两端的历史电荷,还原纯净白底。
### 3.2 快速刷新 (Fast Refresh)
* **对应 API**:`EPD_HW_Init_Fast()` + `EPD_WhiteScreen_ALL_Fast(ImageBW, ImageRW)`
* **耗时**:**约 1.5 秒**
* **物理过程**:
精简了电荷反转清屏步骤,仅针对黑白粒子施加单向短脉冲快速翻转。
* **主要作用**:
1. **极佳观感**:刷新极快且**完全不闪烁**,仅在**纯黑白模式(BW)**或仅更新黑白数据时适用;
2. **局限性**:**不支持三色红白刷新**,若长时间仅用快刷,屏幕背景会微弱累积灰度残影。
### 3.3 控制器深度休眠 (Deep Sleep)
* **对应 API**:`EPD_DeepSleep()`
* **执行时机**:无论是全刷还是快刷,在数据写入屏幕完成后的第一时间,**必须**调用此函数向控制器发送 `0x10` 深度休眠命令。
* **重要意义**:
1. **极致省电**:休眠状态功耗仅为微安级(µA);
2. **保护屏幕面板**:避免墨水屏长期处于工作电压导致液晶层极化损坏。
---
## 4. 显存与颜色图层管理
系统在编译期通过 `Kconfig`(`CONFIG_DISPLAY_BWR` / `CONFIG_DISPLAY_BW`)进行显存与图层模式切换:
### 4.1 黑白红三色模式 (BWR)
* **显存分配**:
* `ImageBW`:黑白位图缓冲区(400 × 300 / 8 = 15,000 字节),`0`=黑,`1`=白
* `ImageRW`:红白位图缓冲区(15,000 字节),`0`=红,`1`=白/无色
* **绘制流程**:
调用 `switchColor(true)` 切换到红色图层绘制红底顶部横幅;调用 `switchColor(false)` 返回黑白图层绘制常规文字与数值。
### 4.2 纯黑白模式 (BW)
* **显存分配**:
仅分配单块 `ImageBW`(15KB),不分配红色图层,显著降低 ESP32 内存占用,同时原生支持快速刷新。
---
## 5. 应用层自适应刷新策略
在 [`App.cpp`](file:///Users/hongli/Workspace/xInfo/main/App.cpp) 的主循环中,系统整合了一套自适应仲裁算法:
```mermaid
flowchart TD
Start([定时采集本地传感器]) --> Fetch[获取本地温湿度与空气质量数据]
Fetch --> CheckDiff{数据与上一帧相比<br/>是否有变化?}
CheckDiff -- 完全相同 --> Skip[跳过本次刷新<br/>延长墨水屏物理寿命]
CheckDiff -- 有变化 --> CheckMode{当前色彩模式?}
CheckMode -- BWR 三色模式 --> CheckCondition{是否满足全刷条件?<br/>1. 红色图层内容发生变动<br/>2. 快刷连续达阈值 约3小时}
CheckMode -- BW 纯黑白模式 --> DoFast[执行 1.5s 极速快刷<br/>无闪烁更新]
CheckCondition -- 是 --> DoFull[执行全量三色刷新<br/>消除残影 / 渲染红色图层]
CheckCondition -- 否 --> DoFast
DoFull --> Sleep[EPD_DeepSleep 硬件休眠]
DoFast --> Sleep
Skip --> Delay[等待下一个采样周期]
Sleep --> Delay
```
### 策略 1:数据无变化跳刷(Data Diff Bypass)
* **逻辑**:每次采集后,将新生成的 `DashboardData` 与上一帧 `lastDashData_` 进行结构体全字段比对。
* **优势**:如果室内环境稳定无变动,墨水屏完全不工作,极大延长电泳微胶囊的使用寿命。
### 策略 2:红色图层变更感知(Red Fingerprint Tracking)
* **逻辑**:记录上一次全刷时红色区域的文本指纹 `lastRedContent_`(例如顶部 WiFi 连接状态)。
* **优势**:当网络从 `WiFi: Home` 变为 `[Offline]` 时,由于涉及红底白字变化,系统自动由快刷升阶为全量三色刷新,确保红色像素不缺失。
### 策略 3:周期性全刷消残影(Anti-Ghosting Maintenance)
* **逻辑**:维护快速刷新计数器 `fullRefreshCounter_`。
* **计算公式**:
$$\text{maxFastRefreshes} = \frac{180\text{ 分钟}}{\text{CONFIG\_DISPLAY\_REFRESH\_INTERVAL\_MIN}}$$
* **优势**:日常采用 1.5 秒无感快刷,每累积运行约 **3 小时** 强制触发一次全量反转全刷,彻底清空物理残影,兼顾观感与画质纯净度。
---
## 6. 相关配置文件与源码索引
* **硬件引脚分配规范**:[`docs/hardware_specs.md`](hardware_specs.md)
* **应用主控状态机**:[`main/App.cpp`](file:///Users/hongli/Workspace/xInfo/main/App.cpp)、[`main/App.h`](file:///Users/hongli/Workspace/xInfo/main/App.h)
* **UI 布局与图层管理**:[`main/DisplayManager.cpp`](file:///Users/hongli/Workspace/xInfo/main/DisplayManager.cpp)、[`main/DisplayManager.h`](file:///Users/hongli/Workspace/xInfo/main/DisplayManager.h)
* **底层硬件波形驱动**:[`components/epdiy_bwr/src/EPD.cpp`](file:///Users/hongli/Workspace/xInfo/components/epdiy_bwr/src/EPD.cpp)、[`components/epdiy_bwr/include/EPD_SPI.h`](file:///Users/hongli/Workspace/xInfo/components/epdiy_bwr/include/EPD_SPI.h)
* **Kconfig 参数配置**:[`main/Kconfig.projbuild`](file:///Users/hongli/Workspace/xInfo/main/Kconfig.projbuild)