拓冰建站拓冰建站
首页 / 资讯中心 / 正文

在ESP32 Zigbee光照传感器上做一颗微安耗电的

在ESP32 Zigbee光照传感器上做一颗微安耗电的【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32传感器塞进窗帘盒之后WiFi 版本的电池三天就见底挪个位置又得重新配网。换成 ESP32 Zigbee 光照传感器之后ESP32-C6 Zigbee 终端设备入网一次光线变化超出门槛就把照度推给网关其余时间基本都在睡睡眠电流是微安级。下面按你要解决的四个问题走一遍。为什么电池供电的传感器不用 WiFiWiFi 模块必须保持和 AP 的关联射频关不掉平均功耗停在毫安级Zigbee 终端设备ED只在需要上报或被父节点轮询时醒来其余时间可以整体睡掉所以它才敢用纽扣电池。这块 Arduino Zigbee 光照传感器的硬件部分很简单一个光敏电阻加 10KΩ 下拉就够了接到illuminance_sensor_pin指定的模拟引脚例子里是 GPIO6完整的物料清单见 README.md。Zigbee ED 终端设备模式配置还没装过 ESP32 支持的话先在工具 开发板管理器里搜 esp32 装上。然后做四个设置工具 开发板选 ESP32-C6 或 ESP32-H2 的开发板工具 Zigbee modeZigbee ED (end device)这个不能动工具 分区方案Zigbee 4MB with spiffs工具 USB CDC On BootEnabled否则串口监视器打不开没选 ED 模式的话固件直接编不过.ino 顶部有#ifndef ZIGBEE_MODE_ED守卫编译器会当场报错属于不写就跑不通的那一类。ADC 原始值怎么变成 luxADC 到 lux 的转换公式读取任务跑在一个 FreeRTOS 任务里栈 3072 字节优先级 10每秒采一次样。analogRead拿到 12 位值0-4095建议顺手把 ADC 衰减设到ADC_11db覆盖整个 3.3V 量程先线性映射进 Zigbee 照度原始值区间 0-50000——0 是全黑50000 对应强光下约 100,000 lux再按 Zigbee 规范换算成 lux公式是lux 10^(raw/10000) - 1代入 raw10000 就是 10¹ - 1 9 lux。int raw analogRead(illuminance_sensor_pin); int zbRaw map(raw, 0, 4095, 0, 50000); int lux round(pow(10, zbRaw / 10000.0) - 1); zbIlluminanceSensor.setIlluminance(zbRaw);注意上网的是zbRaw而不是 lux网关拿到原始值后自己反算Home Assistant 里的 illuminance 实体就是这么来的。校准只动map()的四个参数——光敏电阻的实际有效范围往往占不满 0-3.3V映射出来的 lux 会系统性偏大。这段逻辑在 Zigbee_Illuminance_Sensor.ino 的illuminance_sensor_value_update任务里。⚠️ Zigbee2MQTT 展示 lux 时用的是10^(raw/10000)少了那个-1两边对数值时差 1 是正常的。入网之后怎么让光照值自己上报配网前协调器得把网络打开它重启或刷新固件后默认是关闭的在协调器代码里随时可以调Zigbee.openNetwork(time)或者在begin()前写Zigbee.setRebootOpenNetwork(time)。传感器这边注册端点、起完协议栈就会自动去连while (!Zigbee.connected())轮询到入网为止zbIlluminanceSensor.setPowerSource(ZB_POWER_SOURCE_MAINS); zbIlluminanceSensor.setMinMaxValue(0, 50000); Zigbee.addEndpoint(zbIlluminanceSensor); if (!Zigbee.begin()) { ESP.restart(); } zbIlluminanceSensor.setReporting(1, 0, 1000);setReporting就是功耗开关min1、max0 表示不做周期上报原始值变化超过 1000 才发一次且最多每秒一次把 max 改成 300光线不变时也能保证每 300 秒兜底报一次。它必须在Zigbee.begin()之后调用。和 ZHA 或 Zigbee2MQTT 配对时这套策略大概率被平台默认值覆盖以平台实际表现为准。例子里还留了个按钮BOOT 短按触发一次report()立即上报按住超过 3 秒执行Zigbee.factoryReset()清掉网络凭据重新入网。终端设备迟迟连不上时别干等把工具 Erase All Flash Before Sketch Upload设为 Enabled 再烧录或在代码里补一句Zigbee.factoryReset();清掉旧网络配置。终端设备怎么睡到微安级上面示例里ZB_POWER_SOURCE_MAINS表示市电供电射频可以一直醒着。换成电池先改成ZB_POWER_SOURCE_BATTERY整个生命周期变成醒来、报一次、睡下去。仓库里有现成参照温湿度传感器示例 Zigbee_Temp_Hum_Sensor_Sleepy.ino 用定时器唤醒数据发完直接进深睡esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); esp_deep_sleep_start();它把 keep-alive 调成 10 秒避免和上报互相干扰父节点也不会把设备当成掉线。照度不够再加温湿度照这个示例加集群的思路扩展即可想让传感器支持远程刷固件同目录的Zigbee_OTA_Client可以看。更多参数细节去 docs/en/zigbee 翻。【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门