凌晨三点,我盯着智能插座回传的功率曲线上的空洞发呆。冰箱的用电数据在3:00到3:17之间整个断掉,路由器日志显示3:02它自动重启了一次。插座本身一直有电,冰箱也一直在制冷,但云端的用电曲线就是少了一段。这种“有电但没数据”的情况,做智能插座久了总会遇到:Wi-Fi随机抖动、路由器升级、MQTT代理重启,任何一环出错,定时上报的数据就会永久丢失。
为了把用电数据真正做成连续曲线,我给这套基于ESP-01s的开源智能插座加了完整的本地存储与断点续传机制。项目没有用复杂的文件系统,也没有换成带大容量Flash的高端模组,就在ESP-01s的引脚限制下,用一块I2C EEPROM解决了“断网几天不丢数据”的问题。如果你在做智能家居DIY、低成本用电监测,或者任何需要“离线缓存+恢复补传”的采集设备,这篇实战记录应该能帮你少走不少弯路。
1. 一次“有电但没数据”的事故:为什么本地存储是刚需
1.1 功率曲线断档,影响的不只是图表好看
做用电监测的人,最怕的就是数据曲线有缺口。表面上看,缺口只是图上少了一段线,但深层影响是数据的可用性:日用电量统计偏小,峰谷判断失真,如果再用这些数据做设备状态识别,冰箱这类周期性负载的启停特征会被误判为设备停机。
我最初用的方案和别人差不多:MCU每30秒读一次计量芯片的数据,通过MQTT定时上报到服务器,服务器直接入库。这种架构在网络上没有任何保护,一旦链路出现超过重试窗口的抖动,数据就丢了。而且定时上报通常是一锤子买卖,上报失败的逻辑往往只是“这次算了,下次再说”,长时间断网时,设备端连重试的机会都没有。
后来我意识到,问题的本质是: 我们把数据的最终一致性,押在了网络实时性上 。而智能插座恰恰是断网概率最高的设备类型之一——它插在墙上,工作在家庭路由器边缘,随时可能因为信号弱、路由器重启、运营商出问题而离线。
1.2 本地存储是“复盘”的唯一凭据
所以,设备端必须有一块“非易失备忘区”,把采集到的数据先落盘,而不是直接发往云端。这听起来很简单,但真正实现时有一堆细节:掉电写坏了怎么办、EEPROM寿命够不够、恢复上传时怎么去重、时间戳怎么对齐。这些不是堆代码能解决的,需要从存储介质、数据帧、写入时序、上传协议几个层面一起设计。
1.3 这套机制适合谁参考
如果你只想做一个“能显示实时功率”的玩具插座,本文的方案对你来说过度设计了。但如果有以下需求之一,就值得继续看:
- 需要做连续用电曲线分析、设备识别或异常报警;
- 设备部署位置网络不稳,比如出租屋、地下室、阳台边缘;
- 希望断电/断网一段时间后,恢复的数据能无缝补回数据库;
- 想在ESP8266这类低成本、低引脚数的模组上验证一套可复用的离线缓存方案。
2. ESP-01s的存储家底与硬件选型逻辑
2.1 先盘一盘ESP-01s到底有什么
ESP-01s是ESP8266系列里最便宜的模组之一,但做带本地存储的智能插座,它的资源相当紧:
| 资源 | 数量 | 对项目的影响 |
|---|---|---|
| 片内Flash | 1MB或2MB,其中程序区为主 | 剩余空间做文件系统会挤压OTA区域 |
| SRAM | 可用约50KB,实际堆栈紧张 | MQTT缓冲区、Wi-Fi缓冲都要精打细算 |
| 引出GPIO | GPIO0、GPIO2 | I2C、继电器、按键基本要靠复用 |
| UART | 1组(TXD/RXD) | 计量芯片占用后,调试输出需要绕路 |
| 深度睡眠 | 支持 | 本项目常供电,用不上 |
很多人拿到ESP-01s第一反应是“2MB Flash能存很多数据”,实际上这不现实:片内Flash要放固件,还要留OTA升级空间,硬挤文件系统虽然能跑,但一旦分区调整不当,升级固件可能导致文件系统数据被抹掉。更麻烦的是,ESP8266的Flash擦写和无线共存时,长时间写入会引入不确定性。所以在这个项目里,我直接把片内Flash排除在“记录数据的存储区”之外。
2.2 本地存储介质,三个候选方案怎么选
本地存储候选有三类:外挂EEPROM、外挂SPI Flash、片内Flash文件系统。在ESP-01s的引脚限制下,三者差异很明显:
| 存储方案 | 容量 | 接口 | 掉电可靠性 | 实现复杂度 | ESP-01s适用性 |
|---|---|---|---|---|---|
| AT24C256 EEPROM | 32KB | I2C,两根线 | 字节写,掉电不易损坏 | 低,操作像数组 | 推荐 |
| W25Q32 SPI Flash | 4MB | SPI,至少4根线 | 需要页擦除,掉电可能丢页 | 高,要坏块管理 | 引脚不够,不推荐 |
| 片内Flash LittleFS | 1MB左右可用 | 模组内置 | 文件系统层有磨损均衡 | 中,但分区配置繁琐 | 谨慎,OTA冲突风险高 |
448




被折叠的 条评论
为什么被折叠?



