Skip to content

ESP32 普中开发板功能测试案例 ​

实验概述 ​

基于普中 PZ-ESP32 开发板(ESP32-WROOM-32 模组),零代码完成一个完整的物联网综合演示:

  • 数据采集:DHT11 温湿度 + ADC 电位器(0~4095),每 10 秒采集并上报物联网平台
  • 本地显示:TM1637 数码管轮流显示温度/湿度,OLED 开机显示三行欢迎信息,并可显示平台下发的文字
  • 联动报警:温度超过 28°C 时蜂鸣器自动报警(无源蜂鸣器,2700Hz PWM 持续鸣响),恢复后自动解除
  • 按键控制:KEY1 继电器、KEY2 蜂鸣器、KEY3 RGB 七彩灯珠、KEY4 四个 LED 灯
  • 红外遥控:规则默认直接匹配普中配套 NEC 遥控器的原始编码,开箱即用无需对码;更换任意遥控器时,再通过 Web 对码学习按键并改用按键名绑定即可,无需修改动作
  • 远程控制:平台可下发指令控制继电器、蜂鸣器、RGB 灯效、LED 灯组和 OLED 文字

全部功能通过 外设配置 + 外设执行规则 实现,无需编写任何代码。

硬件信息 ​

普中 PZ-ESP32 开发板由核心板(ESP32-WROOM-32)+ 底板组成,底板集成 LED、按键、蜂鸣器等常用外设,其余模块通过杜邦线连接。

引脚映射总表 ​

外设GPIO接线说明
DHT11 温湿度GPIO32DATA→GPIO32,VCC→3.3V,GND→GND
ADC 电位器GPIO34中间抽头→GPIO34,两端分别接 3.3V / GND
TM1637 数码管GPIO18 / GPIO19CLK→GPIO18,DIO→GPIO19,VCC→3.3V
OLED 0.91寸 (I2C)GPIO22 / GPIO23SDA→GPIO22,SCL→GPIO23,VCC→3.3V(底排最右侧相邻两脚,紧邻 GND);切勿接 5V
WS2812B RGB 灯珠×5GPIO12DIN→GPIO12,VCC→5V,GND→GND
蜂鸣器GPIO13控制脚→GPIO13(无源蜂鸣器,需 PWM 驱动),VCC→3.3V,GND→GND(顶排紧邻 GND 脚)
继电器GPIO33IN→GPIO33(高电平吸合),VCC→5V,GND→GND(必须与 ESP32 共地)
KEY1~KEY4GPIO14 / 27 / 26 / 25按键另一端接 GND(内部上拉,按下为低);顶排连续四脚,接线方便
LED D1~D4GPIO4 / 16 / 17 / 5低电平点亮(阳极经限流电阻接 VCC);底排连续四脚,接线方便
红外接收头 (VS1838B)GPIO35OUT→GPIO35,GND→GND,VCC→3.3V(接收头正对凸起面,引脚从左至右为 OUT / GND / VCC)

引脚说明 ​

  • GPIO34 为输入专用引脚(无内部上拉),属于 ADC1 通道,WiFi 工作时仍可正常采集(ADC2 在 WiFi 下不可用)
  • GPIO35 也是输入专用引脚,作红外接收正合适;VS1838B 接收头为推挽输出,无需外接上拉电阻。教程中的 IO14 已被 KEY1 占用,故红外改用 GPIO35(顶排 32/34 之间,接线方便)
  • KEY1~KEY4(GPIO14/27/26/25) 位于顶排连续四个引脚,均有内部上拉,无需外接电阻
  • GPIO13(蜂鸣器):普中板载蜂鸣器为无源蜂鸣器,普通高低电平(数字输出)不会发声,必须配置为 PWM 输出(本方案 2700Hz、8 位分辨率)以占空比驱动鸣响/停止
  • GPIO12(MTDI) 为 strapping 引脚,不能接低电平有效 LED 等带上拉的负载;WS2812B 的 DIN 是高阻输入,不会干扰启动,可安全使用
  • GPIO5(LED D4) 是 strapping 引脚(影响 SDIO 时序),作 LED 输出安全;本方案已避开 GPIO2/15,烧录下载不受 LED 接线影响
  • GPIO0/1/3 被固件保留(BOOT/串口),GPIO2/15/21 未使用,可留作扩展
  • 继电器不使用板载 KEY4 相同的 GPIO25,避免引脚冲突

实现流程 ​

步骤1:烧录固件 ​

方式A — 在线烧录(推荐)

  1. 打开 在线烧录工具
  2. 选择波特率 → 选择串口 → 选择固件文件 fastbee-esp32-F4R0.bin
  3. 点击 烧录 按钮,等待完成

方式B — 源码烧录

powershell
powershell -ExecutionPolicy Bypass -File scripts\deploy.ps1 -Env esp32-F4R0 -Port <serial-port>

详见 烧录与测试。

esp32-F4R0 是 4MB 单 app 环境,不支持 OTA,且不编译以太网和 4G;本例仅使用 WiFi。

步骤2:配置网络 ​

  1. 固件烧录后设备重启,电脑连接 WiFi 热点 fastbee-xxxx(密码:admin123)
  2. 浏览器访问 http://192.168.4.1 或 http://fastbee.local,使用 admin / admin123 登录
  3. 进入 网络配置,模式选择 客户端模式(STA),填写 WiFi 名称和密码,点击保存
  4. 等待设备重启,电脑重新连接正常 WiFi,再通过核验后的STA地址访问设备;mDNS实际启用且解析成功时才使用fastbee.local

AP 仅用于首次配置和恢复。日常使用及脚本验证应切换到 STA,并使用路由器分配的设备地址;测试脚本会拒绝 192.168.4.1。

步骤3:外设配置(peripherals.json) ​

先在 功能配置 中启用 OLED/LCD、NeoPixel、TM1637 和红外遥控并重启,再到 外设配置 页面逐个新建外设,或直接使用文末 配置导入。共 16 个外设:

外设 ID名称类型引脚关键参数
dht11DHT11温湿度传感器38 通用传感器32sensorType:0(DHT11)、sampleInterval:10000
adc_potADC电位器26 ADC34attenuation:3、resolution:12
tm1637四位数码管47 TM163718, 19brightness:4、colon:false
oledOLED显示屏36 LCD(OLED)22, 23width:128、height:32、interface:2(I2C)、contrast:200
rgb_ledRGB七彩灯珠45 WS2812B12count:5、brightness:128
buzzer蜂鸣器17 PWM输出13pwmFrequency:2700、pwmResolution:8、initialState:0
relay继电器12 数字输出33initialState:0
key1 ~ key4按键KEY1~KEY413 数字输入(上拉)14, 27, 26, 25无
led_d1 ~ led_d4LED灯D1~D412 数字输出4, 16, 17, 5initialState:1(低电平点亮,上电熄灭)
ir_recv红外接收头53 红外接收35无

外设类型说明:38=通用传感器(DHT11)、26=ADC、47=TM1637 数码管、36=LCD(OLED 屏归入此类型,I2C 接口)、45=WS2812B、12=GPIO 数字输出、17=GPIO PWM 输出、13=GPIO 输入(上拉)、53=红外接收头。LED 为低电平点亮,initialState: 1 表示上电默认熄灭。外设 ID 需与后续规则、物模型标识保持一致。

步骤4:红外对码(学习遥控器按键,可选) ​

本案例的红外规则默认直接匹配普中配套遥控器的 NEC 原始编码(见步骤5 表格),使用配套遥控器时无需对码,开箱即用。只有需要更换其他品牌遥控器、或想改用按键名绑定时,才需要执行本步骤:先将遥控器按键学习进设备的按键库并命名,再把规则的匹配值改为 key:按键名。这样之后更换任意品牌遥控器只需重新对码,无需修改任何规则。

  1. 开启页面右上角的 开发者模式(对码/清码属于写操作,需要此模式)
  2. 进入 外设配置 页面,在“红外接收头”所在行点击 红外管理 按钮
  3. 设置学习超时(默认 10 秒,可填 3~60 秒),点击 开始学习
  4. 将遥控器对准接收头按下要录入的按键,页面显示捕获到的编码与协议
  5. 在 按键名称 输入框填写名字(如 key1),点击 保存按键
  6. 重复 3~5 步,依次录入需要的按键

若改用按键名绑定,建议录入的按键与绑定动作(按键名可自定义,但需与规则中的名字一致):

遥控器按键建议按键名普中配套遥控器编码绑定动作
键 1key1NEC 0x00FF30CF继电器翻转
键 2key2NEC 0x00FF18E7蜂鸣器短响200ms
键 3key3NEC 0x00FF7A85RGB 彩虹轮播
键 4key4NEC 0x00FF10EFLED D1~D4 翻转
键 0key0NEC 0x00FF6897RGB 关闭

按键名仅允许字母、数字、下划线、短横线(1~32 字符),最多保存 40 个按键;按键库持久化到 /config/periph_exec.json 的 irKeys,可随配置一同导出导入。学习窗口期间不会派发 ir_code_received 事件,不会误触发已有规则。使用普中配套遥控器时可跳过本步骤;换用其他遥控器时,用相同的按键名重新对码覆盖,并把规则的 compareValue 改为 key:按键名 即可。

步骤5:外设执行配置(periph_exec.json) ​

在 外设执行管理 页面创建规则,共 20 条:

规则触发方式执行动作
exec_001 数据采集上报定时,每 10 秒读温度 + 读湿度 + 读 ADC,执行后上报平台
exec_002 数码管轮显温湿度定时,每 10 秒显示温度 → 延时 5 秒 → 显示湿度
exec_003 高温报警数据源事件,温度 > 28蜂鸣器 PWM 占空比 128(50%)持续鸣响
exec_004 温度恢复解除报警数据源事件,温度 ≤ 28蜂鸣器 PWM 占空比置 0,停止鸣响
exec_005 / 006KEY1 / KEY2 单击继电器翻转 / 蜂鸣器短响200ms
exec_007 / 008KEY3 单击 / 双击RGB 彩虹轮播 / 关闭
exec_009KEY4 单击LED D1~D4 翻转
exec_010 OLED默认显示系统启动完成事件OLED 显示三行欢迎信息(首行居中)
exec_011 平台下发OLED文字平台触发(oled)OLED 显示下发内容 $value
exec_012 ~ 014平台触发(relay/buzzer/rgb_led)按下发值控制继电器/蜂鸣器/RGB 灯效
exec_015平台触发(led_all)按下发值控制 LED D1~D4
exec_016 / 017红外编码 NEC:0x00FF30CF / NEC:0x00FF18E7继电器 / 蜂鸣器 翻转
exec_018 / 019红外编码 NEC:0x00FF7A85 / NEC:0x00FF6897RGB 彩虹轮播 / 关闭
exec_020红外编码 NEC:0x00FF10EFLED D1~D4 翻转

红外规则统一使用 事件触发 → 红外编码接收(ir_code_received)。本案例默认用 协议:编码(如 NEC:0x00FF30CF)直接匹配普中配套遥控器,无需对码;若在步骤4 做了对码,也可在表单的“红外按键”下拉中选择已学习的按键(下拉会同时显示按键名与编码,保存后 compareValue 为 key:按键名)。compareValue 支持三种写法:

写法示例说明
协议:编码NEC:0x00FF30CF本案例默认。直接匹配配套遥控器编码,开箱即用
key:按键名key:key1按已学习按键名匹配,换遥控器无需改规则(需先对码)
编码0x00FF30CF 或 00FF30CF任意协议 + 编码,0x 前缀可省,大小写不敏感

留空(选“-- 任意红外按键 --”)表示收到任何红外编码都触发。同一触发器最小重复间隔 1 秒,驱动层另有 150ms 防抖与 NEC 重复码过滤,长按不会连续触发。

步骤6:FastBee 平台配置(可选) ​

1. 平台端

在 FastBee 物联网平台 创建产品,物模型标识需与设备端外设 ID 一致:

物模型标识方向说明
temperature / humidity上报DHT11 温度(°C)/ 湿度(%RH)
adc上报电位器采集值 0~4095
oled下发字符串,OLED 显示文字(仅 ASCII)
relay / buzzer下发/上报1 开、0 关、toggle 翻转
rgb_led下发灯效:red、green、blue、rainbow、breathing、off 等
led_all下发LED 灯组(D1~D4):0 全亮(低电平点亮)、1 全灭、toggle 翻转

2. 设备端

  • 设备配置 → 基本信息中填写 产品编号
  • 通信协议 → 配置 MQTT 参数:
参数值
服务器iot.fastbee.cn(演示地址)
端口1883(默认)
账号/密码平台获取的凭证
客户端 ID格式:S&设备编号&产品ID&1

MQTT 连接成功后即可在平台 Web 端 / FastBee App 查看采集数据并远程控制设备。

功能说明 ​

  1. 温度监控报警:每次温湿度采集后,固件将数值推送给数据驱动规则评估。温度 > 28°C 触发 exec_003,蜂鸣器以 2700Hz PWM、50% 占空比持续鸣响;温度 ≤ 28°C 触发 exec_004,占空比置 0 自动停响
  2. 数据采集上报:exec_001 每 10 秒读取温度、湿度、ADC 电位器并上报平台(reportAfterExec: true)
  3. 数码管轮显:exec_002 每个周期先显示温度约 5 秒,再显示湿度约 5 秒,循环往复
  4. 按键控制:单击 KEY1~KEY4 分别翻转继电器、蜂鸣器、RGB(双击 KEY3 关闭)、4 个 LED
  5. 红外遥控:红外接收头解码后派发 ir_code_received 事件,规则默认按 NEC:编码 直接匹配普中配套遥控器的 5 个按键——键 1 继电器、键 2 蜂鸣器、键 3 RGB 彩虹、键 0 RGB 关闭、键 4 翻转 4 个 LED,与按键控制效果一致;若已对码录入按键库,事件会带上 key 字段,也可改用 key:按键名 匹配
  6. OLED 显示:开机(system_ready 事件)显示三行欢迎信息 #FastBee Arduino / PuZhong ESP32 / IoT Demo Ready,首行 # 表示居中;平台向 oled 标识下发字符串后立即刷新显示。OLED 动作(actionType: 27)的文本还支持 ${外设ID.字段} 占位符,例如把 actionValue 写成 #Sensor\n T:${dht11.temperature}C\n H:${dht11.humidity}% 即可直接把实时温湿度显示到屏上

导入前先备份现场身份、网络、认证及业务配置,并开启开发模式。下方外设与规则保持禁用,核验引脚和接线后按需启用;禁用配置不是已经完成硬件验证。

配置导入 ​

以下配置可直接导入设备:设备配置 → 高级配置 → 导入配置,导入后重启生效。包含 peripherals.json(16 个外设)和 periph_exec.json(20 条规则);真实 WiFi 和平台凭据应在本地填写,不要写入公开示例。红外规则已内置普中配套遥控器的 NEC 编码;若换用其他遥控器,再按步骤4 对码并改用按键名匹配。

json
{
  "type": "fastbee-config-bundle",
  "version": 1,
  "scope": "selected",
  "exportedAt": "2026-07-28T08:00:00.000Z",
  "files": [
    {
      "name": "peripherals.json",
      "content": "{\"peripherals\":[{\"id\":\"dht11\",\"name\":\"DHT11温湿度传感器\",\"type\":38,\"enabled\":false,\"pins\":[32],\"pinCount\":1,\"params\":{\"sensorType\":0,\"sampleInterval\":10000}},{\"id\":\"adc_pot\",\"name\":\"ADC电位器\",\"type\":26,\"enabled\":false,\"pins\":[34],\"pinCount\":1,\"params\":{\"attenuation\":3,\"resolution\":12,\"sampleRate\":0}},{\"id\":\"tm1637\",\"name\":\"四位数码管\",\"type\":47,\"enabled\":false,\"pins\":[18,19],\"pinCount\":2,\"params\":{\"brightness\":4,\"colon\":false}},{\"id\":\"oled\",\"name\":\"OLED显示屏\",\"type\":36,\"enabled\":false,\"pins\":[22,23],\"pinCount\":2,\"params\":{\"width\":128,\"height\":32,\"interface\":2,\"contrast\":200}},{\"id\":\"rgb_led\",\"name\":\"RGB七彩灯珠\",\"type\":45,\"enabled\":false,\"pins\":[12],\"pinCount\":1,\"params\":{\"count\":5,\"brightness\":128}},{\"id\":\"buzzer\",\"name\":\"蜂鸣器\",\"type\":17,\"enabled\":false,\"pins\":[13],\"pinCount\":1,\"params\":{\"initialState\":0,\"pwmChannel\":13,\"pwmFrequency\":2700,\"pwmResolution\":8}},{\"id\":\"relay\",\"name\":\"继电器\",\"type\":12,\"enabled\":false,\"pins\":[33],\"pinCount\":1,\"params\":{\"initialState\":0}},{\"id\":\"key1\",\"name\":\"按键KEY1\",\"type\":13,\"enabled\":false,\"pins\":[14],\"pinCount\":1,\"params\":{}},{\"id\":\"key2\",\"name\":\"按键KEY2\",\"type\":13,\"enabled\":false,\"pins\":[27],\"pinCount\":1,\"params\":{}},{\"id\":\"key3\",\"name\":\"按键KEY3\",\"type\":13,\"enabled\":false,\"pins\":[26],\"pinCount\":1,\"params\":{}},{\"id\":\"key4\",\"name\":\"按键KEY4\",\"type\":13,\"enabled\":false,\"pins\":[25],\"pinCount\":1,\"params\":{}},{\"id\":\"led_d1\",\"name\":\"LED灯D1\",\"type\":12,\"enabled\":false,\"pins\":[4],\"pinCount\":1,\"params\":{\"initialState\":1}},{\"id\":\"led_d2\",\"name\":\"LED灯D2\",\"type\":12,\"enabled\":false,\"pins\":[16],\"pinCount\":1,\"params\":{\"initialState\":1}},{\"id\":\"led_d3\",\"name\":\"LED灯D3\",\"type\":12,\"enabled\":false,\"pins\":[17],\"pinCount\":1,\"params\":{\"initialState\":1}},{\"id\":\"led_d4\",\"name\":\"LED灯D4\",\"type\":12,\"enabled\":false,\"pins\":[5],\"pinCount\":1,\"params\":{\"initialState\":1}},{\"id\":\"ir_recv\",\"name\":\"红外接收头\",\"type\":53,\"enabled\":false,\"pins\":[35],\"pinCount\":1,\"params\":{}}]}"
    },
    {
      "name": "periph_exec.json",
      "content": "{\"rules\":[{\"id\":\"exec_001\",\"name\":\"数据采集上报\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":1,\"triggerPeriphId\":\"\",\"operatorType\":0,\"compareValue\":\"\",\"timerMode\":0,\"intervalSec\":10,\"timePoint\":\"\",\"eventId\":\"\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"dht11\",\"actionType\":19,\"actionValue\":\"{\\\"periphId\\\":\\\"dht11\\\",\\\"sensorCategory\\\":\\\"dht11\\\",\\\"scaleFactor\\\":1,\\\"offset\\\":0,\\\"decimalPlaces\\\":1,\\\"sensorLabel\\\":\\\"temperature\\\",\\\"unit\\\":\\\"°C\\\",\\\"dataField\\\":\\\"temperature\\\"}\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0},{\"targetPeriphId\":\"dht11\",\"actionType\":19,\"actionValue\":\"{\\\"periphId\\\":\\\"dht11\\\",\\\"sensorCategory\\\":\\\"dht11\\\",\\\"scaleFactor\\\":1,\\\"offset\\\":0,\\\"decimalPlaces\\\":1,\\\"sensorLabel\\\":\\\"humidity\\\",\\\"unit\\\":\\\"%RH\\\",\\\"dataField\\\":\\\"humidity\\\"}\",\"useReceivedValue\":false,\"syncDelayMs\":200,\"execMode\":0},{\"targetPeriphId\":\"adc_pot\",\"actionType\":19,\"actionValue\":\"{\\\"periphId\\\":\\\"adc_pot\\\",\\\"sensorCategory\\\":\\\"analog\\\",\\\"scaleFactor\\\":1,\\\"offset\\\":0,\\\"decimalPlaces\\\":0,\\\"sensorLabel\\\":\\\"adc\\\",\\\"unit\\\":\\\"\\\"}\",\"useReceivedValue\":false,\"syncDelayMs\":200,\"execMode\":0}],\"protocolType\":0,\"reportAfterExec\":true},{\"id\":\"exec_002\",\"name\":\"数码管轮显温湿度\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":1,\"triggerPeriphId\":\"\",\"operatorType\":0,\"compareValue\":\"\",\"timerMode\":0,\"intervalSec\":10,\"timePoint\":\"\",\"eventId\":\"\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"dht11\",\"actionType\":19,\"actionValue\":\"{\\\"periphId\\\":\\\"dht11\\\",\\\"sensorCategory\\\":\\\"dht11\\\",\\\"scaleFactor\\\":1,\\\"offset\\\":0,\\\"decimalPlaces\\\":1,\\\"sensorLabel\\\":\\\"temperature\\\",\\\"unit\\\":\\\"°C\\\",\\\"dataField\\\":\\\"temperature\\\"}\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0},{\"targetPeriphId\":\"tm1637\",\"actionType\":24,\"actionValue\":\"${dht11.temperature}\",\"useReceivedValue\":false,\"syncDelayMs\":200,\"execMode\":0},{\"targetPeriphId\":\"dht11\",\"actionType\":19,\"actionValue\":\"{\\\"periphId\\\":\\\"dht11\\\",\\\"sensorCategory\\\":\\\"dht11\\\",\\\"scaleFactor\\\":1,\\\"offset\\\":0,\\\"decimalPlaces\\\":1,\\\"sensorLabel\\\":\\\"humidity\\\",\\\"unit\\\":\\\"%RH\\\",\\\"dataField\\\":\\\"humidity\\\"}\",\"useReceivedValue\":false,\"syncDelayMs\":5000,\"execMode\":0},{\"targetPeriphId\":\"tm1637\",\"actionType\":24,\"actionValue\":\"${dht11.humidity}\",\"useReceivedValue\":false,\"syncDelayMs\":200,\"execMode\":0}],\"protocolType\":0,\"reportAfterExec\":false},{\"id\":\"exec_003\",\"name\":\"高温报警\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":4,\"triggerPeriphId\":\"\",\"operatorType\":2,\"compareValue\":\"28\",\"timerMode\":0,\"intervalSec\":0,\"timePoint\":\"\",\"eventId\":\"ds:dht11_temperature\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"buzzer\",\"actionType\":4,\"actionValue\":\"128\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0}],\"protocolType\":0,\"reportAfterExec\":false},{\"id\":\"exec_004\",\"name\":\"温度恢复解除报警\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":4,\"triggerPeriphId\":\"\",\"operatorType\":5,\"compareValue\":\"28\",\"timerMode\":0,\"intervalSec\":0,\"timePoint\":\"\",\"eventId\":\"ds:dht11_temperature\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"buzzer\",\"actionType\":4,\"actionValue\":\"0\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0}],\"protocolType\":0,\"reportAfterExec\":false},{\"id\":\"exec_005\",\"name\":\"KEY1控制继电器\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":4,\"triggerPeriphId\":\"key1\",\"operatorType\":0,\"compareValue\":\"\",\"timerMode\":0,\"intervalSec\":0,\"timePoint\":\"\",\"eventId\":\"button_click\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"relay\",\"actionType\":10,\"actionValue\":\"toggle\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0}],\"protocolType\":0,\"reportAfterExec\":true},{\"id\":\"exec_006\",\"name\":\"KEY2控制蜂鸣器\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":4,\"triggerPeriphId\":\"key2\",\"operatorType\":0,\"compareValue\":\"\",\"timerMode\":0,\"intervalSec\":0,\"timePoint\":\"\",\"eventId\":\"button_click\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"buzzer\",\"actionType\":4,\"actionValue\":\"128\",\"execMode\":1},{\"targetPeriphId\":\"buzzer\",\"actionType\":4,\"actionValue\":\"0\",\"execMode\":1,\"syncDelayMs\":200}],\"protocolType\":0,\"reportAfterExec\":true},{\"id\":\"exec_007\",\"name\":\"KEY3开启RGB彩虹\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":4,\"triggerPeriphId\":\"key3\",\"operatorType\":0,\"compareValue\":\"\",\"timerMode\":0,\"intervalSec\":0,\"timePoint\":\"\",\"eventId\":\"button_click\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"rgb_led\",\"actionType\":11,\"actionValue\":\"rainbow\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0}],\"protocolType\":0,\"reportAfterExec\":false},{\"id\":\"exec_008\",\"name\":\"KEY3双击关闭RGB\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":4,\"triggerPeriphId\":\"key3\",\"operatorType\":0,\"compareValue\":\"\",\"timerMode\":0,\"intervalSec\":0,\"timePoint\":\"\",\"eventId\":\"button_double_click\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"rgb_led\",\"actionType\":11,\"actionValue\":\"off\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0}],\"protocolType\":0,\"reportAfterExec\":false},{\"id\":\"exec_009\",\"name\":\"KEY4控制LED-D1到D4\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":4,\"triggerPeriphId\":\"key4\",\"operatorType\":0,\"compareValue\":\"\",\"timerMode\":0,\"intervalSec\":0,\"timePoint\":\"\",\"eventId\":\"button_click\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"led_d1\",\"actionType\":10,\"actionValue\":\"toggle\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0},{\"targetPeriphId\":\"led_d2\",\"actionType\":10,\"actionValue\":\"toggle\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0},{\"targetPeriphId\":\"led_d3\",\"actionType\":10,\"actionValue\":\"toggle\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0},{\"targetPeriphId\":\"led_d4\",\"actionType\":10,\"actionValue\":\"toggle\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0}],\"protocolType\":0,\"reportAfterExec\":false},{\"id\":\"exec_010\",\"name\":\"OLED默认显示\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":4,\"triggerPeriphId\":\"\",\"operatorType\":0,\"compareValue\":\"\",\"timerMode\":0,\"intervalSec\":0,\"timePoint\":\"\",\"eventId\":\"system_ready\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"oled\",\"actionType\":27,\"actionValue\":\"#FastBee Arduino\\nPuZhong ESP32\\nIoT Demo Ready\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0}],\"protocolType\":0,\"reportAfterExec\":false},{\"id\":\"exec_011\",\"name\":\"平台下发OLED文字\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":0,\"triggerPeriphId\":\"oled\",\"operatorType\":1,\"compareValue\":\"\",\"timerMode\":0,\"intervalSec\":0,\"timePoint\":\"\",\"eventId\":\"\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"oled\",\"actionType\":27,\"actionValue\":\"$value\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0}],\"protocolType\":0,\"reportAfterExec\":true},{\"id\":\"exec_012\",\"name\":\"平台控制继电器\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":0,\"triggerPeriphId\":\"relay\",\"operatorType\":1,\"compareValue\":\"\",\"timerMode\":0,\"intervalSec\":0,\"timePoint\":\"\",\"eventId\":\"\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"relay\",\"actionType\":10,\"actionValue\":\"$value\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0}],\"protocolType\":0,\"reportAfterExec\":true},{\"id\":\"exec_013\",\"name\":\"平台控制蜂鸣器\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":0,\"triggerPeriphId\":\"buzzer\",\"operatorType\":1,\"compareValue\":\"\",\"timerMode\":0,\"intervalSec\":0,\"timePoint\":\"\",\"eventId\":\"\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"buzzer\",\"actionType\":10,\"actionValue\":\"$value\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0}],\"protocolType\":0,\"reportAfterExec\":true},{\"id\":\"exec_014\",\"name\":\"平台控制RGB灯效\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":0,\"triggerPeriphId\":\"rgb_led\",\"operatorType\":1,\"compareValue\":\"\",\"timerMode\":0,\"intervalSec\":0,\"timePoint\":\"\",\"eventId\":\"\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"rgb_led\",\"actionType\":11,\"actionValue\":\"$value\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0}],\"protocolType\":0,\"reportAfterExec\":true},{\"id\":\"exec_015\",\"name\":\"平台控制LED-D1到D4\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":0,\"triggerPeriphId\":\"led_all\",\"operatorType\":1,\"compareValue\":\"\",\"timerMode\":0,\"intervalSec\":0,\"timePoint\":\"\",\"eventId\":\"\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"led_d1\",\"actionType\":10,\"actionValue\":\"$value\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0},{\"targetPeriphId\":\"led_d2\",\"actionType\":10,\"actionValue\":\"$value\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0},{\"targetPeriphId\":\"led_d3\",\"actionType\":10,\"actionValue\":\"$value\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0},{\"targetPeriphId\":\"led_d4\",\"actionType\":10,\"actionValue\":\"$value\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0}],\"protocolType\":0,\"reportAfterExec\":true},{\"id\":\"exec_016\",\"name\":\"遥控键1控制继电器\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":4,\"triggerPeriphId\":\"\",\"operatorType\":0,\"compareValue\":\"NEC:0x00FF30CF\",\"timerMode\":0,\"intervalSec\":0,\"timePoint\":\"\",\"eventId\":\"ir_code_received\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"relay\",\"actionType\":10,\"actionValue\":\"toggle\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0}],\"protocolType\":0,\"reportAfterExec\":true},{\"id\":\"exec_017\",\"name\":\"遥控键2控制蜂鸣器\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":4,\"triggerPeriphId\":\"\",\"operatorType\":0,\"compareValue\":\"NEC:0x00FF18E7\",\"timerMode\":0,\"intervalSec\":0,\"timePoint\":\"\",\"eventId\":\"ir_code_received\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"buzzer\",\"actionType\":4,\"actionValue\":\"128\",\"execMode\":1},{\"targetPeriphId\":\"buzzer\",\"actionType\":4,\"actionValue\":\"0\",\"execMode\":1,\"syncDelayMs\":200}],\"protocolType\":0,\"reportAfterExec\":true},{\"id\":\"exec_018\",\"name\":\"遥控键3开启RGB彩虹\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":4,\"triggerPeriphId\":\"\",\"operatorType\":0,\"compareValue\":\"NEC:0x00FF7A85\",\"timerMode\":0,\"intervalSec\":0,\"timePoint\":\"\",\"eventId\":\"ir_code_received\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"rgb_led\",\"actionType\":11,\"actionValue\":\"rainbow\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0}],\"protocolType\":0,\"reportAfterExec\":false},{\"id\":\"exec_019\",\"name\":\"遥控键0关闭RGB\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":4,\"triggerPeriphId\":\"\",\"operatorType\":0,\"compareValue\":\"NEC:0x00FF6897\",\"timerMode\":0,\"intervalSec\":0,\"timePoint\":\"\",\"eventId\":\"ir_code_received\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"rgb_led\",\"actionType\":11,\"actionValue\":\"off\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0}],\"protocolType\":0,\"reportAfterExec\":false},{\"id\":\"exec_020\",\"name\":\"遥控键4控制LED-D1到D4\",\"enabled\":false,\"execMode\":0,\"triggers\":[{\"triggerType\":4,\"triggerPeriphId\":\"\",\"operatorType\":0,\"compareValue\":\"NEC:0x00FF10EF\",\"timerMode\":0,\"intervalSec\":0,\"timePoint\":\"\",\"eventId\":\"ir_code_received\",\"pollResponseTimeout\":1000,\"pollMaxRetries\":2,\"pollInterPollDelay\":100}],\"actions\":[{\"targetPeriphId\":\"led_d1\",\"actionType\":10,\"actionValue\":\"toggle\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0},{\"targetPeriphId\":\"led_d2\",\"actionType\":10,\"actionValue\":\"toggle\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0},{\"targetPeriphId\":\"led_d3\",\"actionType\":10,\"actionValue\":\"toggle\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0},{\"targetPeriphId\":\"led_d4\",\"actionType\":10,\"actionValue\":\"toggle\",\"useReceivedValue\":false,\"syncDelayMs\":0,\"execMode\":0}],\"protocolType\":0,\"reportAfterExec\":false}]}"
    }
  ]
}

验证 ​

连接 STA 后,在源码仓库执行:

powershell
powershell -ExecutionPolicy Bypass -File scripts\smoke-test-device.ps1 -BaseUrl http://<device-sta-ip> -Profile unified -RequireNetworkConnected
powershell -ExecutionPolicy Bypass -File scripts\device-web-smoke.ps1 -BaseUrl http://<device-sta-ip> -Rounds 2 -DelayMs 1000 -TimeoutSec 15 -MaxElapsedMs 5000

注意事项 ​

  1. OLED 仅支持 ASCII 字符,平台下发中文会无法显示;多行文本用 \n 分隔,首行以 # 开头时居中显示
  2. OLED 必须用 3.3V 供电,切勿接 5V:本方案实测使用 0.91 寸 128×32 I2C 屏(配置 width:128, height:32, interface:2)。SSD1306 内部自带升压电荷泵,额定 3.3V;若误接 5V 可能出现模块发烫、面板/电荷泵烧毁(现象:上亮下暗渐变→全黑,严重时只剩芯片应答、面板彻底不亮)。一旦发烫立即断电,并用万用表确认 VCC/GND 未接反、未插错孔位
  3. 屏幕上亮下暗(亮度不均):若以 3.3V 供电仍出现上亮下暗渐变,多为电荷泵供电不足,可在外设表单的对比度字段(或配置 contrast)从 255 降到 180~200;若仍无改善且同一接线下换一块新屏正常,则原模块电荷泵/面板已损坏
  4. 切换 GPIO 不能解决亮度问题:SDA/SCL 仅为信号线不供电;若串口日志中 I2C 写错误恒为 0,说明信号链路正常,问题在供电或模块本身
  5. 蜂鸣器规则交互:KEY2及遥控键2使用PWM128,200ms后PWM0,避免满占空比变成直流。报警规则也会操作同一外设,验证时不要同时触发相互覆盖的规则。
  6. 蜂鸣器必须用 PWM 驱动:普中板载为无源蜂鸣器,若误配成数字输出(类型 12)则只有“咔”一声或完全无声;正确配置为 PWM 输出(类型 17),频率建议 2700Hz
  7. LED 为低电平点亮:平台下发 0=点亮、1=熄灭,按键 toggle 不受影响
  8. RGB 灯珠数量:配置中 count: 5 按实验要求设置,如使用普中板载 4 位 RGB 模块请改为 count: 4
  9. 间隔定时最小1秒,轮询触发最小5秒;高温报警采用 ds: 数据源事件触发,不受此限制,仅在每次采集后按条件评估执行;DHT11 固件内部有 2 秒读数缓存,无需担心重复读取
  10. led_all 为虚拟物模型标识,不对应实际外设,仅用于平台批量控制 4 个 LED
  11. 本方案 LED/外设均未占用 GPIO0/2/15 strapping 引脚,烧录固件时无需断开任何接线
  12. 未接线的按键引脚可能误触发:按键引脚虽有内部上拉,但悬空时仍可能受干扰产生误触发事件;若某个按键暂不接线,建议在页面上临时禁用对应的按键规则或禁用该按键外设
  13. 红外遥控需先启用功能:发布环境会编入红外驱动,但运行时默认关闭;在“功能配置”中启用红外并重启后,再按本文配置接收头和规则。ESP32-S3 发布环境还受 RMT/库覆盖限制,详见红外文档。
  14. 更换遥控器:默认规则直接匹配普中配套遥控器的 NEC 编码,换用其他型号遥控器时,在 红外管理 面板重新对码(按键名 key0~key4),并把规则的 compareValue 改为 key:按键名(或逐条更新为新编码)即可;对码、删除按键、清空按键库均属写操作,需先开启 开发者模式;按键库最多 40 个按键,超出后需先删除再新增
  15. 学习不到编码时:确认接收头 OUT 接 GPIO35、VCC 接 3.3V(接反会导致无输出);遥控器正对接收头 20cm 以内短按;学习超时后可重新点击 开始学习。也可在 系统日志 中查看原始解码结果(如 [IR] Received: NEC value=0x00FF30CF bits=32)确认硬件链路是否正常

相关链接 ​

资源地址
FastBee 平台源码gitee.com/beecue/fastbee
FastBee 移动端源码gitee.com/beecue/fastbee-app
按键控制示例按键输入检测
TM1637 显示温湿度示例数码管显示温度
OLED 显示温湿度示例OLED显示温度

蜂信物联 | fastbee.cn