ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

30分钟跑通:ESP32 Arduino实现Zigbee光照上报,传感器功耗压到μA级

30分钟跑通:ESP32 Arduino实现Zigbee光照上报,传感器功耗压到μA级 30分钟跑通ESP32 Arduino实现Zigbee光照上报传感器功耗压到μA级【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32半夜醒来发现卧室灯自动亮了——智能灯光系统缺一个靠谱的光照传感器而WiFi方案功耗高、组网复杂电池扛不住。我们用 arduino-esp32 项目里的 Zigbee 库基于 ESP32-C6/H2 开发板搭一个 ESP32 Arduino Zigbee 光照传感器光敏电阻读 ADC换算成 lux 后按 ZCL 规范上报给协调器代码全部可改。硬件清单这套料主打便宜、随处能买到且只依赖一个模拟输入引脚。组件作用本文选型主控支持Zigbee 3.0ESP32-C6-DevKitM-1 / ESP32-H2光照传感模拟输出GL5528光敏电阻 10KΩ下拉供电3.3V稳压MicroUSB部署可换电池接线就三根线光敏电阻和下拉电阻构成分压中间节点接模拟引脚[ESP32-C6] [分压电路] 3V3 ──────────────── 光敏电阻 ──┬── GPIO6 (模拟输入) │ GND ─────────────────────────── 10KΩ下拉示例默认引脚写在Zigbee_Illuminance_Sensor.ino第37行illuminance_sensor_pin 6接线不同改这一行就行。环境搭建从空环境到能编译通过只需要装板级支持包并勾对三个编译选项。如果还没克隆代码仓库地址是https://gitcode.com/GitHub_Trending/ar/arduino-esp32打开文件 首选项在附加开发板管理器网址粘贴官方索引地址并保存打开工具 开发板 开发板管理器搜索 esp32 安装最新版本工具 开发板选择ESP32C6 Dev Module或ESP32H2 Dev Module仅这两个芯片支持该示例工具 Zigbee mode必须选Zigbee ED (end device)——示例第31行有编译期检查选错直接报错工具 Partition Scheme选Zigbee 4MB with spiffs工具 USB CDC On Boot设为Enabled以便看串口日志打开示例libraries/Zigbee/examples/Zigbee_Illuminance_Sensor/Zigbee_Illuminance_Sensor.ino点验证能编译通过即环境OK代码怎么跑整个程序分三步走setup()里配端点、注册并启动 Zigbee 协议栈主循环负责 BOOT 键检测另起一个 FreeRTOS 任务循环读 ADC、换算光照值并写入端点端点按报告策略自动把变化量发给协调器。把光敏电阻接到端点上引脚、端点号和端点对象都定义在文件头部见 Zigbee_Illuminance_Sensor.ino 第36-40行#define ZIGBEE_ILLUMINANCE_SENSOR_ENDPOINT 9 uint8_t illuminance_sensor_pin 6; // 行37: 光敏电阻模拟输入引脚 // 行40: 创建光照传感器端点对象 ZigbeeIlluminanceSensor zbIlluminanceSensor ZigbeeIlluminanceSensor(ZIGBEE_ILLUMINANCE_SENSOR_ENDPOINT);把ADC原始值翻译成lux采集任务里读 12 位 ADC线性映射到 Zigbee 光照原始值区间再按 ZCL 公式换算。见文件第46-61行int lsens_analog_raw analogRead(illuminance_sensor_pin); // 行46: 0-4095 int lsens_illuminance_raw map(lsens_analog_raw, 0, 4095, 0, 50000); // 行52: 映射到Zigbee区间 int lsens_illuminance_lux round(pow(10, (lsens_illuminance_raw / 10000.0)) - 1); // 行57 zbIlluminanceSensor.setIlluminance(lsens_illuminance_raw); // 行61: 上报原始值而非luxZCL 照度测量集群的换算公式lux 10^(raw/10000) - 1。示例raw 10000 时 lux 10^1 - 1 9 luxraw 50000 时 lux ≈ 99999 lux。上报的是 raw 值网关侧如 Zigbee2MQTT自己做换算注意不同平台对公式的 -1 处理略有差异。启动协议栈并定好上报节奏初始化集中在setup()见第79-119行zbIlluminanceSensor.setManufacturerAndModel(Espressif, ZigbeeIlluminanceSensor); // 行79 zbIlluminanceSensor.setPowerSource(ZB_POWER_SOURCE_MAINS); // 行82: 电池改 ZB_POWER_SOURCE_BATTERY zbIlluminanceSensor.setMinMaxValue(0, 50000); // 行85: 量程对应0-100000lux Zigbee.addEndpoint(zbIlluminanceSensor); // 行92: 注册端点 if (!Zigbee.begin()) { ESP.restart(); } // 行96: 启动失败就重启入网成功后再定报告策略// 必须在 Zigbee.begin() 之后调用见第119行 zbIlluminanceSensor.setReporting(1, 0, 1000); // 最小间隔1秒变化超1000才上报想压功耗就调大setReporting的间隔参数或换电池供电后参考 Sleepy 示例的深睡机制。联调排错翻车基本集中在编译、入网、烧录三处下面按现象 → 原因 → 解法过一遍。编译报 Zigbee end device mode is not selected现象验证失败错误信息来自示例第31行的#error原因Tools Zigbee mode停在 default解法改成Zigbee ED (end device)同时确认分区方案是Zigbee 4MB with spiffs串口一直打印 Connecting to network... 不结束现象Zigbee started successfully!之后卡在入网等待原因协调器重启后网络默认关闭不允许新设备加入解法在协调器固件里调用Zigbee.openNetwork(time);或在Zigbee.begin()前设置Zigbee.setRebootOpenNetwork(time);换过协调器后设备死活不认新网络现象新协调器开放了网络旧设备仍连不上原因端设备 flash 里存着旧网络信息解法Arduino IDE 中把工具 Erase All Flash Before Sketch Upload设为 Enabled 重新烧录或代码里长按 BOOT 3 秒触发工厂重置示例第135行// loop() 内见第131-135行 if ((millis() - startTime) 3000) { Zigbee.factoryReset(); // 重置Zigbee NVRAM }COM口不识别或烧录失败现象开发板管理器里找不到串口原因多数是只供电不传数的USB线解法换带数据线的USB线仍失败则降低工具 Port处的串口波特率再试收尾与延伸我们跑通了一个完整闭环光敏电阻 → ADC → ZCL 光照原始值 → Zigbee ED 上报。想适配自己的场景改三处就够第37行换引脚第52行map()参数做线性校准第119行setReporting()调上报节奏。接下来可以玩的方向加温湿度采集并上深睡参考 Zigbee_Temp_Hum_Sensor_Sleepy 示例自己造协调器或网关参考 Zigbee_Gateway 示例 和 Zigbee_Scan_Networks 示例换 BH1750 数字光照传感器I2C驱动读法不同但换算和上报逻辑可原样保留参考链接示例源码Zigbee_Illuminance_Sensor.ino示例说明与排错示例 README光照传感器端点文档ep_illuminance_sensor.rstZigbee 库总览zigbee.rst安装指南installing.rst【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表