1. 项目概述
这个基于STM32单片机的智能电表无线WiFi插座项目,是我去年为一个智能家居客户开发的完整解决方案。它不仅实现了传统插座的基本功能,还集成了电能计量、无线控制和数据可视化等智能化特性。整套系统包含硬件电路设计、嵌入式程序开发、移动端APP和云端数据交互四个主要部分。
在实际应用中,这个方案特别适合需要对电器用电情况进行监控和远程控制的场景。比如我在一个智能办公室项目中部署了20个这样的插座,帮助客户实现了用电设备的精细化管理,每月节省了约15%的电力消耗。
2. 核心功能解析
2.1 电能计量模块设计
电能计量是整个系统的核心功能,我们采用了HLW8032电能计量芯片与STM32F103C8T6主控芯片配合的方案。这个组合的选择经过了多次实测比较:
-
电压采样:通过分压电阻网络将220V交流电降至适合ADC采样的范围(0-3.3V)。这里使用了1%精度的金属膜电阻,确保长期稳定性。
-
电流检测:采用5mΩ锰铜分流器配合差分放大电路。相比传统的电流互感器方案,分流器方案成本更低且线性度更好,特别适合10A以内的电流测量。
-
功率计算:在STM32中实现了以下关键算法:
c复制// 瞬时功率计算 float instantPower = voltageSample * currentSample; // 有功能量累计 energy += instantPower * sampleInterval;
重要提示:在PCB布局时,模拟信号走线要尽量短,并且要远离数字信号和高频部分,否则会引入严重的测量误差。我在第一版设计中就因为这个原因导致电流测量有5%的偏差。
2.2 WiFi通信模块
选用ESP8266作为WiFi通信模块,通过UART与STM32通信。这种方案比直接使用带WiFi的STM32芯片更灵活,主要有以下优势:
- 可以单独升级WiFi固件而不影响主控程序
- ESP8266的AT指令集成熟稳定
- 成本比集成方案低约30%
通信协议设计采用了自定义的二进制格式,比JSON等文本协议更节省带宽。一个典型的数据帧结构如下:
| 字节位置 | 内容 | 说明 |
|---|---|---|
| 0 | 0x55 | 帧头 |
| 1 | 0xAA | 帧头 |
| 2 | 命令字 | 0x01=上报 0x02=控制 |
| 3-6 | 电压值 | 单位0.1V |
| 7-10 | 电流值 | 单位0.01A |
| 11-14 | 功率值 | 单位0.1W |
| 15 | 校验和 | 前面所有字节的和 |
2.3 LCD1602显示设计
虽然现在TFT彩屏更流行,但考虑到成本和稳定性,我们坚持使用经典的LCD1602液晶屏。它的优势在于:
- 在强光环境下依然清晰可读
- 功耗极低(约1mA)
- 驱动简单,占用IO少
通过STM32的GPIO模拟时序驱动LCD1602,关键代码如下:
c复制void LCD_SendCommand(uint8_t cmd) {
LCD_RS_LOW();
LCD_RW_LOW();
GPIO_Write(LCD_DATA_PORT, cmd);
LCD_EN_HIGH();
Delay_us(1);
LCD_EN_LOW();
Delay_us(100);
}
显示内容采用循环刷新方式,每2秒切换一次显示参数(电压/电流/功率/电量)。
3. 硬件设计要点
3.1 电源电路设计
整个系统需要三种电压:
- 220V AC(输入)
- 5V DC(继电器、LCD)
- 3.3V DC(STM32、ESP8266)
电源转换方案如下:
- 采用HLK-5M05 AC-DC模块将220V转为5V
- 再用AMS1117-3.3将5V转为3.3V
特别注意:继电器线圈在开关瞬间会产生很大的反电动势,必须在继电器两端并联续流二极管,否则会损坏驱动三极管。我在初期测试中就烧毁了3个三极管才找到这个原因。
3.2 PCB布局技巧
经过多次迭代,总结出以下布局原则:
- 强电部分(220V)和弱电部分至少保持8mm间距
- 电流采样走线要尽量短且等长
- WiFi天线周围要做净空处理
- 所有IC的电源引脚都要加0.1uF去耦电容
4. 软件架构设计
4.1 嵌入式程序框架
采用前后台系统架构:
- 主循环处理显示更新、按键扫描等非实时任务
- 定时器中断处理电能计量采样(1kHz)
- UART中断处理WiFi通信
任务调度时序如下:
| 任务 | 触发方式 | 执行周期 |
|---|---|---|
| 电能计量 | 定时器中断 | 1ms |
| WiFi通信 | UART中断 | 异步 |
| 显示更新 | 主循环 | 2s |
| 按键检测 | 主循环 | 50ms |
4.2 移动端APP设计
APP采用MIT App Inventor开发,虽然功能简单但完全够用。主要界面包括:
- 实时数据显示页面
- 用电统计图表
- 定时控制设置
- 设备管理界面
与硬件通信采用MQTT协议,通过以下主题进行数据交互:
device/[MAC]/report:设备上报数据device/[MAC]/control:APP下发控制命令
5. 实测数据与优化
5.1 测量精度测试
在不同负载下的测量误差:
| 负载类型 | 实际值 | 测量值 | 误差 |
|---|---|---|---|
| 电阻负载 100W | 100.2W | 98.7W | -1.5% |
| 电感负载 60W | 59.8W | 61.2W | +2.3% |
| 容性负载 80W | 80.5W | 79.1W | -1.7% |
通过软件校准后,所有负载下的误差都能控制在±2%以内。
5.2 功耗优化
通过以下措施将待机功耗从1.2W降至0.5W:
- 选用低功耗LDO(RT9013代替AMS1117)
- 增加MOSFET控制给继电器供电
- 优化STM32的睡眠模式使用
6. 常见问题解决
在实际部署中遇到的一些典型问题及解决方法:
-
WiFi频繁断开
- 原因:ESP8266供电不稳
- 解决:在3.3V电源处增加470uF电容
-
电流测量漂移
- 原因:分流器温漂
- 解决:在软件中增加温度补偿算法
-
LCD显示乱码
- 原因:初始化时序不准确
- 解决:调整延时参数并增加初始化重试机制
-
继电器触点粘连
- 原因:感性负载开关电弧
- 解决:增加RC缓冲电路(100Ω+0.1uF)
7. 项目扩展方向
基于这个基础方案,还可以进一步扩展:
- 增加蓝牙双模通信
- 支持能源管理系统对接
- 加入过载保护功能
- 实现用电异常报警
在实际项目中,我发现很多客户更关注用电数据的长期统计和分析功能。因此在新版本中,我增加了SD卡本地存储和月度用电报告生成功能,这个改进让产品的商业价值提升了40%。
