ESP8266 智能供电计费控制系统实战:NFC 刷卡 + OLED + PZEM 计费
这是一个我一直在做的真实项目:智能供电计费控制系统(SmartPower)——用 ESP8266 做核心,实现「刷卡供电、按量计费」的完整闭环。断断续续写了几个月,最近到 v2.4.3,记录一下架构与踩坑。
硬件清单
- 主控:NodeMCU(ESP-12E / ESP8266)
- 显示:SSD1306 OLED(Adafruit SSD1306 + GFX 库)
- 身份识别:RC522 NFC 读卡(余额充值/扣费)
- 计量:PZEM 电能表(功率/电量采集)
- 执行:继电器(合闸/断电)
- 通信:WiFi + WebSocket(Android App 联动)
软件架构:模块化是唯一出路
外设一多,裸奔的 .ino 就是灾难。项目按功能拆成独立头文件:wifi_manager / nfc_manager / pzem_manager / display_manager / relay_manager / billing / websocket_server,主循环只做状态机调度。开发纪律:函数不超过 50 行、单一职责、所有外设操作带超时或错误返回。
核心业务:NFC 余额体系
- 新卡初始化余额为 0 元(v2.4.3 起从默认 100 改为 0,杜绝白嫖)
- 用户先通过 App 给 NFC 卡充值
- 刷卡 → 余额检查(≤0.01 拒绝通电,OLED 提示 “Low bal, topup”)→ 继电器合闸
- PZEM 实时计量 → 按量计费扣款 → 余额不足自动断电
- App 通过 WebSocket 实时看状态、清余额、充值
踩坑记录
- printf float:ESP8266 默认不链接浮点打印,必须加
-Wl,-u,_printf_float,否则 OLED/串口输出全乱 - 资源紧张:外设全开后 Flash 36.8% / RAM 46.1%——字符串能省则省,大数组移 PROGMEM
- 初始化顺序:先配时序(Wire/SPI)再使能外设,RC522 和 OLED 抢 I2C 引脚时尤其要注意
- 电量显示:float 计算直接用
printf_float后精度才正常,别用整数凑
下一步
打算把项目整理后开源(固件 + Android App),同步更新 /esp12f 技术博客。如果你也在折腾 ESP8266/ESP12F,欢迎交流踩坑经验。
发表回复