1. 项目概述
这个DIY项目是一个集成了多种功能的智能电表系统,核心是基于STM32单片机开发的硬件平台,能够测量交流电压、电流、环境温湿度等参数,并通过无线方式将数据传输到手机APP进行显示和控制。项目编号"DIY25-231"表明这是一个中等复杂度的嵌入式系统开发案例,适合有一定电子基础的爱好者或工程技术人员实践。
在实际电力监测和智能家居场景中,这种多功能电表非常实用。它不仅能够替代传统电表的基本功能,还能提供环境监测和远程监控能力。我做过几个类似的工业监测项目,发现这种集成设计能大幅降低系统复杂度,特别适合家庭能源管理系统或小型实验室的电力监测需求。
2. 硬件系统设计
2.1 核心控制器选型
STM32系列单片机是这个项目的最佳选择,原因有三:
- 丰富的外设接口:ADC、定时器、通信接口等一应俱全
- 适中的处理能力:足以处理电参数计算和通信协议
- 成熟的开发环境:Keil或STM32CubeIDE都有完善支持
具体型号建议选择STM32F103C8T6,这款芯片价格适中(约10-15元),具有:
- 12位ADC(用于电压电流采样)
- 多个定时器(用于PWM输出和计时)
- USART和SPI接口(用于无线模块通信)
- 足够的Flash和RAM空间(64KB/20KB)
注意:购买开发板时建议选择带CH340G USB转串口芯片的版本,这样可以直接通过USB烧录程序,省去额外购买ST-Link调试器的成本。
2.2 电压电流测量电路
交流电参数测量是项目的核心难点,需要特别注意安全性和精度:
电压测量方案
使用电阻分压+电压互感器组合方案:
- 220V交流电先通过ZMPT101B电压互感器降压
- 再经过精密电阻分压(建议用1%精度的金属膜电阻)
- 最后接入STM32的ADC输入引脚
分压比计算示例:
假设互感器变比是1000:1,次级输出电压0-1V,分压电阻取10kΩ+10kΩ,则:
ADC输入电压 = 220V × (1/1000) × (10k/(10k+10k)) = 0.11V
这样既保证了安全隔离,又能充分利用ADC量程。
电流测量方案
推荐使用ACS712霍尔电流传感器:
- 30A量程的ACS712-30A模块约15-20元
- 输出是2.5V±0.625V的模拟信号(对应-30A到+30A)
- 直接连接STM32的ADC引脚
实测技巧:ACS712存在零漂问题,上电后应先读取10次ADC值取平均作为零点基准,后续测量都减去这个基准值。
2.3 温湿度传感器选型
DHT22是最佳选择,相比DHT11:
- 精度更高(温度±0.5℃,湿度±2%)
- 量程更宽(-40~80℃,0~100%RH)
- 仍然是单总线接口,接线简单
接线示意图:
code复制DHT22 STM32
VCC → 3.3V
DATA → PA0(需接4.7k上拉电阻)
GND → GND
2.4 无线通信模块
根据项目标题中的"无线APP"需求,推荐以下两种方案:
方案一:ESP8266(成本约10元)
- 优点:自带WiFi和TCP/IP协议栈,可直接连接路由器
- 缺点:需要额外编写AT指令控制代码
方案二:HC-05蓝牙模块(成本约25元)
- 优点:配对简单,手机兼容性好
- 缺点:传输距离较短(约10米)
我建议选择ESP8266,因为:
- 可以通过路由器实现远程监控,不限于蓝牙距离
- 已有成熟的Arduino库支持,开发更快捷
- 功耗可以通过深度睡眠模式控制
接线方式:
code复制ESP8266 STM32
TX → PA3 (USART2_RX)
RX → PA2 (USART2_TX)
CH_PD → 3.3V
VCC → 3.3V
GND → GND
3. 软件系统设计
3.1 电压电流计算算法
交流电参数测量需要特别注意采样和计算方法:
c复制#define ADC_REF 3.3f
#define ADC_BITS 4096.0f
// 电压计算
float get_voltage(uint16_t adc_value) {
float adc_voltage = adc_value * (ADC_REF / ADC_BITS);
// 考虑分压比和互感器变比
float real_voltage = adc_voltage * 1000 * 2; // 假设变比1000:1,分压1:2
return real_voltage;
}
// 电流计算
float get_current(uint16_t adc_value) {
float adc_voltage = adc_value * (ADC_REF / ADC_BITS);
// ACS712灵敏度为66mV/A
float current = (adc_voltage - 1.65f) / 0.066f;
return current;
}
重要提示:为了获得准确的RMS值,需要在一个周期内(20ms@50Hz)采样至少32个点,然后计算均方根值。可以使用STM32的定时器触发ADC采样,确保等间隔采样。
3.2 无线通信协议设计
建议采用简单的JSON格式传输数据,例如:
json复制{
"voltage":220.5,
"current":3.2,
"power":704.1,
"temp":25.3,
"humi":45.2
}
ESP8266发送数据的代码框架:
c复制void send_data(float voltage, float current, float temp, float humi) {
char buffer[128];
sprintf(buffer,
"{\"voltage\":%.1f,\"current\":%.1f,\"power\":%.1f,\"temp\":%.1f,\"humi\":%.1f}",
voltage, current, voltage*current, temp, humi);
// 通过AT指令发送到服务器
uart_send("AT+CIPSEND=0,%d\r\n", strlen(buffer));
uart_send(buffer);
}
3.3 手机APP设计方案
对于DIY项目,推荐使用MIT App Inventor快速开发安卓APP,无需专业Java知识:
-
界面设计:
- 添加Web组件用于连接WiFi模块
- 多个Label显示电压、电流、功率等参数
- 折线图组件显示历史数据趋势
-
核心逻辑:
- 连接阶段:输入ESP8266的IP地址和端口
- 数据接收:定时请求或WebSocket实时接收
- 数据解析:使用JSON解析提取各参数值
- 异常报警:设置阈值触发通知
4. 系统集成与调试
4.1 PCB设计建议
虽然可以使用面包板搭建原型,但为了长期稳定运行,建议设计PCB:
- 强电部分(电压测量)与弱电部分保持足够间距
- 交流走线宽度至少1mm(220V@10A需要约1mm宽度)
- 为STM32和传感器添加去耦电容(100nF陶瓷电容)
- 保留SWD调试接口方便固件更新
4.2 校准流程
正式使用前必须进行校准:
-
电压校准:
- 使用标准电压源输入220V
- 测量ADC输出值,计算校准系数
- 在代码中应用校准系数
-
电流校准:
- 使用可调负载(如电炉)产生已知电流
- 对比ACS712输出与钳形表测量值
- 调整代码中的灵敏度参数
-
温湿度校准:
- 将DHT22与标准温湿度计置于同一环境
- 记录偏差值作为软件补偿
4.3 常见问题排查
-
电压测量值跳动大:
- 检查分压电阻精度是否足够
- 增加ADC采样次数求平均
- 在输入端并联0.1μF电容滤波
-
ESP8266连接不稳定:
- 确保供电充足(建议单独3.3V稳压)
- 检查天线是否完全展开
- 尝试降低波特率(如改为9600bps)
-
DHT22读取失败:
- 检查上拉电阻是否连接
- 确保时序严格符合规格书
- 两次读取间隔至少2秒
5. 项目优化与扩展
5.1 功耗优化技巧
如果希望电池供电,可以:
- 设置STM32进入Stop模式,定时唤醒
- 关闭未使用的外设时钟
- 使用低功耗LDO替代开关稳压器
- ESP8266仅在传输时上电
典型代码实现:
c复制void enter_low_power_mode(void) {
// 关闭外设时钟
__HAL_RCC_GPIOA_CLK_DISABLE();
// 配置唤醒源(如RTC定时)
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 唤醒后重新初始化系统
SystemClock_Config();
MX_GPIO_Init();
}
5.2 功能扩展建议
- 电能计量:集成ATT7053AU芯片实现精确电能计量
- 数据存储:添加SPI Flash记录历史数据
- 云端接入:通过MQTT协议上传到阿里云IoT平台
- 报警功能:增加蜂鸣器和LED指示异常状态
- 显示屏:添加0.96寸OLED实现本地显示
5.3 安全注意事项
-
高压隔离:
- 电压互感器初次级间耐压必须≥4000V
- PCB上AC-DC部分开槽增加爬电距离
- 使用绝缘外壳封装整个系统
-
过载保护:
- 在电流测量回路串联自恢复保险丝
- 软件设置电流上限报警
-
防雷措施:
- 在AC输入端添加压敏电阻
- 信号线路上使用TVS二极管
这个项目我实际调试时发现,电压测量部分的稳定性最容易出问题。经过多次试验,最终在ADC输入端添加了一个二阶低通滤波器(截止频率100Hz),有效抑制了高频干扰。另外,ESP8266的固件版本对稳定性影响很大,建议使用最新的AT固件(版本≥1.7.0),并启用硬件流控制(RTS/CTS)防止数据丢失。