墨水屏温度计:1年超长待机,蓝牙同步+趋势曲线

1. 项目功能介绍
普通温湿度计只能实时读数,没法看温湿度变化趋势。带历史曲线的设备,大多需要持续插电,或是联网上传数据到云端。
本项目解决传统温湿度计无历史趋势、曲线设备需插电 / 联网痛点。基于墨水屏本地存储 30 天温湿度曲线,两节 7 号电池供电,蓝牙按需导出数据;待机电流 8µA,标称续航 1 年,实际可达 2~3 年。
- 30 天历史存储:分级采样,近 1 小时 1 分钟 / 点,更早时段压缩至 5 分钟 / 点,最大保存 30 天数据。
- 环境舒适度指示:表情图标直观展示当前环境舒适等级。
- 单键交互:单击清墨水屏残影;双击切换曲线时间范围(1 小时~30 天);长按 3s 开启蓝牙。
- 网页端功能:浏览器查看实时温湿度,支持曲线缩放、CSV 数据导出;首次录入激活码烧录至设备,个人使用免费。
- 低功耗优化:电量显示、墨水屏局部刷新、蓝牙按需广播。

2. 项目属性
本项目为首次公开的完全原创项目,未在其他赛事获奖,未在校内进行答辩。参赛提交为社区复刻版本。
3. 开源协议
- 硬件工程(原理图 / PCB / BOM):CERN-OHL-P-2.0 宽松型开源硬件协议。可自由学习、修改、打样与商用,仅需保留原作者版权声明与协议出处,衍生设计无需开源。
- 墨水屏驱动程序、Web 上位机前端、ChaCha20 密钥注册机 keygen、3D 打印外壳模型:MIT 协议。
- 完整固件:保留作者版权,暂时没有计划开放源码,以预编译 .hex 文件形式提供社区版。个人用户可免费激活注册、功能完整无限制;允许个人以学习为目的反编译、逆向,但固件本身及逆向所得成果均不得二次发布,禁止商用。
4. 硬件部分
单芯片集成
主控选用 CH584F(RISC-V,78MHz,内置 BLE5.4),片上资源包含 504KB Flash(448KB 用户可用)、96KB SRAM。芯片统一完成墨水屏 SPI 驱动、I²C 传感器采集、电池电压 ADC 采样、RTC 定时唤醒与蓝牙通信;除传感器、屏幕外,核心外围仅需双晶振、DCDC 电感与射频匹配网络。
通过减少器件数量优化 BOM 成本与静态功耗,实现 8µA 待机,整机物料成本约 55 元。
支持量产硬件裁剪:无蓝牙版本可省外部晶振,改用内部时钟;也可移除 DCDC 电感切换线性供电,以功耗上升换取更低物料成本。

天线与射频匹配
2.4 GHz 天线按官方参考设计布局:正反面净空、馈线按 50 Ω 阻抗控制,馈点预留 PI 型匹配网络。
射频布板完成后,用矢量网络分析仪实测馈点阻抗,据此计算 PI 网络容感值并完成匹配(完整调试流程另成一篇)。BLE 需外部 32 MHz 高速晶振,低功耗采用片内 DCDC 加外接功率电感。

墨水屏驱动
选用 4.2 寸 400×300 墨水屏,搭载 SSD1619A 显示控制器,24Pin 上接触 FPC 连接器(注意:不可选用下接触版本,否则无法装配)。
屏幕通过 SPI 总线与主控通信。为保证信号完整性:SPI 时钟线串联 22Ω 源端匹配电阻;时钟、数据信号线采用包地布线,抑制高速信号过冲与串扰。

传感器热隔离与误差抑制
支持 AHT20 / SHT40 两种传感器硬件兼容。 板载热源发热、环境凝露均会造成温湿度测量偏差,从 PCB 布局到外壳结构做三层误差抑制设计:
- PCB 布局:传感器放置在板边,通过开槽切断 PCB 平面热传导;开槽位置保留少量连接筋维持板材强度,避免断裂。
- 铜皮处理:传感器区域不铺设连续铜皮,减少铜面蓄热,同时降低凝露附着概率。
- 外壳结构:传感器置于独立隔仓,侧边开设通气孔与外界空气连通;若有条件应增设第二通气孔形成自然对流,提升环境交换效率。

外壳结构与装配
- 外壳:3D 打印,分层堆叠装配(屏幕 / PCB 托盘 / 按键 / 电池 / 后盖)
- 建模阶段开展装配仿真、干涉检查,提前规避装配冲突
- 完整 3D 模型作为附件交付

图01:全套零件全家福 |
图02:装配4.2寸墨水屏 |
图03:叠放PCB与内部托盘 |
图05:装入橙色按键 |
图06:装配PCB与7号电池 |
图07:合上外壳上盖 |
图08:整机装配完成 |
图09:外壳结构仿真,无干涉 |
低功耗设计与续航
整机低功耗主要依托器件本身特性实现,未额外增加专用低功耗硬件电路。墨水屏在静态无刷新状态下功耗接近零,主控待机电流实测 8 µA。下表为各动作对应的功耗实测值;采样、刷新与蓝牙启停的软件调度策略详见后续软件章节。
| 动作 | 耗电 |
|---|---|
| 主控待机 | 8 µA |
| 单次温湿度采样 | 0.3 µAh |
| 墨水屏局部刷新 | 13 µAh |
| 墨水屏全局刷新 | 16 µAh |
基于上述实测功耗,搭配两节串联 7 号电池(满电 3.2V,容量 1000mAh)进行续航估算:保守标称续航 1 年,实际使用场景可达 2~3 年。
待补:低功耗分析仪实测电流截图。
5. 软件部分
内存规划与两级缓存
片上 RAM 共 96KiB,绘图与局部刷新基线缓存占用约 30KB;实测固件 RAM 占用 93164B,剩余仅约 5.1KB,Flash 占用 170KB/448KB。受限于存储容量,设计两级历史缓存:近 1 小时保留 1 分钟精度原始采样;每小时使用 LTTB 算法将原始数据压缩为 5 分钟粒度点,最多存储 30 天,存储空间满自动淘汰旧数据。相比全量存储压缩约 5 倍;LTTB 保留曲线拐点与极值,避免均值降采样抹平温湿度波动。
- 内存约束:96KiB 片上 RAM,绘图 + 刷新基线占用约 30KB;RAM 余量仅 5.1KB,Flash 170/448KB
- 两级缓存:最近 1h:1 分钟精度;长期历史:LTTB 压缩至 5 分钟粒度
- LTTB 降采样:保留峰谷拐点,优于简单均值平均;总数据压缩约 5 倍
- 图表:RAM 占用分配图、LTTB 压缩效果对比图
TMOS 协作式操作系统与状态机
基于芯片配套 TMOS 协作式任务系统开发;任务由事件 / 定时器唤醒,无独立任务栈,RAM 占用低。协作内核禁止长时间阻塞主循环,约束单次任务时长上限<蓝牙连接间隔 1/2,为防止蓝牙断连和任务饿死,将耗时堵塞任务全部拆分为非阻塞状态机,每次主循环单步执行。
| 耗时操作 | 处理方式 |
|---|---|
| 温湿度采样 | 传感器转换等待分步推进,不阻塞主循环 |
| 墨水屏刷新 | 拆分为复位、等待 BUSY、DMA 分段传输、刷新、休眠五步状态 |
| 历史导出 | 8700 个数据点分多帧发送,支持进度上报、取消、超时保护 |
传感器采样
传感器驱动采用结构体 + 函数指针的抽象接口实现解耦(C 语言模拟面向对象思想)。每种传感器用结构体保存实例地址与状态;总线读写、延时逻辑不硬编码在驱动内部,通过回调函数外部注入。驱动仅依赖这套抽象接口,不绑定具体 I²C 总线实现与主控芯片。
typedef struct {
void *context;
void (*delay_ms)(void *context, uint32_t ms);
int (*write)(void *context, uint8_t addr, const uint8_t *data, size_t len);
int (*read)(void *context, uint8_t addr, uint8_t *data, size_t len);
} sht40_io_t;
typedef struct {
const sht40_io_t *io; // 总线从外部注入
uint8_t address;
} sht40_t;
void SHT40_Init(sht40_t *sensor, const sht40_io_t *io, uint8_t address);
uint32_t SHT40_StartMeasurement(sht40_t *sensor);
uint32_t SHT40_FinishMeasurement(sht40_t *sensor, sht40_data_t *out);运行阶段可注入软件 I²C 实现;主机单元测试时,替换为测试桩,驱动代码无需任何修改。固件开机自动探测传感器,当 AHT20 与 SHT40 同时存在时优先选用 SHT40;未识别到传感器时报错,不写入无效采样数据。周期采样交由 TMOS 调度系统非阻塞分步推进。
屏幕刷新
基于 4.2 寸 SSD1619A 墨水屏搭建分层显示架构,底层屏幕驱动搭配上层 U8G2 绘图;采用函数指针抽象 IO 接口,刷新逻辑拆分为非阻塞状态机。设备深度睡眠断电后墨水屏控制器丢失画面状态,依靠双缓存保存基线图像,唤醒时重灌基线再下发差分刷新,异常自动降级全刷,SSD1619A 驱动开源。
- 分层显示:4.2 寸 SSD1619A 墨水屏底层驱动支持局部 / 全局 / 窗口刷新,上层 U8G2 绘图,提交前转换缓冲区格式
- IO 抽象:函数指针注入实现硬件无关,与传感器驱动架构保持一致
- 状态机分步刷新,刷新期间蓝牙、按键正常响应
- 自适应刷新:按数据时效、窗口跨度调整间隔;仅刷新变化区域,9 次局刷触发一次全刷消残影
- 双缓存机制:保存绘图缓冲区 + 画面基线;深度睡眠断电会清空屏控制器内部画面,唤醒先回写基线图像,再下发差分区域;故障时丢弃基线,降级全局刷新
驱动已开源:https://github.com/createskyblue/ssd1619a-epd
棋盘格刷新测试 |
图像抖动效果 |
4阶灰度显示测试 |
数据持久化
为保存激活码、设备配置等少量关键数据,自研轻量单块存储组件 FlashStore,避免引入键值库 / 文件系统带来的资源开销,组件已开源。
- 极轻量:Cortex‑M0、-Os 编译仅占用约 500 字节 Flash,0 静态 RAM,栈开销约 20 字节,零外部依赖、无状态。
- 掉电安全:采用 A/B 双页备份机制,依次写入两个页面;任意时刻断电至少保留一份完整数据,开机校验并自动修复损坏页面。
- 易移植:仅需实现读、擦、写三个底层回调,整块数据读写;逻辑页可跨多个物理扇区,不限制单块数据大小。
- 方案对比
| FlashStore | FlashDB | LittleFS | |
|---|---|---|---|
| 定位 | 单块可靠配置存储 | 键值数据库 | 文件系统 |
| 掉电保护 | A/B 双页备份 | 事务日志 | 事务 |
| 适用场景 | 配置、密钥,低频写入 | 多键值独立更新 | 文件、日志、大数据 |
- 场景优势:在小 MCU 仅需持久化单块配置数据时,FlashStore 资源占用最低。
- https://github.com/createskyblue/flashstore-ab-partition
蓝牙通信与上位机
蓝牙通信采用三层协议栈,搭配 Web Bluetooth 网页上位机;蓝牙默认关闭,长按按键开启限时广播窗口,不阻塞主循环。
- 三层蓝牙架构:底层基于自定义 GATT 服务实现 SPP 类虚拟串口(RX 写入、TX 通知);中间层 TinyFrame 做字节流帧解析与校验;上层自定义业务协议,路由测量读数、历史导出等指令。
- 网页上位机:Web Bluetooth 免安装,支持实时读数、历史曲线查看 / 缩放平移、CSV 导出、激活码读写。Web BLE 默认最小 MTU 为 20 字节,实际吞吐受浏览器与蓝牙适配器影响,实测速率区间约 15~60KB/s。
- 广播策略:设备名
TH-Plot_<UID前2字节>;长按按键开启 60 秒广播,连接后维持链路,断开重新计时,超时自动关闭;屏幕蓝牙图标仅代表广播处于开启状态。

蓝牙排障经验
记录项目蓝牙调试过程中的典型问题与定位思路,单核 + TMOS 协作调度的约束决定所有业务必须拆分为非阻塞状态机。
| 现象 | 原因与排查 |
|---|---|
| 无法建立连接 | 先用官方蓝牙 Demo 验证硬件链路;蓝牙依赖外部 32MHz 晶振,内部 RC 时钟不可用 |
| 传输速率偏低 | MTU 协商结果偏小,或是蓝牙连接间隔配置过大 |
| 随机断连、链路不稳定 | 大多是 TMOS 任务超时;采用二分法屏蔽任务定位故障点,通过定时器测量最坏执行时间,阻塞流程改造为状态机 |
核心约束:单核 MCU 搭配内置蓝牙协议栈必须使用 TMOS,不支持阻塞式任务,和多核 MCU 可隔离业务负载的方案不同。
历史数据导出
针对 30 天约 35KB 历史数据,采用 ChaCha20 加密传输,搭配类 MQTT QoS2 双向确认分包机制,保证蓝牙导出不丢包、不重复且数据安全。
- 分包传输流程:导出前告知上位机总点数与时间跨度,数据拆分为小包有序推送并实时上报进度;基于类 MQTT QoS2 确认机制,上位机完整接收后回传确认,设备再结束传输。
- 数据保护:传输过程冻结历史写入,防止边发边改;传感器采样、屏幕显示、按键交互保持可用。
- 异常恢复:支持用户主动取消、蓝牙断连、长时间无进度等场景自动恢复,可重新发起导出。
- 传输性能:速率受主机蓝牙适配器影响,实测 15~60+ KB/s,30 天历史数据一般数秒内完成导出。
加密与授权
激活码兼具功能解锁凭证与历史数据加密密钥双重作用,整套机制包含密钥派生、设备激活、加密传输三个环节,并明确安全边界。
- 密钥派生:利用芯片唯一 UID、预置盐与填充数据,通过 ChaCha20 确定性派生一机一码的设备密钥;设备以内部派生密钥为准,不直接使用用户写入的激活码。
- 激活流程:上位机读取设备 UID;开发者离线算号生成激活码;用户蓝牙写入设备,设备校验激活码与内部派生密钥匹配后解锁可选功能;激活码可回读用于上位机解密。
- 加密传输:历史数据导出时设备使用内部密钥加密,每帧生成独立随机 nonce。ChaCha20 流密码严禁复用同一密钥 + nonce 组合,防止相同明文产生重复密文,规避密码分析风险;密文连同 nonce 一并下发;上位机依靠激活码 + nonce 解密密文,无有效激活码无法读取历史数据。
- 防逆向策略:固件逆向可获取派生算法与盐;商业版本依靠芯片读保护、固件加密升级防护;开源测试版公开盐与算法,仅用于学习。
低功耗调试流程
通过分步测量、IO 漏电排查与自动化测试完成低功耗调优;基于 TMOS 统一管理睡眠,在维持约 7µA 睡眠电流的同时保留完整 RAM 上下文。
- 分步功耗标定
- 基准标定:评估板烧官方低功耗固件,采集各睡眠档位参考电流;
- 启动调试窗口:初始化完成后先短暂休眠,稳定供电,同时保留烧录调试入口;
- IO 漏电逐点排查:外设反初始化,合理配置 IO 上下拉 / 数字输入,规避引脚寄生漏电,建立 IO 功耗记录表;
- 先达标后叠加业务:睡眠电流基线调通后,再接入业务逻辑;
- AI 自动化测试:低功耗分析仪配合 MCP 自动烧录、采集电流,设备睡死可外部电源唤醒重烧,无需人工值守。
- 运行时电源管理 TMOS 调度控制进入 / 退出低功耗,回调内处理 IO;睡眠前关闭外设电源域并屏蔽对应中断,唤醒后清除中断 pending,防止误触发;采用 DCDC 供电,动态主频切换(空闲 13MHz / 工作 24MHz),无事件时 RTC 定时唤醒。
- 睡眠模式对比 芯片 Sleep 模式约 7µA,主 RAM 保持供电,唤醒从断点继续执行;对比 ESP32‑S3 同电流级 Deep-sleep,后者 CPU 与大部分 RAM 断电,仅少量 RTC 内存保留,唤醒等价重启,需要状态落盘恢复。
- 电量估算防抖 电池瞬时压降造成电量跳变,电压采样做去极值、中位数多级滤波;开机阶段电量只降不升;仅电压估算,未做电池容量曲线拟合。
6. BOM 清单
基于 30 套小批量打样核算单套均摊成本,同时分析成本构成与量产降本潜力。
| 项目 | 单套成本 |
|---|---|
| PCB 打样 + 贴片物料 + SMT 加工(30 套合计 575 元:打样 71 + 物料 367 + 加工 137) | 约 19.2 元 |
| 4.2 寸墨水屏 | 18 元 |
| 两节 7 号电池 + 电池卡簧 + 磁铁 | 8 元 |
| 3D 打印外壳 | 10 元 |
| 单套合计 | 约 55 元 |
- 成本结构:主要成本来自外购器件,4.2 寸墨水屏约 18 元、温湿度传感器约 5 元;主控芯片成本较低。小批量阶段阻容小件全部机器贴片,单板均摊偏高,属于打样特性。
- 降本潜力:量产采用拼板与大批量 SMT,不含屏幕、传感器的电子单板可降至 10 元以内;墨水屏、传感器等外购件与基础加工费为成本底线,下降空间有限。
- 期待和具备量产能力的伙伴合作,将样机打样成本优化为量产成本。
7. 大赛LOGO验证

8. 项目演示
待补:项目演示视频。