2、ESP32开发基础:芯片特性、开发板选型、GPIO、ADC、PWM、定时器、Wi-Fi与蓝牙功能概述
ESP32 系列芯片是乐鑫科技推出的高性能、低功耗、集成 Wi-Fi 与蓝牙的微控制器,自发布以来已成为物联网产品原型验证和小批量生产的首选平台之一。对于智能插座项目而言,ESP32 不仅能够完成电流、电压等模拟量的采集,还能通过 Wi-Fi 实现远程控制与告警推送,其丰富的外设接口也为 PWM 调光、定时开关等功能提供了硬件基础。本章将系统梳理 ESP32 的核心特性、开发板选型要点,并深入讲解 GPIO、ADC、PWM、定时器以及无线通信模块的工程应用方法,为后续的用电特征识别与异常告警逻辑开发打下坚实的硬件认知基础。
上图展示了 ESP32 在智能插座中的核心枢纽地位:左侧为模拟采集链路,负责将电网中的电流、电压信号转换为 ADC 可采样的电压范围;右侧为执行与反馈模块,通过 GPIO 控制继电器通断,利用 PWM 实现 LED 亮度调节;底部为无线通信模块,承担与云端或手机 App 的数据交互;定时器则为采样节拍和软件看门狗提供时间基准。整个系统以 ESP32 为中央处理单元,形成了“感知—处理—执行—通信”的完整闭环。
2.1 ESP32 芯片核心特性与选型依据
核心原理:从芯片到开发板的层级关系
ESP32 系列芯片并非单一型号,而是一个家族,包括经典的 ESP32、ESP32-S2、ESP32-S3、ESP32-C3 等。不同型号在 CPU 架构、无线协议、GPIO 数量、ADC 精度等方面存在差异。对于智能插座项目,最常用的型号是经典 ESP32(如 ESP32-WROOM-32E 模组)和 ESP32-C3(RISC-V 架构,性价比高)。选型时需要关注以下关键参数:
- CPU 性能:经典 ESP32 采用 Xtensa 双核 240MHz,适合需要同时处理 Wi-Fi 协议栈和传感器数据的场景;ESP32-C3 为单核 RISC-V 160MHz,功耗更低但算力有限。
- ADC 精度:ESP32 的 ADC 为 12 位,但实际有效位数(ENOB)受噪声影响约为 9-10 位;ESP32-S3 的 ADC 线性度有所改善。
- Wi-Fi 与蓝牙共存:经典 ESP32 支持 Wi-Fi + BLE 4.2 + Classic Bluetooth,而 ESP32-C3 仅支持 BLE 5.0,不支持 Classic BT。
- GPIO 数量:经典 ESP32 有 34 个 GPIO,但部分引脚受限于 Strapping 引脚和 ADC2 与 Wi-Fi 的冲突,实际可用数量需查阅数据手册。
| 对比维度 | 经典 ESP32 (WROOM-32E) | ESP32-C3 (MINI-1) | ESP32-S3 (WROOM-1) |
|---|---|---|---|
| CPU | 双核 Xtensa 240MHz | 单核 RISC-V 160MHz | 双核 Xtensa 240MHz |
| Wi-Fi | 802.11 b/g/n | 802.11 b/g/n | 802.11 b/g/n |
| 蓝牙 | BLE 4.2 + Classic | BLE 5.0 | BLE 5.0 |
| ADC 通道 | 2 个 12 位 SAR ADC,共 18 通道 | 2 个 12 位 SAR ADC,共 6 通道 | 2 个 12 位 SAR ADC,共 20 通道 |
| 典型模组价格 | 中 | 低 | 较高 |
| 适用场景 | 功能复杂、需双核并行 | 成本敏感、简单控制 | AI 加速、LCD 驱动 |
开发板选型:从模组到开发板的工程考量
开发板选型直接影响调试效率与产品化路径。常见的 ESP32 开发板包括 DevKitC、NodeMCU-32S、ESP32-DevKitM-1 等。选型时需注意:
- 引脚引出:确认开发板是否引出所有可用 GPIO,特别是 ADC1 通道(GPIO34-39)和 PWM 输出引脚。
- 供电方式:智能插座需长期带电工作,开发板应支持 5V 外部供电,且板载 LDO 稳压器能提供稳定 3.3V。
- USB 转串口芯片:CP2102 或 CH340 均可,但需确认驱动兼容性。
- 板载外设:部分开发板带有 LED、按键、RGB 灯,便于初期功能验证。
2.2 GPIO 编程模型与工程实践
核心原理:GPIO 的矩阵与配置
ESP32 的 GPIO 通过 IO MUX 和 GPIO Matrix 实现灵活映射。IO MUX 将特定外设信号直接连接到引脚,而 GPIO Matrix 允许将任意外设信号路由到任意 GPIO。在智能插座中,GPIO 主要用于继电器控制、按键检测、LED 指示和状态读取。
// GPIO 初始化示例(ESP-IDF v5.x)
#include "driver/gpio.h"
#define RELAY_PIN GPIO_NUM_26
#define KEY_PIN GPIO_NUM_27
void gpio_init(void) {
gpio_config_t io_conf = {
.pin_bit_mask = (1ULL << RELAY_PIN),
.mode = GPIO_MODE_OUTPUT,
.pull_up_en = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE
};
gpio_config(&io_conf);
gpio_set_level(RELAY_PIN, 0); // 初始关闭继电器
// 按键输入,启用上拉和下降沿中断
gpio_config_t key_conf = {
.pin_bit_mask = (1ULL << KEY_PIN),
.mode = GPIO_MODE_INPUT,
.pull_up_en = GPIO_PULLUP_ENABLE,
.intr_type = GPIO_INTR_NEGEDGE
};
gpio_config(&key_conf);
}
操作流程:按键消抖与中断处理
机械按键存在抖动问题,需在中断回调中启动软件定时器进行延时消抖(通常 20-50ms)。ESP-IDF 提供 esp_timer 或 FreeRTOS 软件定时器实现该功能。注意中断回调函数中不能调用阻塞函数,只能通过队列或标志位通知任务处理。
2.3 ADC 采样与用电特征提取基础
核心原理:ADC 的量化与非线性
ESP32 内置两个 12 位 SAR ADC,参考电压为 0-3.3V。但实际采样时,ADC 存在非线性误差和温漂,尤其在接近 0V 和 3.3V 的区间。智能插座中,电流互感器输出的交流小信号经过采样电阻和偏置电路后,被抬升到 1.65V 中心电压,再送入 ADC 采样。此时需注意:
- ADC 输入阻抗较低(约 100kΩ),前端需加电压跟随器(运放)进行阻抗匹配。
- 采样频率需满足奈奎斯特采样定理,对于 50Hz 工频信号,至少采样 100Hz,实际建议 1kHz 以上以捕捉谐波。
- ESP32 的 ADC 支持 DMA 连续采样,可配合定时器触发实现等间隔采样。
// ADC 单次采样示例(使用 ADC1 通道 0,即 GPIO36)
#include "esp_adc/adc_oneshot.h"
adc_oneshot_unit_handle_t adc_handle;
adc_oneshot_chan_cfg_t chan_cfg = {
.atten = ADC_ATTEN_DB_12, // 0-3.3V 量程
.bitwidth = ADC_BITWIDTH_12,
};
adc_oneshot_config_channel(adc_handle, ADC_CHANNEL_0, &chan_cfg);
int raw;
adc_oneshot_read(adc_handle, ADC_CHANNEL_0, &raw);
float voltage = raw * 3.3f / 4095.0f;
案例拆解:电流波形采集的偏置电路设计
假设使用 5A/5mA 的电流互感器,采样电阻取 100Ω,则满量程交流电压为 0.5Vrms(峰值约 0.707V)。为匹配 ADC 的 0-3.3V 输入范围,需将信号偏置到 1.65V 中心。具体电路:使用运放(如 LM358)搭建同相加法器,将交流信号叠加 1.65V 直流偏置。实际测试中,需用示波器确认波形无削顶,且中心电压稳定。若偏置电压漂移,会导致直流分量计算错误,进而影响有功功率的测量精度。
2.4 PWM 输出与定时器应用
核心原理:LEDC 与硬件定时器
ESP32 的 LEDC(LED Control)外设提供 16 路 PWM 通道,支持 1Hz 到 40MHz 的时钟源,分辨率可配置。在智能插座中,PWM 常用于 LED 状态指示(如呼吸灯)或可控硅调光(需过零检测)。定时器方面,ESP32 提供 4 个 64 位硬件定时器,支持自动重载和中断。
// LEDC 初始化(50Hz,16 位分辨率,用于 LED 呼吸效果)
#include "driver/ledc.h"
ledc_timer_config_t timer_conf = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.timer_num = LEDC_TIMER_0,
.duty_resolution = LEDC_TIMER_16_BIT,
.freq_hz = 50,
.clk_cfg = LEDC_AUTO_CLK
};
ledc_timer_config(&timer_conf);
ledc_channel_config_t ch_conf = {
.gpio_num = GPIO_NUM_25,
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL_0,
.timer_sel = LEDC_TIMER_0,
.duty = 0,
.hpoint = 0
};
ledc_channel_config(&ch_conf);
操作流程:定时器触发 ADC 采样
为实现等间隔采样,可使用硬件定时器产生 1kHz 中断,在中断服务函数中触发 ADC 采样(或通过 DMA 完成)。注意中断服务函数应尽量短,避免影响 Wi-Fi 协议栈的实时性。更优方案是使用定时器触发 ADC 的硬件采样功能(ADC 的 external trigger),无需 CPU 干预。
| 定时器资源 | 用途 | 优先级 | 注意事项 |
|---|---|---|---|
| Timer 0 | ADC 采样节拍(1kHz) | 高 | 中断服务函数中仅置标志位 |
| Timer 1 | 按键消抖延时 | 中 | 使用软件定时器更灵活 |
| Timer 2 | 看门狗喂狗 | 高 | 独立于 FreeRTOS 任务 |
| Timer 3 | Wi-Fi 连接超时管理 | 低 | 可复用 esp_timer |
esp_timer 是基于硬件定时器的高精度软件定时器,适合微秒级延时;而 FreeRTOS 软件定时器基于 tick(通常 1ms),适合毫秒级任务。智能插座中的电能计量建议使用硬件定时器驱动 ADC 采样,以保证采样间隔的确定性。
2.5 Wi-Fi 与蓝牙功能概述及工程配置
核心原理:协议栈与共存机制
ESP32 的 Wi-Fi 支持 Station、SoftAP、Station+SoftAP 共存模式。在智能插座中,通常设备作为 Station 连接家庭路由器,同时开启 SoftAP 用于配网。蓝牙方面,BLE 可用于近场调试或与手机 App 快速配对。Wi-Fi 与 BLE 共用 2.4GHz 频段,ESP32 通过时间片轮转实现共存,但 BLE 广播间隔和 Wi-Fi 扫描会相互影响。
// Wi-Fi Station 模式初始化(简化)
#include "esp_wifi.h"
#include "esp_event.h"
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
esp_event_loop_create_default();
wifi_config_t wifi_config = {
.sta = {
.ssid = "YOUR_SSID",
.password = "YOUR_PASSWORD",
.threshold.authmode = WIFI_AUTH_WPA2_PSK
},
};
esp_wifi_set_mode(WIFI_MODE_STA);
esp_wifi_set_config(WIFI_IF_STA, &wifi_config);
esp_wifi_start();
案例拆解:智能插座配网流程设计
实际产品中,用户无法通过串口输入 Wi-Fi 密码。常见方案是:设备上电后进入 SoftAP 模式,手机连接设备热点,通过 HTTP 或 BLE 发送 Wi-Fi 凭据。ESP32 收到后切换为 Station 模式连接路由器,并保存凭据到 NVS 闪存。若连接失败,自动回退到 SoftAP 模式。该流程需注意:
- SoftAP 的 IP 地址固定为 192.168.4.1,手机端需关闭移动数据。
- 配网超时时间建议设为 5 分钟,超时后进入低功耗模式。
- Wi-Fi 重连需使用指数退避算法,避免频繁扫描导致功耗上升。
2.6 综合实践:从开发板到智能插座原型
硬件连接清单
| 功能模块 | ESP32 引脚 | 外部器件 | 关键参数 |
|---|---|---|---|
| 电流采样 | GPIO34 (ADC1_CH0) | 电流互感器 + 运放偏置 | 采样电阻 100Ω,偏置 1.65V |
| 电压采样 | GPIO35 (ADC1_CH1) | 电阻分压 + 运放跟随 | 分压比 100:1,中心 1.65V |
| 继电器控制 | GPIO26 | 三极管 + 续流二极管 | 线圈电压 5V,驱动电流 20mA |
| LED 指示 | GPIO25 | LED + 限流电阻 | PWM 频率 1kHz,占空比可调 |
| 按键输入 | GPIO27 | 轻触按键 + 上拉 | 下降沿触发,软件消抖 30ms |
调试步骤与验证方法
- 使用开发板连接 USB,通过串口监视器查看日志,确认 Wi-Fi 连接成功并获取 IP。
- 用示波器测量 ADC 输入引脚的波形,确保交流信号叠加在 1.65V 直流偏置上,且峰峰值不超过 3.3V。
- 通过手机 App 发送继电器控制指令,观察 GPIO26 电平变化和继电器动作声音。
- 使用功率计对比 ESP32 计算的有功功率与实际功率,误差应小于 5%。