1 系统功能介绍
本设计基于 STM32 单片机,实现了一个智能电表式的无线控制插座系统。该系统能够实时检测交流电压、电流、功率以及电量等关键电气参数,并通过 WiFi 模块 与手机 APP 建立通信,实现远程监控与控制。与传统的插座不同,本设计在电气安全和远程管理方面有明显优势,不仅能够实时采集电气数据,还能在功率超过预设值(200W)时自动切断电源,防止电器过载。同时,用户还可以通过手机 APP 控制继电器开关,实现智能用电管理。
系统主要功能如下:
-
交流电压电流检测
通过电压互感器 TV1005M 和电流互感器 TA1005M 分别检测交流电压和交流电流,并经过信号调理电路输入到 STM32 单片机的 ADC 模块进行采样。 -
参数计算与显示
STM32 对采样数据进行计算,得到交流电压、电流、功率(W)以及电量(kWh)等参数,并将结果通过 WiFi 模块上传到手机 APP,在手机界面上实时显示。 -
功率过载保护
当实时计算的功率值超过 200W 时,系统自动断开继电器,切断电源,防止电器烧毁或引发火灾。当功率低于 200W 时,用户可通过手机 APP 手动控制继电器的通断。 -
远程控制功能
手机 APP 通过发送控制指令与 WiFi 模块通信,指令包括:*
:接通继电器,插座供电。#
:断开继电器,停止供电。
-
运行时间统计
系统记录单片机上电以来的运行时间,APP 上能够实时显示设备运行时长。 -
通信协议
系统采用字符串协议进行数据传输,内容格式为:V:123A:12345P:1234567Q:1234567.89T:123R:1
V:123
表示 123V 交流电压,长度固定 5 位,不足前补零。A:12345
表示 12.345A 电流。P:1234567
表示 1234.567W 功率(缩小 1000 倍传输)。Q:1234567.89
表示 1.23456789 kWh 电量(缩小 1000000 倍传输)。T:1234
表示设备运行时间,单位秒。R:1
表示继电器状态(1=接通,0=断开)。
2 系统电路设计
2.1 单片机最小系统电路
本系统的核心为 STM32F103C8T6,其具有:
- 多通道 ADC,可对电压和电流信号进行高速采样。
- UART 接口,可与 ESP8266 WiFi 模块进行串口通信。
- GPIO 控制继电器,实现供电管理。
- 定时器资源,用于计时与数据处理。
晶振电路采用 8MHz 外部晶振,系统时钟经 PLL 倍频到 72MHz,保证高速数据处理能力。电源采用 3.3V 稳压芯片 AMS1117-3.3。
2.2 电压检测模块(TV1005M)
电压互感器 TV1005M 用于检测交流电压:
- 将 220V 交流电转换为毫伏级小信号。
- 通过电阻分压和运算放大器调理,将信号调整至 STM32 ADC 可采样的 0-3.3V 电压范围。
- 单片机采集电压波形,并通过 RMS 算法计算电压有效值。
2.3 电流检测模块(TA1005M)
电流互感器 TA1005M 用于检测交流电流:
- 输出电流与负载电流成比例关系。
- 经过采样电阻转化为电压信号,再经运放调理。
- STM32 ADC 采集信号后计算电流有效值。
2.4 功率与电量计算模块
在电压和电流检测的基础上,系统通过以下公式计算功率和电量:
-
瞬时功率:
P(t) = U(t) × I(t)
-
有功功率(平均功率):
P = 1/T ∫ U(t) × I(t) dt
-
电量:
Q = P × t
结果通过数据缩放后以字符串格式发送给 APP。
2.5 WiFi 通信模块(ESP8266)
WiFi 模块采用 ESP8266,通过 UART 与 STM32 通信。
- 模块连接到指定 IP 和端口:
10.10.10.11:8080
。 - 发送采集数据字符串到服务器/手机 APP。
- 接收手机指令
*
或#
并反馈给单片机执行继电器控制。
2.6 继电器控制模块
继电器作为插座的开关:
- 当功率大于 200W 时,系统自动关闭继电器,断开供电。
- 当功率小于 200W 时,用户可以通过手机 APP 控制继电器通断。
- 状态通过
R:1
或R:0
上传。
2.7 LCD 与指示灯电路
为了在本地提示状态,系统设置 LED 指示灯:
- 继电器接通时,LED 常亮。
- 继电器断开时,LED 熄灭。
- 还可扩展 LCD1602 或 OLED 显示,用于本地调试显示电压、电流、功率。
3 程序设计
3.1 主程序结构
int main(void)
{
SystemInit();
ADC_Init(); // 电压电流采样
USART_Init(115200); // WiFi通信
Relay_Init(); // 继电器控制
Timer_Init(); // 定时器计时
LED_Init();
while(1)
{
float voltage = getVoltage();
float current = getCurrent();
float power = voltage * current;
float energy = calcEnergy(power);
// 功率保护
if(power > 200.0)
{
Relay_Off();
}
// 打包数据并发送
sendData(voltage, current, power, energy, getRunTime(), getRelayStatus());
// 处理接收指令
processCommand();
}
}
3.2 电压电流检测程序
float getVoltage(void)
{
uint16_t adcValue = ADC_Read(ADC_Channel_1);
float voltage = (adcValue / 4096.0) * 3.3 * 100; // 假设变比100
return voltage;
}
float getCurrent(void)
{
uint16_t adcValue = ADC_Read(ADC_Channel_2);
float current = (adcValue / 4096.0) * 3.3 * 50; // 假设变比50
return current;
}
3.3 功率与电量计算程序
float calcEnergy(float power)
{
static float energy = 0;
static uint32_t lastTime = 0;
uint32_t now = millis();
energy += power * (now - lastTime) / 1000.0 / 3600.0; // kWh
lastTime = now;
return energy;
}
3.4 WiFi 通信协议
void sendData(float V, float A, float P, float Q, uint32_t T, uint8_t R)
{
char buffer[100];
sprintf(buffer, "V:%03dA:%05dP:%07dQ:%0.8fT:%04dR:%d",
(int)V,
(int)(A*1000),
(int)(P*1000),
Q,
T,
R);
USART_SendString(buffer);
}
void processCommand(void)
{
char cmd = USART_Receive();
if(cmd == '#') Relay_Off();
if(cmd == '*') Relay_On();
}
3.5 继电器控制程序
void Relay_On(void)
{
GPIO_SetBits(GPIOB, GPIO_Pin_0);
}
void Relay_Off(void)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_0);
}
uint8_t getRelayStatus(void)
{
return GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_0);
}
4 总结
本设计基于 STM32F103 单片机,结合电压互感器 TV1005M 和电流互感器 TA1005M,实现了交流电压、电流、功率和电量的实时检测,并通过 ESP8266 WiFi 模块 与手机 APP 建立通信,实现了远程监控与控制。系统设计合理,功能完备,既保障了电气安全,又增强了智能控制能力。
本系统的优点:
- 实时性强:电气参数能够实时采集与上传。
- 安全性高:过载自动保护,避免电器损坏。
- 易于扩展:可增加电能统计、分时用电管理等功能。
- 应用广泛:可用于智能插座、家庭用电监控、工业能耗管理。
该系统不仅展示了 STM32 在智能家居与物联网中的应用,也为智能配电与能耗管理提供了参考方案。