OLED 显示屏 (SSD1306/SH1106)
LCD(type=36)是当前单色 LCD/OLED 管理器,与 LCD1602(52)和图形触摸屏 SCREEN_DISPLAY(56)分别配置。当前实现使用 I2C、地址 0x3C;SPI/并行及其他控制器枚举是预留值,不代表已实现对应驱动。
已实现的面板选择
| 配置 width / height | 实际构造的驱动 |
|---|---|
| 128 / 64 | SSD1306 128×64 |
| 128 / 32 | SSD1306 128×32 |
| 72 / 40 | SSD1306 72×40 |
| 64 / 128 | SH1106 128×64;配置值作为旧版选择标记,运行尺寸归一为 128×64 |
其他尺寸目前回退到 SSD1306 128×64,不能据此宣称支持任意分辨率。当前没有通过配置选择 0x3D、SSD1309、ST7567、ST7920 或 PCD8544 的已实现路径。
配置与身份
只允许保存一个 LCD36 配置,导入同样检查。输出使用外设 ID,对照驱动保留的 ID、SDA/SCL 和显示配置;第二个 ID 不能接管已经保留的单例。旧配置含多个 LCD36 时,应先整理配置,不能依赖“最后初始化者生效”。
pins[0] 为 SDA,pins[1] 为 SCL,必须不同并通过当前板型资源检查。21/22 仅是经典 ESP32 的示例,不是所有芯片和开发板的默认推荐。
{
"peripherals": [
{
"id": "oled_01",
"name": "OLED显示屏",
"type": 36,
"enabled": false,
"pinCount": 2,
"pins": [21, 22],
"params": {
"width": 128,
"height": 64,
"interface": 2,
"contrast": 255
}
}
]
}参数直接位于 params 下,没有额外的 params.lcd 层。当前实现将 contrast=0 按默认 255 处理,不能用它表示关闭显示。先核对编译开关、运行时 lcd 功能、内存预算和接线,再明确启用。
规则与脚本
外设执行的 OLED_DISPLAY(actionType=27)接受多行文本:
| 语法 | 含义 |
|---|---|
| 首行 #标题 | 居中标题及分隔线 |
| $ | 传感器缓存模板 |
| $value | 此次 typed OLED_DISPLAY 的接收值 |
| 换行 | 分行显示,最多 6 行,且受屏幕高度和字体限制 |
动作必须指向已启用的 LCD36 外设 ID。已有命令脚本中的 TEXT/DISPLAY 使用自定义文本,SHOW 使用已登记的传感器缓存页面,CLEAR 清屏。SHOW 可指定 -1 或 0–127 页码;-1 使用当前页面,没有接入一个新的自动轮播任务。没有传感器条目时 SHOW 返回失败。
模板解析、来源有效性、配置版本、普通输出持有和驱动结果共同决定动作结果;脚本显示失败会终止该次脚本,不再只记录 FAIL 后继续。
HTTP 接口
写接口要求登录和开发者模式,目标是唯一启用的 LCD36 配置。服务端从当前认证会话取得控制来源,默认手动持有 30 秒。该组旧接口不接受客户端指定 actor/source/operation,也不提供强制接管流程;争用时返回拒绝及控制结果。
| 端点 | 方法 | 表单参数 | 作用 |
|---|---|---|---|
| /api/lcd/text | POST | text;可选 x、y、align 或 line | 坐标或行模式写文本并提交帧 |
| /api/lcd/clear | POST | 无 | 清屏并提交帧 |
| /api/lcd/info | POST | 无 | 显示 IP、Wi-Fi、内存概况、运行时间 |
| /api/lcd/font | POST | font=0/1/2 | 更新后续绘制使用的字体 |
| /api/lcd/status | GET | 无 | 查询软件初始化和显示尺寸信息 |
text 最多 1024 字节且不能含内嵌 NUL;x/y 取 0–255,align 取 1–3,line 按实际行数检查,255 保留为坐标模式。数字须完整有效,拒绝截断后接受的负数、溢出或混合字符串;重复、未知、文件及 query 写参数也会拒绝。
字体 0 是小 ASCII 字体;1/2 的中文字库须同时具备编译及运行时条件,否则回退到 ASCII。字体接口只更新本地绘制状态,不触发物理传输;其结果为 attempted=false、CONTROL_DISPLAY_STATE_UPDATED。
仲裁、传输与维护
规则、命令脚本和 HTTP 写入共享命名目标的普通输出仲裁。活动持有期间其他来源不能绕过它直接修改缓冲区。驱动低层的 clear/print/refresh 等为内部方法;扩展代码应复用已有来源边界和 PM 提交,不直接调用单例写屏。
前台显示请求会实际提交帧,不把旧的 50ms 节流跳过当作传输成功。一次请求的后续 U8g2 数据块在首个 NACK/短写后停止;结果保留真实 attempted 和失败原因。CONTROL_DISPLAY_TRANSPORT_ACKNOWLEDGED 只表示 I2C 传输确认,不代表画面、位置、字符或亮度已经实物验证。
已有开机重申和长期总线恢复维护经过同一个 PM 入口,只在目标没有活动普通输出持有时运行。前台帧失败后,维护暂停,失败请求的缓存内容清除,避免稍后自动重放;明确提交新的成功请求后恢复维护。动作结束和持有期结束不会自动清屏。
验证与资源
分别记录固定文字、各字体与换行、SHOW 缓存页、清屏、断线/NACK及恢复的现场结果。初始化标志或 I2C 地址 ACK 都不能证明屏幕正确显示;未连接设备时保持待验证。
128×64 单色像素缓冲的数据量为 1024 字节,实际 RAM 还包括 U8g2 对象、文本、传感器缓存和总线状态。Flash、堆内存、碎片和实际帧耗时应在指定环境及功能组合下测量,当前文档不提供未经实测的 CPU 百分比或总资源保证。

