功能描述 本系统由STM32单片机核心板、交流电压电流检测模块、WIFI模块、指示灯组成。 1、220V市电经过互感器后产生微弱交流电经过整流滤波后变为直流然后通过单片机AD转换然后换算出实际值。电压电流采集分别使用电压互感器TV1005M和电流互感器TA1005M。 2、手机APP和WiFi模块互联后可以实时显示交流电压、交流电流、功率和电量实时显示在手机上。功率电压*电流电量是功率*时间。 3、当功率超过200W时继电器自动断开。功率不超过200W时可以手动控制继电器的开关。 4、手机APP和设备WiFi模块连接后手机上显示计时时间。最近在搞一个基于STM32的智能用电监控装置这玩意儿能实时监测家用电器参数还能手机远程查看数据。别看它外壳就巴掌大里面可是藏着220V强电处理的硬核操作。今天带大家看看这套系统怎么玩转交流电参数采集顺便扒几段关键代码聊聊实现逻辑。功能描述 本系统由STM32单片机核心板、交流电压电流检测模块、WIFI模块、指示灯组成。 1、220V市电经过互感器后产生微弱交流电经过整流滤波后变为直流然后通过单片机AD转换然后换算出实际值。电压电流采集分别使用电压互感器TV1005M和电流互感器TA1005M。 2、手机APP和WiFi模块互联后可以实时显示交流电压、交流电流、功率和电量实时显示在手机上。功率电压*电流电量是功率*时间。 3、当功率超过200W时继电器自动断开。功率不超过200W时可以手动控制继电器的开关。 4、手机APP和设备WiFi模块连接后手机上显示计时时间。先说最刺激的电压电流采集部分。市电经过TV1005M电压互感器后原本220V的交流电瞬间变成0-5V的弱电信号。这里有个坑交流信号需要整流滤波才能给ADC采集。我们用了全桥整流搭配π型滤波电路实测纹波控制在30mV以内。ADC配置这块STM32的规则组双通道采集稳得一批//ADC初始化关键配置 hadc1.Instance ADC1; hadc1.Init.ScanConvMode ENABLE; hadc1.Init.ContinuousConvMode ENABLE; hadc1.Inchannels[0].Channel ADC_CHANNEL_0; //电压通道 hadchannels[1].Channel ADC_CHANNEL_1; //电流通道 HAL_ADC_Start_DMA(hadc1, (uint32_t*)adc_buffer, 2); //DMA双缓冲采集到的原始数据需要转换实际值。这里有个校准系数是我拿万用表蹲实验室三天测出来的经验值float get_voltage(){ float raw adc_buffer[0] * 3.3 / 4096; return raw * 65.8 2.1; //65.8是电压比2.1是零点补偿 }WiFi模块用的是ESP-12F通过AT指令和STM32交互。数据上传要注意JSON格式打包别让手机端解析炸了。看这段数据打包代码char json_buf[128]; sprintf(json_buf, {\V\:%.1f,\A\:%.2f,\W\:%.0f,\KWH\:%.3f,\T\:%d}, voltage, current, power, kwh, seconds); HAL_UART_Transmit(huart2, (uint8_t*)json_buf, strlen(json_buf), 100);过载保护逻辑看似简单实际要考虑消抖处理。直接上状态机实现if(power 200.0){ overload_counter; if(overload_counter 30){ //持续3秒超载 RELAY_OFF(); overload_flag 1; } }else{ overload_counter 0; }计时功能用STM32的基本定时器实现注意秒数变量要加volatile修饰__IO uint32_t seconds 0; //放在定时中断里自增 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if(htim-Instance TIM6){ seconds; update_display_flag 1; } }开发过程中被互感器相位差坑过——电压电流采样不同步会导致功率计算误差。后来用双ADC交替采样软件补偿才搞定。还有个隐藏技能电量统计其实是把功率对时间积分代码里每5秒累加一次kwh (power * 5.0 / 3600.0) / 1000; //单位转kWh最后说个血泪教训调试强电部分务必做好隔离有次误碰滤波电容体验了一把触电的感觉现在操作都养成单手接线的习惯。完整工程已开源需要源码的私信甩邮箱下次可能做个带用电异常识别的升级版。