154 lines
9.5 KiB
Markdown
154 lines
9.5 KiB
Markdown
# 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)
|