一、项目概述与硬件选型:ESP32芯片、传感器与执行器
大家好,欢迎来到这门课的第一讲。做智能家居能耗统计,说白了就是两件事:测准了,然后控住了。测不准,数据就是废的;控不住,方案就是摆设。今天咱们就从芯片选型开始,一步步把硬件底子搭起来。
1.1 ESP32芯片:为什么选它?
我个人习惯,做这类联网的嵌入式项目,首选就是ESP32。为什么?你想想看,它集成了Wi-Fi和蓝牙,双核处理器,主频能到240MHz,关键是——便宜。一块模组十几块钱,比单独买MCU加无线芯片划算多了。
我在项目中遇到过用STM32+ESP8266的方案,结果调试Wi-Fi驱动就花了两周。ESP32直接原生支持,省心不少。而且它的ADC有12位精度,采样家电的电流信号基本够用。
核心参数速览:
- 双核Xtensa LX6处理器,主频240MHz
- 520KB SRAM + 4MB Flash(常见配置)
- 2.4GHz Wi-Fi 802.11 b/g/n + 蓝牙4.2
- 12位ADC,最多18个通道
- 支持FreeRTOS,开发环境用Arduino IDE或ESP-IDF
嗯,这里要注意:ESP32的ADC线性度一般,尤其是靠近电源轨和地轨的时候。我建议只使用中间60%的量程,这样误差能控制在1%以内。
1.2 智能家居能耗场景分析
咱们先理清场景。家庭能耗大户无非这几类:
- 空调/暖气:功率大,启停频繁,峰值电流冲击明显
- 冰箱:间歇工作,压缩机启动瞬间电流可达额定值3-5倍
- 热水器/电饭煲:纯阻性负载,功率因数接近1,好测
- 电视/电脑:开关电源负载,谐波多,对采样精度要求高
说白了,不同负载的电流波形差异很大。纯阻性负载是正弦波,开关电源负载是尖峰脉冲。你用一个普通的电流互感器,采样率不够,测出来的数据可能差30%。
我的经验:对于空调这类大功率设备,建议单独用一路高精度计量芯片(比如HLW8032),不要和普通插座共用ADC通道。否则干扰会让你怀疑人生。
1.3 核心传感器选型:电流/电压模块
传感器选型是这章的重头戏。我踩过的坑不少,今天直接给你们避坑指南。
电流传感器
家用场景,主流方案有三种:
| 类型 | 典型型号 | 量程 | 精度 | 适用场景 |
|---|---|---|---|---|
| 电流互感器(CT) | SCT-013-030 | 0-30A | ±1% | 空调、总进线 |
| 霍尔效应传感器 | ACS712-20A | ±20A | ±1.5% | 普通插座、小家电 |
| 专用计量芯片 | HLW8032 | 取决于采样电阻 | ±0.5% | 高精度场景 |
我曾经用ACS712做冰箱监测,结果发现数据波动很大。后来查资料才知道,霍尔传感器对磁场敏感,冰箱压缩机启动时的磁场干扰会导致读数跳变。后来换成SCT-013加运放电路,问题就解决了。
警告:使用电流互感器时,二次侧绝对不允许开路!否则会产生高压,击穿设备甚至伤人。我习惯在输出端并联一个5.1V的齐纳二极管做保护。
电压传感器
电压测量相对简单。家用电压220V±10%,用电阻分压网络降到ADC可接受范围就行。我常用的方案:
- 两个100kΩ电阻串联分压,中间抽头接ADC
- 分压后电压约1.1V(220V峰值311V,分压比200:1)
- 加一个0.1μF电容滤波,消除高频噪声
// 电压采样代码示例(Arduino框架)
float readVoltage() {
int raw = analogRead(34); // ADC通道
float voltage = raw * (3.3 / 4095.0); // 转成电压值
voltage = voltage * 200.0; // 补偿分压比
return voltage * 1.414; // 有效值转峰值(实际需RMS算法)
}
嗯,这里要说明一下:上面代码只是示意。实际项目中要用均方根(RMS)算法,因为电网波形不是完美的正弦波。我一般采集128个点做一次RMS计算,效果不错。
1.4 继电器与执行器选择
控制端,继电器是主力。选型主要看三点:触点容量、线圈电压、响应速度。
继电器选型表
| 型号 | 触点容量 | 线圈电压 | 典型应用 |
|---|---|---|---|
| SRD-05VDC-SL-C | 10A 250VAC | 5V | 普通插座、灯光 |
| HF32F-005 | 16A 250VAC | 5V | 空调、热水器 |
| 固态继电器(SSR) | 25A 380VAC | 3-32VDC | 频繁开关、无触点 |
我个人习惯,大功率设备用HF32F,余量留足。小功率用SRD,便宜够用。固态继电器虽然贵,但无触点、无火花,适合频繁开关的场景,比如电暖器调温。
避坑指南:我曾经用5V继电器直接接ESP32的GPIO,结果驱动不了。因为ESP32的GPIO最大输出电流只有12mA,而5V继电器线圈需要约70mA。必须加三极管或光耦驱动。推荐用ULN2003达林顿管阵列,一个芯片能驱动7路继电器。
// 继电器驱动电路示意(伪代码)
// GPIO 26 -> 1kΩ电阻 -> 三极管基极
// 三极管集电极 -> 继电器线圈 -> 5V电源
// 继电器线圈并联1N4007续流二极管
void controlRelay(int pin, bool state) {
digitalWrite(pin, state ? HIGH : LOW);
// 注意:继电器吸合瞬间电流大,建议加100μF电解电容滤波
}
小结
这一章咱们把硬件底子搭好了。ESP32做主控,电流传感器用SCT-013或ACS712,电压用电阻分压,继电器按功率选型。下一章我会讲电路连接和PCB设计,到时候咱们把今天选的这些元件焊到一起。
记住一句话:硬件选型省下的时间,迟早要在调试里加倍还回来。别贪便宜,别图省事。好,今天就到这里。