一、项目概述与硬件选型: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设计,到时候咱们把今天选的这些元件焊到一起。

记住一句话:硬件选型省下的时间,迟早要在调试里加倍还回来。别贪便宜,别图省事。好,今天就到这里。