2、环境准备:ESP32开发板、Arduino IDE或PlatformIO配置、所需库安装、硬件连接基础
规则引擎的落地离不开稳定的硬件与软件环境。ESP32 作为高性价比、双核、自带 Wi-Fi/蓝牙的微控制器,非常适合承载传感器数据采集、AI 推理结果解析和设备动作控制。本章将围绕开发板选型、IDE 配置、库管理以及基础硬件连接展开,帮助你在动手编写规则引擎代码之前,先搭建一套可靠、可复现的开发环境。
2.1 开发板选型与硬件基础
核心原理:ESP32 系列芯片由乐鑫(Espressif)推出,采用 Xtensa 双核 32 位 LX6 微处理器,主频最高 240MHz,内置 520KB SRAM 和 4MB Flash。其最大的优势在于原生支持 2.4GHz Wi-Fi 和蓝牙 4.2/BLE,且拥有丰富的 GPIO、ADC、DAC、I2C、SPI、UART 等外设接口。对于规则引擎而言,ESP32 的双核架构允许我们在 Core 0 上运行 Wi-Fi 协议栈,在 Core 1 上执行传感器读取和规则匹配逻辑,从而避免网络阻塞导致规则响应延迟。
开发板选择建议:市面上常见的 ESP32 开发板包括 DevKitC、NodeMCU-32S、WROOM-32 模组等。对于本课程,推荐使用 ESP32 DevKitC V4 或兼容板,原因如下:
- 引脚引出完整:所有 GPIO 均以排针引出,方便连接传感器和继电器。
- 自带 USB-UART 桥接芯片:(如 CP2102 或 CH340),插上 USB 即可烧录和查看串口日志。
- 板载 5V 转 3.3V LDO 稳压器:可直接通过 USB 供电,无需额外电源模块。
- EN 复位按键和 BOOT 下载按键:便于进入下载模式或复位程序。
在硬件连接层面,必须牢记 ESP32 的 GPIO 电平为 3.3V,并非 5V 兼容。若直接连接 5V 输出的传感器(如部分超声波模块),需要加电平转换电路或使用分压电阻。同时,所有外设必须与 ESP32 共地,否则 I2C、UART 等通信协议将无法正常工作。
| 硬件组件 | 型号/规格 | 用途 | 连接注意事项 |
|---|---|---|---|
| 主控板 | ESP32 DevKitC V4 | 运行规则引擎主程序 | USB 供电 5V,逻辑电平 3.3V |
| 温湿度传感器 | DHT22 (AM2302) | 采集环境温湿度作为规则条件 | DATA 引脚需接 4.7kΩ 上拉电阻至 3.3V |
| 光照传感器 | BH1750 (I2C) | 采集光照强度,用于光线规则 | SDA=GPIO21, SCL=GPIO22, 地址 0x23 |
| 人体红外传感器 | HC-SR501 PIR | 检测人体活动,触发安防规则 | 输出 3.3V 高电平,可直连 GPIO |
| 继电器模块 | SRD-05VDC-SL-C | 控制 220V 设备(如灯、风扇) | IN 引脚接 GPIO,VCC 接 5V,GND 共地 |
2.2 Arduino IDE 配置与 PlatformIO 对比
核心原理:Arduino IDE 和 PlatformIO 是两种主流的 ESP32 开发环境。Arduino IDE 简单直观,适合快速原型验证;PlatformIO 基于 VS Code,提供专业的项目管理、库依赖管理和多环境编译,更适合复杂工程和团队协作。对于规则引擎这种涉及多传感器、多库依赖的项目,推荐使用 PlatformIO,但本课程将同时覆盖两种方式,以便你根据自身习惯选择。
Arduino IDE 配置步骤:
- 下载并安装 Arduino IDE 2.x(从官网 arduino.cc 获取)。
- 打开 IDE,进入 文件 → 首选项,在“附加开发板管理器网址”中添加:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json - 进入 工具 → 开发板 → 开发板管理器,搜索“esp32”,安装 esp32 by Espressif Systems 版本 2.0.17(或最新稳定版)。
- 安装完成后,在 工具 → 开发板 中选择 ESP32 Dev Module,并设置 Flash Size 为 4MB,Partition Scheme 为 Default 4MB with spiffs。
- 选择正确的 COM 端口(Windows 设备管理器中查看,macOS 为 /dev/cu.usbserial-xxx)。
PlatformIO 配置步骤:
- 安装 VS Code,并在扩展市场安装 PlatformIO IDE 插件。
- 创建新项目,Board 选择 Espressif ESP32 Dev Module,Framework 选择 Arduino。
- 在
platformio.ini中配置环境:[env:esp32dev] platform = espressif32 board = esp32dev framework = arduino monitor_speed = 115200 lib_deps = bblanchon/ArduinoJson @ ^7.0.0 adafruit/DHT sensor library @ ^1.4.4 knolleary/PubSubClient @ ^2.8 - PlatformIO 会自动下载并编译依赖库,无需手动安装。
| 对比维度 | Arduino IDE | PlatformIO |
|---|---|---|
| 上手难度 | 低,适合初学者 | 中等,需熟悉 VS Code |
| 库管理 | 手动安装,版本冲突常见 | 自动解析依赖,支持多版本 |
| 编译速度 | 较慢,全量编译 | 增量编译,速度快 |
| 调试支持 | 仅串口打印 | 支持原生调试器(需外接 JTAG) |
| 项目结构 | 单文件 .ino | 多文件 src/、include/、lib/ |
2.3 所需库安装与功能说明
核心原理:规则引擎的核心是“条件判断”和“动作执行”,而这两者都依赖于传感器数据的准确获取和 JSON 格式的规则配置解析。因此,我们需要安装以下关键库:
- ArduinoJson:用于解析从云端或本地存储读取的规则配置(JSON 格式),将规则条件、操作符、阈值、动作等字段提取为 C++ 对象。
- DHT sensor library:读取 DHT22 温湿度传感器数据,为规则提供环境参数。
- Adafruit Unified Sensor:DHT 库的依赖,提供统一的传感器数据接口。
- PubSubClient:用于 MQTT 通信,当规则引擎需要与云端 AI 服务交互时,通过 MQTT 订阅 AI 推理结果。
- WiFiManager:(可选)用于动态配置 Wi-Fi 凭据,避免硬编码 SSID 和密码。
安装方法(Arduino IDE):在 工具 → 管理库 中搜索上述库名并安装。注意 ArduinoJson 有 v6 和 v7 两个大版本,API 差异较大,本课程统一使用 v7.x 语法。
安装方法(PlatformIO):在 platformio.ini 的 lib_deps 中声明即可,PlatformIO 会自动从 registry 拉取。
// ArduinoJson v7 基本用法示例
#include <ArduinoJson.h>
JsonDocument doc;
deserializeJson(doc, "{\"condition\":\"temp > 30\",\"action\":\"relay_on\"}");
const char* condition = doc["condition"];
const char* action = doc["action"];
lib_deps 中的版本号固定(如 @^7.0.0),避免未来库更新导致 API 不兼容。在 Arduino IDE 中,安装库后可在 文件 → 首选项 → 显示详细编译输出 中查看实际使用的库路径,确保没有重复或冲突版本。
2.4 硬件连接基础与实战案例
核心原理:硬件连接是规则引擎的物理基础。一个典型的连接方案包括:ESP32 通过 GPIO 读取传感器数据,经过规则判断后,通过 GPIO 控制继电器或 LED。连接时必须注意信号方向、电平匹配和电源隔离。
标准连接拓扑:
- DHT22 数据引脚 → GPIO4(需外接 4.7kΩ 上拉至 3.3V)
- BH1750 SDA → GPIO21,SCL → GPIO22,VCC → 3.3V,GND → GND
- PIR 输出 → GPIO17,VCC → 3.3V,GND → GND
- 继电器 IN → GPIO26,VCC → 5V,GND → GND(与 ESP32 共地)
- LED 正极 → GPIO27(串联 220Ω 限流电阻),负极 → GND
实战案例:智能温控风扇
假设我们要实现一个规则:当温度大于 30℃ 且光照强度大于 500 lux 时,自动开启继电器(控制风扇)。同时,当 PIR 检测到人体时,点亮 LED 作为提示。
初始现象与目标:手动控制风扇和 LED 太麻烦,希望通过传感器自动触发。关键输入数据:DHT22 温度值、BH1750 光照值、PIR 数字输出。
分析判断过程:规则引擎需要同时读取三个传感器,并按照优先级判断:先检查 PIR(安全提示),再检查温度和光照(舒适度控制)。若温度超过阈值但光照不足,则不开风扇(避免误判)。
实际操作步骤:
- 按照上述拓扑完成接线,并上传以下测试代码验证传感器读数:
#include <DHT.h> #include <Wire.h> #include <BH1750.h> #define DHTPIN 4 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); BH1750 lightMeter; void setup() { Serial.begin(115200); dht.begin(); Wire.begin(); lightMeter.begin(); } void loop() { float t = dht.readTemperature(); float h = dht.readHumidity(); uint16_t lux = lightMeter.readLightLevel(); Serial.printf("Temp: %.1f C, Hum: %.1f %%, Light: %d lux\n", t, h, lux); delay(2000); } - 确认串口输出正常后,加入规则判断逻辑:
if (t > 30.0 && lux > 500) { digitalWrite(RELAY_PIN, HIGH); // 开启风扇 } else { digitalWrite(RELAY_PIN, LOW); } if (digitalRead(PIR_PIN) == HIGH) { digitalWrite(LED_PIN, HIGH); } else { digitalWrite(LED_PIN, LOW); } - 使用吹风机模拟高温、手机闪光灯模拟强光,验证继电器是否按预期动作。
结果对比与复盘:初始测试时发现 PIR 误触发频繁,原因是 PIR 模块上的灵敏度旋钮调得过高。调整旋钮后,误触发率显著下降。另外,继电器在切换瞬间会产生电磁干扰,导致 ESP32 偶尔重启,解决方案是在继电器线圈两端并联一个 1N4007 二极管(反向吸收浪涌),并在电源输入端加 100μF 电解电容滤波。
2.5 常见误区与总结复盘
误区一:忽略电平转换。很多 5V 传感器(如 HC-SR04 超声波)的输出高电平为 5V,直接接 ESP32 GPIO 会损坏引脚。必须使用电平转换模块或分压电阻。
误区二:电源供电不足。ESP32 在 Wi-Fi 开启时峰值电流可达 500mA,若使用电脑 USB 口供电,可能因电压跌落导致重启。建议使用 5V/2A 的独立电源适配器,或使用带外部电源的 USB Hub。
误区三:库版本混乱。Arduino IDE 中同时安装多个版本的库会导致编译错误。建议在 PlatformIO 中管理库,或在 Arduino IDE 中删除旧版本库。
误区四:GPIO 引脚冲突。ESP32 的 GPIO0、GPIO2、GPIO12 等引脚在启动时有特殊功能(如 strapping 引脚),连接外部设备可能导致无法正常启动。建议避开这些引脚,优先使用 GPIO4、16、17、21、22、26、27。
① 开发板管理器能识别 ESP32 并成功编译空工程;
② 串口监视器能正常输出“Hello World”;
③ DHT22 能稳定输出温湿度数据(误差 ±0.5℃);
④ BH1750 能输出光照值(0-65535 lux);
⑤ 继电器能通过 GPIO 控制通断,且无重启现象;
⑥ 所有外设与 ESP32 共地,且电源稳定。