2、环境准备:ESP32开发板、Arduino IDE或PlatformIO配置、所需库安装、硬件连接基础

规则引擎的落地离不开稳定的硬件与软件环境。ESP32 作为高性价比、双核、自带 Wi-Fi/蓝牙的微控制器,非常适合承载传感器数据采集、AI 推理结果解析和设备动作控制。本章将围绕开发板选型、IDE 配置、库管理以及基础硬件连接展开,帮助你在动手编写规则引擎代码之前,先搭建一套可靠、可复现的开发环境。

硬件层 软件层 工程链路 ESP32 DevKitC 双核240MHz / 4MB Flash 传感器组 DHT22 / BH1750 / PIR 执行器组 继电器 / LED / 蜂鸣器 电源与电平 5V输入 / 3.3V逻辑 / GND Arduino IDE 2.x esp32 by Espressif 2.0.17 PlatformIO platform = espressif32 核心库 ArduinoJson / DHT sensor 辅助库 PubSubClient / WiFiManager 数据采集 轮询 / 中断 / I2C 规则匹配 if-else / 查表 / 状态机 动作执行 GPIO / PWM / 串口指令 调试反馈 Serial / 日志 / 状态LED VCC=5V, VDD=3.3V, 共地 JSON解析 / 规则表存储 TP1: 传感器原始值

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 共地
风险提示:切勿将 5V 直接接入 ESP32 的 GPIO 引脚,否则会烧毁芯片。继电器模块的 VCC 通常接 5V,但控制信号 IN 必须由 3.3V GPIO 驱动,若模块不带光耦隔离,建议使用 2N2222 三极管做电平转换。

2.2 Arduino IDE 配置与 PlatformIO 对比

核心原理:Arduino IDE 和 PlatformIO 是两种主流的 ESP32 开发环境。Arduino IDE 简单直观,适合快速原型验证;PlatformIO 基于 VS Code,提供专业的项目管理、库依赖管理和多环境编译,更适合复杂工程和团队协作。对于规则引擎这种涉及多传感器、多库依赖的项目,推荐使用 PlatformIO,但本课程将同时覆盖两种方式,以便你根据自身习惯选择。

Arduino IDE 配置步骤:

  1. 下载并安装 Arduino IDE 2.x(从官网 arduino.cc 获取)。
  2. 打开 IDE,进入 文件 → 首选项,在“附加开发板管理器网址”中添加:
    https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
  3. 进入 工具 → 开发板 → 开发板管理器,搜索“esp32”,安装 esp32 by Espressif Systems 版本 2.0.17(或最新稳定版)。
  4. 安装完成后,在 工具 → 开发板 中选择 ESP32 Dev Module,并设置 Flash Size 为 4MB,Partition Scheme 为 Default 4MB with spiffs。
  5. 选择正确的 COM 端口(Windows 设备管理器中查看,macOS 为 /dev/cu.usbserial-xxx)。

PlatformIO 配置步骤:

  1. 安装 VS Code,并在扩展市场安装 PlatformIO IDE 插件。
  2. 创建新项目,Board 选择 Espressif ESP32 Dev Module,Framework 选择 Arduino。
  3. 在 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
  4. PlatformIO 会自动下载并编译依赖库,无需手动安装。
对比维度 Arduino IDE PlatformIO
上手难度 低,适合初学者 中等,需熟悉 VS Code
库管理 手动安装,版本冲突常见 自动解析依赖,支持多版本
编译速度 较慢,全量编译 增量编译,速度快
调试支持 仅串口打印 支持原生调试器(需外接 JTAG)
项目结构 单文件 .ino 多文件 src/、include/、lib/
经验建议:如果你只是做课程实验或快速验证规则逻辑,Arduino IDE 足够。但若你计划将规则引擎部署到实际产品中,建议直接使用 PlatformIO,它能让代码结构更清晰,且方便后续添加单元测试和 CI/CD 流程。

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"];
库版本锁定:在 PlatformIO 中,建议将 lib_deps 中的版本号固定(如 @^7.0.0),避免未来库更新导致 API 不兼容。在 Arduino IDE 中,安装库后可在 文件 → 首选项 → 显示详细编译输出 中查看实际使用的库路径,确保没有重复或冲突版本。

2.4 硬件连接基础与实战案例

核心原理:硬件连接是规则引擎的物理基础。一个典型的连接方案包括:ESP32 通过 GPIO 读取传感器数据,经过规则判断后,通过 GPIO 控制继电器或 LED。连接时必须注意信号方向、电平匹配和电源隔离。

标准连接拓扑:

  1. DHT22 数据引脚 → GPIO4(需外接 4.7kΩ 上拉至 3.3V)
  2. BH1750 SDA → GPIO21,SCL → GPIO22,VCC → 3.3V,GND → GND
  3. PIR 输出 → GPIO17,VCC → 3.3V,GND → GND
  4. 继电器 IN → GPIO26,VCC → 5V,GND → GND(与 ESP32 共地)
  5. LED 正极 → GPIO27(串联 220Ω 限流电阻),负极 → GND

实战案例:智能温控风扇

假设我们要实现一个规则:当温度大于 30℃ 且光照强度大于 500 lux 时,自动开启继电器(控制风扇)。同时,当 PIR 检测到人体时,点亮 LED 作为提示。

初始现象与目标:手动控制风扇和 LED 太麻烦,希望通过传感器自动触发。关键输入数据:DHT22 温度值、BH1750 光照值、PIR 数字输出。

分析判断过程:规则引擎需要同时读取三个传感器,并按照优先级判断:先检查 PIR(安全提示),再检查温度和光照(舒适度控制)。若温度超过阈值但光照不足,则不开风扇(避免误判)。

实际操作步骤:

  1. 按照上述拓扑完成接线,并上传以下测试代码验证传感器读数:
    #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);
    }
  2. 确认串口输出正常后,加入规则判断逻辑:
    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);
    }
  3. 使用吹风机模拟高温、手机闪光灯模拟强光,验证继电器是否按预期动作。

结果对比与复盘:初始测试时发现 PIR 误触发频繁,原因是 PIR 模块上的灵敏度旋钮调得过高。调整旋钮后,误触发率显著下降。另外,继电器在切换瞬间会产生电磁干扰,导致 ESP32 偶尔重启,解决方案是在继电器线圈两端并联一个 1N4007 二极管(反向吸收浪涌),并在电源输入端加 100μF 电解电容滤波。

排障要点:如果传感器读数始终为 NaN 或 0,首先检查接线是否松动、是否共地、上拉电阻是否接对。使用万用表测量传感器 VCC 和 GND 之间的电压,应为 3.3V 或 5V(根据模块要求)。对于 I2C 设备,可用 I2C 扫描程序确认设备地址是否正确。

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 共地,且电源稳定。