用STM32F103和ESP8266做个智能插座:手机远程监控功率,还能自动断电(附完整代码)
用STM32F103和ESP8266打造高精度智能插座从硬件设计到云端控制全解析家里热水器忘关导致电费飙升电脑长时间待机浪费能源今天我们就用STM32F103和ESP8266这两个性价比极高的硬件平台打造一个能手机远程监控、自动断电的智能插座解决方案。这个项目不仅实用还能让你深入理解交流电检测、WiFi通信和继电器控制的完整技术链条。1. 项目整体架构设计智能插座的核心功能可以分解为三个模块交流电参数检测、主控逻辑处理和无线通信。我们选用STM32F103作为主控芯片它不仅具备足够的ADC通道和计算能力还有丰富的社区资源支持。ESP8266则负责WiFi连接将数据上传到手机端。系统工作流程电压/电流互感器实时采集交流电参数STM32进行ADC采样和功率计算通过串口将数据发送给ESP8266模块WiFi模块将数据推送到手机APP用户可以通过APP远程控制继电器状态硬件选型上TV1005M电压互感器和TA1005M电流互感器是性价比很高的选择它们都能提供2000V的隔离电压确保使用安全。继电器模块建议选用固态继电器相比机械式继电器具有更长的使用寿命和更快的响应速度。2. 硬件电路设计与安全注意事项2.1 交流电检测电路电压检测采用TV1005M互感器其变比为1000:1意味着220V交流电经过互感器后输出约为0.22V。我们需要通过运放电路将这个信号放大到适合STM32 ADC输入的0-3.3V范围。典型的分压电路设计// 电压检测电路计算公式 实际电压 ADC值 × (3.3/4096) × (R1R2)/R2 × 变比倒数电流检测使用TA1005M互感器需要在次级并联一个精密采样电阻。这里有个关键点当没有电流通过时互感器输出不是零而是一个很小的偏移电压需要在代码中进行软件校准。警告直接测量市电存在触电风险所有高压侧电路必须做好绝缘处理建议使用3D打印外壳或购买现成的绝缘插座改装。2.2 STM32与ESP8266的接口设计两个模块通过串口通信连接时需要注意引脚STM32端ESP8266端备注TXPA9RX需电平匹配RXPA10TX需电平匹配GNDGNDGND必须共地VCC3.3V3.3V切勿接5VESP8266的供电要特别注意上电瞬间电流可能达到500mA建议单独使用一个LDO稳压器而不是直接从STM32取电。3. 软件实现与关键代码解析3.1 ADC采样与数据处理STM32的ADC需要配置为连续扫描模式对电压和电流通道交替采样。为了抑制50Hz工频干扰每个周期采样至少20个点即1ms采样一次然后取一个周期的平均值。// ADC初始化关键代码 void Adc_Init(void) { ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_InitStructure.ADC_Mode ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode ENABLE; ADC_InitStructure.ADC_ContinuousConvMode ENABLE; ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel 2; ADC_Init(ADC1, ADC_InitStructure); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); }功率计算需要考虑功率因数简单的做法是电压和电流的瞬时值相乘后积分// 实时功率计算 for(int i0; iSAMPLING_POINTS; i){ instantPower voltageSamples[i] * currentSamples[i]; totalPower instantPower; } realPower totalPower / SAMPLING_POINTS;3.2 WiFi通信协议设计ESP8266配置为TCP服务器手机APP作为客户端连接。数据格式采用紧凑的字符串协议例如V:230A:01234P:1234567Q:1234.56T:1234R:1字段说明V电压单位VA电流单位mAP功率单位mWQ累计电量单位WhT运行时间单位秒R继电器状态1接通0断开在STM32端使用sprintf生成数据包char packet[50]; sprintf(packet,V:%03dA:%05dP:%07luQ:%06.2fT:%04dR:%d, voltage, current, power, energy, uptime, relayState);4. 手机APP交互与高级功能实现4.1 基础数据显示APP界面应清晰展示实时数据电压、电流波形图实时功率数字显示累计用电量统计继电器状态指示建议使用MQTT协议而非原始TCP连接这样可以实现断线自动重连和消息队列。流行的IoT平台如Blynk或Node-RED都可以快速搭建监控界面。4.2 智能控制逻辑扩展除了基本的过载保护可以增加更多实用功能定时开关设置特定时段自动断电# 示例伪代码 if current_time in schedule_off_period: turn_off_relay()用电统计按日/周/月分析用电习惯// 存储每日用电量 struct { uint16_t day; float energy; } energy_log[31];场景联动与其他智能设备配合如离开家时自动关闭所有插座异常报警检测到持续过载或电压异常时推送通知5. 校准与调试技巧任何电力测量设备都需要校准才能保证精度。你需要一个已知功率的负载如白炽灯泡作为参考。校准步骤接入纯阻性负载如100W灯泡测量实际电压和电流用万用表调整代码中的校准系数// 校准后的计算公式 realVoltage rawADC * 0.87f; // 调整这个系数常见问题排查数据跳动大增加软件滤波如移动平均或卡尔曼滤波WiFi频繁断开检查电源稳定性添加看门狗继电器误动作调整过载判断的延时时间这个项目最有趣的部分是你可以不断扩展功能比如加入温度传感器监测设备发热或者用机器学习算法识别电器类型。我曾用类似方案帮朋友解决了鱼缸加热器故障导致的电费异常问题通过历史用电数据分析准确锁定了故障发生的时间点。