基于ESP8266与电流互感器的智能用电监测系统DIY指南

基于ESP8266与电流互感器的智能用电监测系统DIY指南 1. 项目概述与核心价值电流监测听起来像是电力工程师在变电站里捣鼓的专业活离我们普通人的生活很远。但如果你曾对着月底的电费账单发愁想知道家里哪个“电老虎”在偷偷烧钱或者你是个创客想给自己心爱的3D打印机、CNC机床加个用电异常报警又或者你只是单纯想实现“人走灯灭、空调关”的智能家居梦想那么自己动手搭建一个电流监测与智能开关系统就是一件既酷又实用的事情。这个项目的核心就是利用像ESP8266这样廉价且功能强大的物联网微控制器配合SCT-013这样的非侵入式电流互感器把看不见的电流变成看得见的数据。它解决的不仅仅是“测量”问题更是“感知”和“控制”的问题。你可以实时知道家里某个插座、某条线路的用电情况精确到瓦特可以设置阈值当设备异常高耗电或完成工作如水泵抽干水时自动断电更可以将数据接入Home Assistant这样的智能家居大脑实现与其他设备的场景联动比如“当影院模式开启时自动调暗灯光并启动投影仪和功放”。无论你是电子爱好者、智能家居玩家还是对能源管理感兴趣的学生这个项目都提供了一个从原理到实践、从硬件到软件的完整路径。它不需要你具备高深的电力知识安全知识是必须的更像是一场有趣的电子积木游戏最终搭建出的却是一个真正能为你服务的智能工具。接下来我将拆解整个过程从最基础的电流测量原理讲起到硬件焊接、固件烧录再到软件配置和平台集成分享我踩过的坑和总结出的技巧。2. 核心原理与硬件选型解析2.1 电流测量从“水流”到“数据”要测量电流尤其是交流市电AC 220V/110V安全是第一要务。我们绝不能像用万用表测电池那样直接串联进电路。这里的主角是电流互感器它利用了电磁感应原理。你可以把它想象成一个“电流钳表”的核心部件。SCT-013就是这样一种“分裂铁芯”式电流互感器。它的中间有一个可以开合的磁环使用时只需要套在待测电线的一根火线或零线上切记只能套一根。当电线中有交流电流过时周围会产生交变磁场这个磁场会在互感器的次级线圈中感应出一个微弱的交流电流。这个感应电流的大小与原边电流成正比但电压等级被极大地降低了通常输出为0-1V的交流电压信号从而实现了高压侧与低压测量电路的电气隔离保证了操作安全。注意SCT-013有多种量程版本如5A, 10A, 20A, 100A。对于一般家用电器监测20A或30A版本比较通用。量程越大测量小电流时的精度和分辨率会相对下降。选择时预估一下待测设备的额定电流留出约1.5倍的余量即可。2.2 从模拟到数字ADS1115模数转换器ESP8266本身有ADC引脚但通常只能测量0-1V或0-3.3V的直流电压且分辨率只有10位1024级。而SCT-013输出的是正负交替的交流小信号例如±1V。直接用ESP8266的ADC去测不仅精度不够也无法处理负电压。这时就需要ADS1115这款16位高精度ADC模块。它的关键作用有两个差分输入它可以将两个输入引脚A0和A1的电压差作为测量值。我们可以将SCT-013的输出线分别接到这两个引脚这样就能准确测量出包含正负变化的交流电压信号。高分辨率与可编程增益16位分辨率意味着能将测量范围分成65536级精度远高于ESP8266的内置ADC。其内部的PGA可编程增益放大器可以放大微弱信号例如设置为4倍增益时最小能分辨0.03125mV的变化非常适合测量微小电流。2.3 大脑与连接ESP8266 D1 Mini为什么选ESP8266 D1 Mini因为它是在Arduino生态下开发物联网项目性价比最高的选择之一。它集成了Wi-Fi功能意味着你的电流监测数据可以直接通过无线网络发送到服务器、手机或Home Assistant无需额外的通信模块。其基于乐鑫ESP8266芯片性能足以处理数据采集、计算和网络通信。D1 Mini的板型设计兼容Arduino Uno的引脚布局使用非常方便通过USB-C口即可供电和编程。2.4 执行机构智能开关方案选型监测之后是控制。这里提供两种典型的智能开关方案成品改造型SONOFF Mini R4 Extreme这是一个已经封装好的智能开关模块核心是ESP32芯片。它的优势是安全、便捷、集成度高。你不需要直接接触强电接线它提供了标准的螺丝端子按照说明书连接家里的火线、零线、负载线和墙壁开关线即可。它原生支持eWeLink云平台也可以通过刷入Tasmota或ESPHome固件实现本地化控制彻底摆脱云服务依赖。适合想快速实现灯具、插座智能化且对电路安全有顾虑的初学者。DIY核心型ESP-01S继电器模块这是一个更底层的方案。ESP-01S是一个更小、更便宜的Wi-Fi模块通过一个简单的电路板控制一个继电器。你需要自己为它提供稳定的3.3V电源通常用一个5V转3.3V的降压模块或者手机充电器加降压模块并连接继电器的控制端。这个方案的灵活性极高成本更低但需要你自行处理电源隔离和安装外壳对动手能力要求稍高。适合用来控制低压直流设备如LED灯带、风扇或作为学习继电器原理的入门项目。选型心得如果你是第一次接触强电强烈建议从SONOFF产品开始并在完全断电的情况下操作。ESP-01S方案更适合在低压、直流场景下练手理解“Wi-Fi信号控制物理开关”这一核心逻辑。3. 硬件组装与电路搭建详解3.1 安全准备与工具清单在触碰任何元件之前请默念三遍安全第一。本项目涉及220V市电的部分如使用SONOFF或连接CT传感器到插座务必谨慎。必需工具与材料焊接工具恒温烙铁建议温度350°C左右、焊锡丝、吸锡器或焊锡吸线。辅助工具尖头镊子、斜口钳、剥线钳、万用表。个人防护护目镜焊接时飞溅的焊锡、剪元件引脚时崩飞的金属屑都可能伤到眼睛。核心物料ESP8266 D1 Mini 开发板 x1ADS1115 ADC模块 x1若做多通道按需增加SCT-013电流互感器建议20A或30A版本x2PJ-320A 3.5mm耳机插座 x2用于连接CT传感器非必须但方便插拔“Current Affairs Power Monitor” PCB板可按照原理图自行用万用板搭建或使用现成设计杜邦线公对公、母对母、公对母若干。5V USB电源用于给ESP8266供电。3.2 功率监测器PCB焊接指南如果使用提供的PCB组装顺序有讲究可以避免后续麻烦先矮后高先焊接高度最低的元件。通常是电阻、IC插座如果有、跳线帽插针。对于这个板子先焊接好给ADS1115模块和3.5mm插座预留的排母。焊接排母将用于插接ESP8266 D1 Mini和ADS1115的排母焊接到PCB上。务必注意方向PCB上通常有丝印框标出模块轮廓确保排母的开口朝向与模块USB口方向一致。焊接时可以先固定一个引脚调整对齐后再焊接其余引脚。安装插座焊接两个PJ-320A 3.5mm插座。它们用于连接SCT-013的3.5mm耳机插头。注意插座外壳的接地焊盘要焊牢以保证屏蔽效果。检查与清理焊接完成后用放大镜检查是否有虚焊、连锡。用万用表通断档检查电源VCC、3V3与地GND之间是否短路。最后用酒精和硬毛刷清洗板子上的助焊剂残留。实操技巧在焊接排母时可以先将ESP8266和ADS1115模块插在排母上然后再一起焊到板子上这样能绝对保证模块与插座之间的垂直度和贴合度焊好后再取下模块。3.3 传感器连接与信号调理SCT-013的输出线末端通常是一个3.5mm耳机插头。内部接线一般是插头尖部Tip为信号线套管Sleeve为地线。连接至PCB将插头插入焊好的PJ-320A插座。PCB内部电路已经设计好将信号线连接到了ADS1115的A0和A0-差分输入对。负载电阻问题关键原始的SCT-013内部可能没有负载电阻其输出是一个电流信号。为了将其转换为ADC可测量的电压信号必须在次级线圈两端并联一个采样电阻Burden Resistor。有些版本的SCT-013内置了电阻如标称输出0-1V的通常内置了约30-60欧姆电阻。你需要根据数据表或实测确定。如何判断用万用表电阻档测量3.5mm插头两端的内阻。如果阻值在几十欧姆说明内置了电阻。如果阻值很小几欧姆以下或开路则需要外接。外接电阻计算根据欧姆定律 V I * R。例如你的SCT-013是30A/1V规格意味着当原边电流为30A时次级输出电流为I_secondary 30A / 匝数比如2000:1的CT匝数比2000 0.015A。要得到1V电压需要的负载电阻 R V / I 1V / 0.015A ≈ 66.7欧姆。你可以选择一个接近的标准电阻如68欧姆并联在CT的输出端即PCB上连接插座信号与地的两点之间。电阻功率建议选择1/2瓦或1瓦以留有余量。多通道扩展PCB上设计了多个通道位置。要增加通道你需要额外焊接一套PJ-320A插座和排母。插入一个新的ADS1115模块。设置I2C地址ADS1115的默认地址是0x48地址引脚ADDR接地。PCB上通过跳线选择不同的电平接3.3V、SDA或SCL来改变地址。例如将第二个ADS1115的地址跳线连接到“3V3”其地址就变成了0x49。在代码中初始化时需要指定每个ADS1115的对应地址。4. 固件开发与数据采集编程4.1 开发环境搭建与基础测试安装Arduino IDE从官网下载并安装最新版Arduino IDE。添加ESP8266支持打开文件-首选项在“附加开发板管理器网址”中输入https://arduino.esp8266.com/stable/package_esp8266com_index.json打开工具-开发板-开发板管理器搜索“esp8266”安装“esp8266 by ESP8266 Community”包。安装完成后在工具-开发板中选择 “LOLIN(WEMOS) D1 mini (clone)”。安装依赖库打开工具-管理库...搜索并安装 “Adafruit ADS1X15” 库。这个库封装了与ADS1115通信的复杂操作。基础测试 - Blink程序用USB线连接ESP8266 D1 Mini。打开文件-示例-Basics-Blink。点击上传按钮向右箭头。上传成功后板载的蓝色LED应该开始闪烁。这个步骤验证了开发板连接、驱动安装和基础编程功能一切正常。4.2 电流测量固件核心代码解析提供的HB0120_SerialOut.ino草图是项目的核心。我们来解读其关键部分并说明如何根据你的硬件进行调整。#include Wire.h #include Adafruit_ADS1X15.h Adafruit_ADS1115 ads; // 声明ADS1115对象 // 校准参数这些值需要根据你的具体硬件进行校准 float SCALE_FACTOR 0.0264; // 每安培对应的电压值 (V/A)。需要实测校准。 float VOLTAGE_REF 220.0; // 你的市电电压用于计算功率。中国为220V台湾110V美国120V。 void setup() { Serial.begin(115200); Wire.begin(); // 初始化I2C总线 if (!ads.begin(0x48)) { // 初始化地址为0x48的ADS1115 Serial.println(Failed to initialize ADS at 0x48); while (1); } // 设置ADS1115的增益和采样速率 ads.setGain(GAIN_FOUR); // /- 1.024V 量程4倍增益 ads.setDataRate(RATE_ADS1115_860SPS); // 860次采样/秒提高实时性 } void loop() { int16_t adc0; float voltage0, current0, power0; // 1. 读取原始ADC值差分模式通道0 adc0 ads.readADC_Differential_0_1(); // 2. 将ADC值转换为电压单位伏特 // ADS1115在GAIN_FOUR下每bit代表0.03125mV voltage0 adc0 * 0.00003125; // 3. 计算电流单位安培 current0 voltage0 / SCALE_FACTOR; // 4. 计算瞬时功率单位瓦特 - 这是近似值假设电压电流同相位 power0 VOLTAGE_REF * current0; // 5. 输出到串口监视器 Serial.print(ADC: ); Serial.print(adc0); Serial.print( | Voltage: ); Serial.print(voltage0, 4); Serial.print( V | Current: ); Serial.print(current0, 3); Serial.print( A | Power: ); Serial.print(power0, 1); Serial.println( W); delay(500); // 每500ms采样一次 }关键参数校准SCALE_FACTOR 这是整个测量准确度的核心。你需要一个已知功率的阻性负载如白炽灯、电热水壶进行校准。将SCT-013套在该负载的火线上。运行上述代码观察串口输出的电流值。根据公式理论电流 负载功率 / 市电电压计算负载的理论电流值。调整代码中的SCALE_FACTOR使得串口输出的电流值接近理论值。例如理论电流2A实测输出1.8A则原SCALE_FACTOR偏小需要增大新SCALE_FACTOR 旧SCALE_FACTOR * (实测电流 / 理论电流)。反复几次直到误差在可接受范围内±5%以内。关于RMS计算 上面的简单代码直接使用瞬时电压值计算电流和功率这对于纯阻性负载如灯泡、加热器在采样率足够高时是可行的近似。但对于电机、开关电源等非线性负载电流波形不是完美的正弦波这样计算误差会很大。改进方案实现真正的RMS计算。在一个交流周期内50Hz为20ms进行高速采样如每秒1000次对每个采样值求平方计算这些平方值的平均值再开方。Adafruit库的readADC_Differential_0_1()速度足够快。你需要修改loop()在20ms内采集足够多的点计算RMS值再输出。这会显著提高测量精度。4.3 集成Wi-Fi与数据上报仅仅在串口看数据不够“物联网”。我们需要让ESP8266连接Wi-Fi并将数据发送出去。#include ESP8266WiFi.h #include ESP8266HTTPClient.h const char* ssid 你的Wi-Fi名称; const char* password 你的Wi-Fi密码; const char* serverUrl http://你的服务器地址/api/power; // 示例API端点 void setup() { // ... 之前的ADS1115初始化代码 ... WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } Serial.println(WiFi connected); } void loop() { // ... 之前的电流、功率计算代码 ... // 构建JSON数据 String jsonPayload {\current\: String(current0, 3) , \power\: String(power0, 1) }; // 发送HTTP POST请求 if (WiFi.status() WL_CONNECTED) { HTTPClient http; http.begin(serverUrl); http.addHeader(Content-Type, application/json); int httpCode http.POST(jsonPayload); if (httpCode 0) { Serial.printf(HTTP POST code: %d\n, httpCode); } else { Serial.printf(HTTP POST failed, error: %s\n, http.errorToString(httpCode).c_str()); } http.end(); } delay(10000); // 每10秒上报一次避免请求过于频繁 }这只是一个简单示例。更常见的做法是使用MQTT协议将数据发布到像Mosquitto这样的MQTT代理服务器再由Home Assistant等平台订阅。MQTT更轻量适合物联网设备。5. 系统集成与智能联动实战5.1 接入Home Assistant via ESPHome对于智能家居玩家ESPHome是比直接写Arduino代码更优雅的选择。它是一个基于YAML配置的系统可以自动生成并管理ESP8266/ESP32的固件并轻松集成到Home Assistant中。安装ESPHome在Home Assistant的“加载项”商店中安装ESPHome或通过Docker安装。创建新设备配置esphome: name: power-monitor-livingroom platform: ESP8266 board: d1_mini wifi: ssid: !secret wifi_ssid password: !secret wifi_password # 启用配网首次连接失败可网页配网 ap: ssid: Power-Monitor Fallback # 启用日志和OTA无线升级 logger: api: ota: # 配置I2C总线 i2c: sda: D2 scl: D1 scan: true # 配置ADS1115传感器 sensor: - platform: ads1115 address: 0x48 gain: 4.096V # 通道A0-A1差分输入测量电流 current: name: Living Room Outlet Current id: current_sensor # 单位转换系数需要根据你的SCALE_FACTOR校准 filters: - multiply: 37.8788 # 示例系数需校准 unit_of_measurement: A accuracy_decimals: 2 update_interval: 5s # 计算功率 - platform: template name: Living Room Outlet Power id: power_sensor lambda: |- return id(current_sensor).state * 220.0; // 假设电压220V unit_of_measurement: W accuracy_decimals: 1 update_interval: 5s # 计算总能耗千瓦时 - platform: integration name: Living Room Energy sensor: power_sensor time_unit: h unit_of_measurement: kWh filters: - multiply: 0.001 # 将瓦时转换为千瓦时编译与烧录在ESPHome Web界面中点击“安装”选择“无线OTA”或“USB连接”按照提示即可完成固件烧录。设备上线后会自动出现在Home Assistant的“设备与服务”中。5.2 创建自动化与仪表盘设备接入后真正的乐趣开始了。用电异常报警在Home Assistant中创建一个自动化当“客厅插座功率”在非工作时间如凌晨2点-6点持续大于某个阈值如50W时向手机发送通知“检测到客厅有异常耗电请检查”设备联动创建一个自动化“当3D打印机通过智能插座控制的功率从高打印中下降到低待机并维持1分钟时自动关闭打印机插座电源”实现打印完成自动关机。能耗统计仪表盘利用Home Assistant的“能源”仪表盘将你的功率传感器添加进去就能生成每日、每周、每月的用电图表清晰直观。5.3 SONOFF Mini R4 Extreme刷机与本地控制为了让SONOFF设备摆脱云服务实现本地快速响应和隐私保护刷入Tasmota或ESPHome是常见操作。刷机准备硬件连接你需要一个USB转TTL串口模块如CH340G。断开SONOFF的市电连接。打开外壳找到电路板上的串口引脚通常是RX, TX, GND, 3.3V。用杜邦线连接USB模块的TX接SONOFF的RXRX接TXGND接GND。USB模块的3.3V可以给SONOFF供电注意电流是否足够最好用外部3.3V电源。进入刷机模式SONOFF上通常有一个按钮。在通电的同时按住按钮或短接某个测试点直到串口有稳定输出表示进入刷机模式。刷入Tasmota访问Tasmota官方网站的安装工具页面。选择对应的SONOFF型号Mini R4 Extreme。根据网页提示用串口工具或网络工具如Tasmotizer刷入固件。刷机完成后设备会创建一个Wi-Fi热点连接后通过网页配置你的家庭Wi-Fi。刷机后配置在Tasmota的Web界面中你可以配置继电器对应的GPIO引脚、设置开关类型点动、自锁等、接入MQTT服务器。之后就可以在Home Assistant中通过MQTT自动发现并添加此设备实现本地控制。6. 常见问题排查与进阶优化6.1 测量不准或数值跳变症状电流读数不稳定或与已知负载偏差很大。排查校准系数不对这是最常见原因。严格按照前述方法使用纯阻性负载进行校准。CT传感器未闭合或位置不当确保SCT-013的磁环完全闭合且只套在单根导线上。套在零火线一起的线上磁场会抵消读数为零。负载电阻不匹配确认你的SCT-013是否需要以及是否正确安装了外接负载电阻。电阻值错误会直接导致比例系数错误。电源干扰确保ESP8266和ADS1115的电源稳定。尝试在电源引脚附近并联一个100uF的电解电容和一个0.1uF的陶瓷电容滤波。I2C总线干扰尽量缩短I2C连接线SDA, SCL并确保连接牢固。可以尝试在SDA和SCL线上各加一个4.7kΩ的上拉电阻到3.3V。6.2 Wi-Fi连接不稳定或设备离线症状设备经常在Home Assistant中显示“不可用”。排查信号强度ESP8266的Wi-Fi信号一般。确保设备安装位置距离路由器不要太远或隔墙太多。可以使用ESP.getRssi()在代码中打印信号强度-70dBm以上尚可-80dBm以下就偏弱了。电源问题Wi-Fi发射时电流较大可达200mA。使用质量差的USB线或电源适配器可能导致电压跌落引起设备重启。使用短而粗的USB线并选用输出电流≥1A的5V电源。固件看门狗复位如果代码中有长时间阻塞的操作如复杂的网络请求未设置超时可能导致看门狗定时器复位。确保loop()函数执行时间不要太长或使用yield()函数喂狗。6.3 多通道ADS1115地址冲突症状只能检测到一个ADS1115或数据全乱。排查确认地址使用Arduino的I2C扫描示例代码扫描总线上所有设备的地址确认每个ADS1115的地址是否按预期设置0x48, 0x49, 0x4A, 0x4B。检查跳线确认每个ADS1115模块背面的地址选择跳线帽是否正确连接。不同厂家的模块跳线定义可能略有不同以模块丝印或说明书为准。接线顺序I2C总线是并联的确保所有模块的SDA、SCL、VCC、GND都正确并联且总线末端最好有上拉电阻。6.4 进阶优化方向电压测量要计算精确功率PUIcosφ仅测电流不够还需要测电压。可以添加一个ZMPT101B等交流电压传感器模块同样通过ADS1115的另一路差分输入进行测量在代码中同步采样并计算视在功率、有功功率和功率因数。数据持久化与离线记录添加一个微型SD卡模块定期将用电数据写入CSV文件即使网络中断也不丢失数据。本地显示增加一个0.96寸OLED屏幕实时显示当前电流、功率和今日用电量无需打开手机APP。机壳与安全封装为整个监测器设计并3D打印一个外壳将所有高压部分如接线端子妥善隔离制作成一个可以长期安全使用的产品。这个项目从简单的电流测量出发延伸到了智能家居集成、自动化场景构建甚至触及了能源管理的边缘。它像一把钥匙打开了物联网硬件开发与家庭自动化的一扇大门。过程中遇到的每一个问题从焊接连锡到代码bug从网络配置到平台集成都是宝贵的经验。最重要的是你亲手创造了一个能真实感知和控制物理世界的工具这种成就感远非购买一个成品所能比拟。当你第一次通过手机远程关闭忘关的灯或者收到用电异常的预警时你会觉得这一切的折腾都无比值得。