NodeMCU 固件 Si7021 温湿度传感器模块开发指南
发布时间:2026/9/27 10:41:26来源:尧图网络
物联网嵌入式【免费下载链接】nodemcu-firmwareLua based interactive firmware for ESP8266, ESP8285 and ESP32项目地址https://gitcode.com/gh_mirrors/no/nodemcu-firmware点击查看免费下载导读本文基于 NodeMCU 固件仓库中的 si7021 模块文档 与 源码实现完整讲解如何在 ESP8266/ESP8285 上通过 Lua 脚本驱动 Silicon Labs Si7021 温湿度传感器包括传感器初始化、温湿度读取、固件版本查询、唯一序列号读取以及分辨率、片上加热器和供电电压状态的配置管理。读完本文你将能够在 NodeMCU 固件中直接复制运行 Si7021 的完整采集代码并理解其 I²C 底层指令与 CRC 校验机制。一、Si7021 模块概述si7021模块为 NodeMCU 固件提供对 Silicon Labs Si7021 温湿度传感器的访问能力。该传感器通过 I²C 接口通信固定在设备地址0x40上可测量相对湿度最高 12 bit与温度最高 14 bit并内置唯一 64 位电子序列号、片上加热器以及供电电压状态检测等特性。该模块由贡献者 fetchbot 于 2017-04-19 首次引入维护者为 fetchbot模块源码位于 app/modules/si7021.c。从源码注册表LROT_BEGIN(si7021, NULL, 0)可以看出模块共导出 5 个函数和 6 个常量类型名称说明函数si7021.setup()初始化传感器复位并校验存在性函数si7021.setting()配置分辨率、加热器并回读状态函数si7021.read()读取温湿度测量值函数si7021.serial()读取 64 位电子序列号与设备型号函数si7021.firmware()读取传感器内部固件版本常量si7021.RH12_TEMP14/RH08_TEMP12/RH10_TEMP13/RH11_TEMP11测量分辨率选择常量si7021.HEATER_ENABLE/HEATER_DISABLE片上加热器开关模块在默认固件中并不启用需要在编译前于 app/include/user_modules.h 中取消//#define LUA_USE_MODULES_SI7021一行的注释重新编译烧录后才能在 Lua 中调用si7021模块同时需要启用LUA_USE_MODULES_I2C该宏在默认配置中已开启。二、接线与前置准备Si7021 属于典型的 I²C 从设备除 VDD/GND 外仅需 SDA、SCL 两根信号线。使用时需注意供电范围正常工作电压为 1.9V ~ 3.6V当电压跌落到 1.8V ~ 1.9V 区间时传感器会报告 VDD LOW测量精度将无法保证见下文si7021.setting()返回的vdds状态。I²C 总线初始化在调用任何si7021函数之前必须先对总线执行一次i2c.setup()且每个总线只需设置一次。官方示例统一使用i2c.setup(0, sda, scl, i2c.SLOW)即总线 0、100kHz 慢速模式。GPIO 选择文档示例使用 GPIO6SDA与 GPIO5SCL你也可根据硬件接线换用其他空闲 GPIO。若使用 GPIO16 作为 SCL注意 i2c 模块文档 说明其总线速度会被限制在 FAST 以内。标准初始化代码如下local sda, scl 6, 5 i2c.setup(0, sda, scl, i2c.SLOW) -- call i2c.setup() only once si7021.setup()其中si7021.setup()会向传感器发送复位命令0xFE并等待 50ms随后回读用户寄存器0xE7校验默认值0x3A若总线上未检测到设备将抛出found no device错误对应 si7021.c 中的si7021_lua_setup实现。三、读取温湿度si7021.read()语法与返回值hum, temp, hum_dec, temp_dec si7021.read()该函数无参数返回 4 个值返回值含义hum湿度值整数部分temp温度值整数部分hum_dec湿度小数部分千分位0~999temp_dec温度小数部分千分位0~999浮点固件与整数固件差异NodeMCU 固件分为 float 与 integer 两种构建float 固件hum与temp直接返回浮点数hum_dec与temp_dec可忽略。integer 固件hum/temp只含整数部分小数部分需要与hum_dec/temp_dec手工拼接即湿度 hum.hum_dec、温度 temp.temp_dec。示例代码local sda, scl 6, 5 i2c.setup(0, sda, scl, i2c.SLOW) -- call i2c.setup() only once si7021.setup() hum, temp, hum_dec, temp_dec si7021.read() -- Integer firmware using this example print(string.format(Humidity:\t\t%d.%03d\nTemperature:\t%d.%03d\n, hum, hum_dec, temp, temp_dec)) -- Float firmware using this example print(Humidity: ..hum..\n..Temperature: ..temp)底层测量流程源码解析对照 si7021_lua_read 的实现一次read()在底层分两步完成湿度测量向传感器发送0xE5RH 保持主机模式测量命令等待 25ms 后连续读回 3 个字节前两字节为 12/10/8 bit 原始 ADC 数据第三字节为 CRC8 校验。源码使用多项式0x31计算 CRC校验失败直接抛出crc error错误。原始值按hum raw * 125 / 65536 - 6转换为百分比相对湿度。温度测量Si7021 在湿度测量后会自动同步测量温度因此源码不再重复触发温度命令而是直接发送0xE0读取上一次温度测量值读回 2 字节按temp raw * 175.72 / 65536 - 46.85转换为摄氏度。这也解释了为何该命令不含 CRC。注意此处采用了测量命令表见 si7021.c 的命令宏定义中的MEASURE_RH_HOLD模式即测量期间由主机持续占用总线等待结果配合os_delay_us(25000)满足传感器的转换时间需求。四、读取固件版本si7021.firmware()语法与返回值fwrev si7021.firmware()无参数返回fwrev固件版本码返回值含义0xFF固件版本 1.00x20固件版本 2.0示例代码local sda, scl 6, 5 i2c.setup(0, sda, scl, i2c.SLOW) -- call i2c.setup() only once si7021.setup() fwrev si7021.firmware() print(string.format(FW: %X\r\n, fwrev))底层实现该函数通过发送两字节命令0x84B8SI7021_CMD_FIRM_REV读回 1 字节固件版本对应源码 si7021_lua_firmware。固件版本可用于判断传感器内部校正算法是否支持更优的温湿度精度一般新出厂芯片多为 2.0。五、读取设备序列号与型号si7021.serial()语法与返回值sna, snb si7021.serial()无参数返回两个 32 位整数共同构成传感器出厂烧录的 64 位唯一电子序列号返回值含义sna序列号部分 a低 32 位snb序列号部分 b高 32 位其最高字节为设备标识码snb最高字节可用于识别具体芯片型号值十进制型号0x00/0xFF—工程样品engineering samples0x0D13Si70130x1420Si70200x1521Si7021示例代码local sda, scl 6, 5 i2c.setup(0, sda, scl, i2c.SLOW) -- call i2c.setup() only once si7021.setup() sna, snb si7021.serial() print(string.format(SN:\t\t%X%X\nDevice:\tSi70%d, sna, snb, bit.rshift(snb,24)))底层实现源码 si7021_lua_serial 通过两条命令分段读取序列号命令0xFA0FSI7021_CMD_ID1读回 8 字节其中偶数位是数据、奇数位是各自对应的 CRC8 校验字节命令0xFCC9SI7021_CMD_ID2读回 6 字节每 3 字节中前 2 字节为数据、第 3 字节为 CRC 校验。所有 CRC 均使用与湿度测量相同的 CRC8多项式0x31算法逐段累加校验任一校验失败即抛出crc error。该序列号可用于设备唯一标识、出厂溯源或一机一密的绑定场景。六、配置测量参数si7021.setting()语法res, vdds, heater, heater_set si7021.setting(RESOLUTION[, HEATER, HEATER_SETTING])参数说明RESOLUTION必选——测量分辨率对应源码中用户寄存器0xE7的高两位配置位常量含义源码值si7021.RH12_TEMP14相对湿度 12 bit 温度 14 bit默认0x00si7021.RH08_TEMP12相对湿度 8 bit 温度 12 bit0x01si7021.RH10_TEMP13相对湿度 10 bit 温度 13 bit0x80si7021.RH11_TEMP11相对湿度 11 bit 温度 11 bit0x81HEATER可选——片上加热器开关常量含义si7021.HEATER_ENABLE开启片上加热器si7021.HEATER_DISABLE关闭片上加热器默认HEATER_SETTING可选——加热器电流档位取值0x00~0x0F对应加热电流约 3.09 mA ~ 94.20 mA。片上加热器常用于高湿度环境下的冷凝消除或传感器自检。返回值返回值含义resolution当前分辨率0 RH12/TEMP141 RH08/TEMP122 RH10/TEMP133 RH11/TEMP11vdds供电电压状态0 VDD 正常1.9V ~ 3.6V1 VDD 偏低1.8V ~ 1.9Vheater加热器状态0 关闭1 开启heater_setting加热器电流档位0~15示例代码local id, sda, scl 0, 6, 5 i2c.setup(id, sda, scl, i2c.SLOW) -- call i2c.setup() only once si7021.setup() -- 仅设置分辨率为默认的 RH12/TEMP14 res, vdds, heater, heater_set si7021.setting(si7021.RH12_TEMP14) -- 设置分辨率并开启加热器、加热电流档位 0x01 res, vdds, heater, heater_set si7021.setting(si7021.RH12_TEMP14, si7021.HEATER_ENABLE, 0x01)底层实现对照 si7021_lua_setting 的源码setting()的完整流程为校验RESOLUTION参数必须是上述 4 个常量之一否则抛出Invalid argument: resolution将分辨率与保留位0x3A按位或后通过写命令0xE6WRITE_RHT_REG写入用户寄存器若提供了HEATER与HEATER_SETTING两个可选参数则依次校验其取值范围HEATER必须为HEATER_ENABLE/HEATER_DISABLEHEATER_SETTING必须落在0x00~0x0F然后将分辨率 | 加热器位 | 0x3A写入用户寄存器并通过命令0x51WRITE_HEATER_REG写入加热器档位最后分别回读用户寄存器0xE7与加热器寄存器0x11将状态按位拆解后依次返回resolution、vdds、heater与heater_setting。从返回值的位解析逻辑buf_c[0] 6、buf_c[0] 2 0x01等可以看出分辨率位位于配置寄存器最高两位加热器使能位位于 bit2VDD 状态位位于 bit6。七、完整采集示例定时上报温湿度将上述 API 组合起来即可实现一个在 NodeMCU 上周期采集温湿度并通过串口输出的完整脚本-- 接线Si7021 VDD - 3.3V, GND - GND, SDA - GPIO6, SCL - GPIO5 local sda, scl 6, 5 i2c.setup(0, sda, scl, i2c.SLOW) -- call i2c.setup() only once if not si7021 then print(si7021 module is not compiled into this firmware) return end si7021.setup() -- 确认设备型号与固件版本 local sna, snb si7021.serial() local fw si7021.firmware() print(string.format(Device: Si70%d, FW: %X, bit.rshift(snb, 24), fw)) -- 使用默认分辨率 RH12/TEMP14 local res, vdds, heater, hset si7021.setting(si7021.RH12_TEMP14) if vdds 1 then print(WARNING: VDD low (1.8V-1.9V), accuracy not guaranteed) end tmr.create():alarm(5000, tmr.ALARM_AUTO, function() local hum, temp, hum_dec, temp_dec si7021.read() print(string.format(RH: %d.%03d %% Temp: %d.%03d C, hum, hum_dec, temp, temp_dec)) end)运行前请确认固件编译时已在 app/include/user_modules.h 中启用LUA_USE_MODULES_SI7021与LUA_USE_MODULES_I2C且使用 float 构建时可直接打印hum/temp浮点值。八、常见问题排查现象可能原因与解决办法found no device接线错误、SDA/SCL 接反或传感器地址不是0x40例如 Grove 转接板上的其他 Si70xx 系列芯片检查 VDD 是否在 1.9V~3.6V 范围内crc errorI²C 总线时序受干扰多为线缆过长或使用了过高的总线速度改用i2c.SLOW100kHz缩短杜邦线或换用内部上拉更合理的接线温湿度明显异常检查是否设置了过低的测量分辨率或在开启加热器后未留出热平衡时间加热器会使芯片局部升温建议测量间隔等待传感器回到环境温度调用si7021报 nil模块未编译进固件需在 app/include/user_modules.h 启用LUA_USE_MODULES_SI7021后重新编译返回的vdds 1供电电压跌至 1.8V~1.9V精度不受保证请改善供电九、总结si7021模块以 5 个精炼的 Lua API 完整覆盖了 Si7021 传感器的初始化setup、测量read、身份识别serial、固件版本firmware与运行参数管理setting全部能力底层通过 app/modules/si7021.c 中的 I²C 平台接口实现标准 Si70xx 命令集并内置 CRC8多项式0x31校验保障数据完整性。无论用于室内环境监测、气象站还是智能家居联动只需按照本文的接线与示例即可快速落地一套可靠、可复制的温湿度采集方案。赞分享物联网嵌入式【免费下载链接】nodemcu-firmwareLua based interactive firmware for ESP8266, ESP8285 and ESP32项目地址https://gitcode.com/gh_mirrors/no/nodemcu-firmware点击查看免费下载相关推荐Friend 项目隔离 JIT QA Cloud Run 平面解析基于 GitHub Actions 的 fail-closed 云端验收体系Friend 项目隔离 JIT QA Cloud Run 平面解析基于 GitHub Actions 的 fail closed 云端验收体系 本篇技术指南聚物联网嵌入式Corsair Abstract 插件接入指南邮箱、IBAN 与 VAT 校验 API 的统一封装与本地同步Corsair Abstract 插件接入指南邮箱、IBAN 与 VAT 校验 API 的统一封装与本地同步 Corsair 的 corsair dev/a物联网嵌入式LifeOS Interceptor 多页对比事实抽取MultiPageCompare 工作流实战指南LifeOS Interceptor 多页对比事实抽取MultiPageCompare 工作流实战指南 多页对比问题——Python 和 JavaScrip物联网嵌入式上一篇B站视频下载新方案如何免费解锁大会员4K和充电专属内容下一篇终极Windows与Office激活指南KMS_VL_ALL_AIO智能激活脚本完全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网