尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Tasmota 中的 Sensirion SEN6X 环境传感器库:CHANGELOG 版本演进与关键 API 源码解析

Tasmota 中的 Sensirion SEN6X 环境传感器库:CHANGELOG 版本演进与关键 API 源码解析 Tasmota 中的 Sensirion SEN6X 环境传感器库CHANGELOG 版本演进与关键 API 源码解析【免费下载链接】TasmotaAlternative firmware for ESP8266 and ESP32 based devices with easy configuration using webUI, OTA updates, automation using timers or rules, expandability and entirely local control over MQTT, HTTP, Serial or KNX. Full documentation at项目地址: https://gitcode.com/GitHub_Trending/ta/Tasmota本文以 Tasmota 仓库内置的 Sensirion SEN6X I²C Arduino 库CHANGELOG.md为主线梳理该库从 0.1.0 到 1.2.0 的完整版本演进脉络并结合库源码与 Tasmota 驱动逐一剖析每个变更对应的 API 实现与固件约束。读者读完后将掌握 SEN6X/SEN66 传感器库的接口清单、命令码与数据缩放规则理解序列号/产品名类型变更、CO₂ 返回类型调整、SHT 加热器时序等关键细节并能在 Tasmota 的Sen6x*命令与 Arduino 示例中正确使用这些能力。一、SEN6X 库在 Tasmota 仓库中的定位Sensirion SEN6X 是面向室内空气质量监测的环境传感器平台产品线包含 SEN62/SEN63C/SEN65/SEN66/SEN68/SEN69C 等型号组合了 PM 颗粒物、温湿度 SHT4x、CO₂SCD4x/STCC4、VOC/NOxSGP41与 HCHOSFA40等多种测量单元。SEN66 是其中集成度较高的型号默认 I²C 地址为0x6B。该 Arduino 库被以第三方库形式打包进 Tasmota 仓库的lib/lib_i2c/Sensirion_I2C_SEN6X_Tasmota/目录下并由驱动 xsns_119_sen6x.ino 接入固件向用户暴露Sen6x、Sen6xClean、Sen6xHeat、Sen6xTempOff、Sen6xVocTune、Sen6xNoxTune、Sen6xAlt、Sen6xPres、Sen6xCal等控制台命令。库的元信息见 library.properties当前版本 1.2.0依赖 Sensirion Core。库文件结构如下src/SensirionI2cSen6x.h公开类SensirionI2cSen6x的全部接口声明、命令 ID 枚举与设备状态位定义src/SensirionI2cSen6x.cpp各接口的 I²C 帧构造与收发实现examples/exampleUsage/exampleUsage.ino最小可用示例复位 → 读序列号 → 启动连续测量 → 每秒读一次全量数据README.md安装、接线与快速上手说明。二、版本演进总览CHANGELOG 遵循 Keep a Changelog 格式与语义化版本规范Semantic Versioning当前发布序列如下版本发布日期类型核心变更0.1.02024-10-31首个版本产品图片、启动/停止/读取测量接口、读取产品名/序列号/版本接口1.0.02024-11-25正式版补齐所有公共接口read_measured_values的 CO₂ 返回类型由 float 改为 uint161.0.12024-12-01修复修正颗粒物数量浓度读取方法的命名mass concentration → number concentration返回值本身无误1.1.02025-02-12变更序列号与产品名改为按字符串解释uint8[32]→int8[32]1.2.02025-03-13新增/变更新增读取固件版本命令新增读取 SHT 加热后温湿度命令固件 ≥ 4.0SHT 加热激活时长缩短至 20ms下面逐版本深入解读并在每个变更点给出源码级佐证。三、v0.1.0初始接口与最小可用闭环首个版本2024-10-31为库奠定了三组核心能力测量的启停与读取startContinuousMeasurement()、stopMeasurement()、readMeasuredValues(...)设备身份读取getProductName()、getSerialNumber()、getVersion()产品图片库内images/目录下随附的传感器本体与接线图。从 SensirionI2cSen6x.h 的枚举可以看出这些接口对应的命令 IDSEN66_START_CONTINUOUS_MEASUREMENT_CMD_ID 0x21、SEN66_STOP_MEASUREMENT_CMD_ID 0x104、SEN66_READ_MEASURED_VALUES_AS_INTEGERS_CMD_ID 0x300SEN66_GET_PRODUCT_NAME_CMD_ID 0xd014、SEN66_GET_SERIAL_NUMBER_CMD_ID 0xd033、SEN66_GET_VERSION_CMD_ID 0xd100。使用这些接口的最小流程见 exampleUsage.inoWire.begin()后调用sensor.begin(Wire, SEN6X_I2C_ADDR_6B)先deviceReset()复位并延时 1200ms再读取序列号随后startContinuousMeasurement()进入测量模式主循环中每 1 秒调用一次readMeasuredValues()输出 PM1.0/PM2.5/PM4.0/PM10.0、湿度、温度、VOC、NOx 与 CO₂。四、v1.0.0补齐公共接口与 CO₂ 返回类型修正1.0.02024-11-25完成两件事1Add all public interfaces——公共接口对齐官方驱动。对照 SensirionI2cSen6x.h 的完整方法清单公共接口已覆盖测量类startContinuousMeasurement、stopMeasurement、getDataReady、readMeasuredValues、readMeasuredValuesAsIntegers、readNumberConcentrationValues、readNumberConcentrationValuesAsIntegers、readMeasuredRawValues维护类startFanCleaning、activateShtHeater、getShtHeaterMeasurements、deviceReset、readDeviceStatus、readAndClearDeviceStatus配置类set/getTemperatureOffsetParameters5 个温度补偿槽位、set/getVocAlgorithmTuningParameters、set/getNoxAlgorithmTuningParameters、setTemperatureAccelerationParameters、set/getVocAlgorithmState、performForcedCo2Recalibration、set/getCo2SensorAutomaticSelfCalibration、set/getAmbientPressure、set/getSensorAltitude身份类getProductName、getSerialNumber、getVersion静态缩放函数signalMassConcentrationPmX、signalNumberConcentrationPmX、signalTemperature、signalHumidity、signalVocIndex、signalNoxIndex、signalCo2、signalHcho。2CO₂ 返回类型 float → uint16。readMeasuredValues()的最后一个参数在头文件中即为uint16_t co2CO₂ 单位为 ppm 且本身是整数量纲改用uint16_t既贴合数据手册也避免浮点转换开销无效值用SEN6X_UINT_INVALID (0xFFFF)表示。signalCo2(uint16_t co2Raw)同样以uint16_t返回 ppm。五、v1.0.1颗粒物数量浓度的命名修正1.0.12024-12-01是一个纯命名层面的修复原质量浓度mass concentration的命名被纠正为数量浓度number concentration用于描述 PM0.5/PM1.0/PM2.5/PM4.0/PM10.0 的particles/cm³数量浓度读数。CHANGELOG 明确说明返回的值一直是正确的只是方法名容易误导。源码中对应方法为readNumberConcentrationValues(...)与readNumberConcentrationValuesAsIntegers(...)输出参数依次为numberConcentrationPm0p5、numberConcentrationPm1p0、numberConcentrationPm2p5、numberConcentrationPm4p0、numberConcentrationPm10p0均以 0.1 particles/cm³ 的缩放因子读取raw / 10.0见 SensirionI2cSen6x.cpp 中signalNumberConcentrationPm*系列实现。注意区分两类读数质量浓度µg/m³PM1.0/2.5/4.0/10.0与数量浓度particles/cm³PM0.5/1.0/2.5/4.0/10.0二者缩放因子均为 10但物理含义和粒径档位不同。六、v1.1.0序列号与产品名改为字符串类型1.1.02025-02-12把getProductName与getSerialNumber的输出缓冲类型从uint8[32]改为int8[32]。这在 C/C 中意味着缓冲区被显式视为可打印的 ASCII 字符串int8_t配合(const char*)强转输出而不是裸字节数组int16_t getProductName(int8_t productName[], uint16_t productNameSize); int16_t getSerialNumber(int8_t serialNumber[], uint16_t serialNumberSize);Tasmota 驱动 xsns_119_sen6x.ino 中即采用int8_t serial_number[32]/int8_t product_name[32]接收并用GetCommandCode把产品名匹配到SEN62|SEN63C||SEN65|SEN66||SEN68|SEN69C型号表从而确定该型号具备的测量特性features[] { 0, 2, 0, 1, 3, 0, 6, 7 }分别编码 HCHO/CO₂/VOC 能力位。实现层面getProductName发送命令0xd014接收帧 48 字节、getSerialNumber发送命令0xd033接收帧 48 字节最多读取 32 个字符的以\0结尾字符串。七、v1.2.0固件版本读取与 SHT 加热器时序重构重点1.2.02025-03-13是本库最值得关注的一个版本包含两项新增与一项时序变更且都涉及传感器固件版本≥ 4.0条件分支。7.1 新增getVersion读取固件版本新增的getVersion(uint8_t firmwareMajor, uint8_t firmwareMinor)返回固件主/次版本号底层命令为SEN66_GET_VERSION_CMD_ID 0xd100接收帧长度 3 字节SensirionI2cSen6x.cpp 第 907 行附近。它解决了一个实际问题后续 SHT 加热功能依赖固件版本用户需要先查询版本号再决定调用哪套时序。Tasmota 驱动在Sen6xInit()初始化序列中正是先deviceReset()、再getVersion(major, minor)、随后读序列号与产品名并把major.minor记录到SEN6XDATA结构中Sen6x命令的状态输出也包含Version:%d.%d字段。7.2 新增getShtHeaterMeasurements读取加热后的温湿度SEN66 内置 SHT 加热器用于在高湿度环境下逆转传感器蠕变creep。1.2.0 新增getShtHeaterMeasurements(int16_t humidity, int16_t temperature)底层命令为SEN66_GET_SHT_HEATER_MEASUREMENTS_CMD_ID 0x6790接收帧 6 字节。该命令仅固件版本 ≥ 4.0 可用且必须紧跟在activateShtHeater()之后调用若加热尚未完成返回的湿度/温度值为0x7FFFSEN6X_INT_INVALID。注释表明该命令可以每 0.05s 轮询一次用于精确判断加热结束时刻。返回值缩放规则湿度RH [%] raw / 100温度T [°C] raw / 200。7.3 SHT 加热激活时长缩短为 20ms变更前activateShtHeater()激活 200mW 加热 1 秒1.2.0 起激活时长缩减到 20ms底层命令为SEN66_ACTIVATE_SHT_HEATER_CMD_ID 0x6765。带来的时序要求是固件 ≥ 4.0用getShtHeaterMeasurements主动轮询确认加热是否结束固件 4.0发出加热命令后至少等待1300ms才能发送下一条命令无论固件版本加热命令后开始测量前应等待约 20 秒使加热导致的温度扰动完全消退以获取一致的温湿度读数Tasmota 驱动中对应SEN6X_STATE_SHT_HEATER_WAIT 21秒状态机。八、CHANGELOG 变更在 Tasmota 固件中的落地映射库的每次能力增长都在 xsns_119_sen6x.ino 的Sen6x*命令中得到对应命令前缀由kSen6xCommands定义库接口对应 Tasmota 命令说明getVersion/getProductName/getSerialNumberSen6x状态信息名称、序列号、固件版本、设备状态startFanCleaningSen6xClean风扇全速 10 秒自动停止之后需等待 10sSEN6X_STATE_CLEAN_FAN_WAIT 11activateShtHeaterSen6xHeat激活 SHT 加热器随后进入 21 秒等待状态setTemperatureOffsetParametersSen6xTempOff offset,slope,time_constant,slot0..4温度补偿5 个槽位setTemperatureAccelerationParametersSen6xTempAcc k,p,t1,t2RH/T 引擎滤波参数getVocAlgorithmStateSen6xVocState读取 VOC 算法状态12 字节用于断电后恢复学习进度set/getVocAlgorithmTuningParametersSen6xVocTune默认值100,12,12,180,50,230set/getNoxAlgorithmTuningParametersSen6xNoxTune默认值1,12,720,230学习增益恒为 12h、std 恒为 50对 NOx 无实际影响setSensorAltitudeSen6xAlt 0..3000CO₂ 气压补偿米setAmbientPressureSen6xPres 700..1200CO₂ 气压补偿hPa会覆盖基于海拔的补偿setCo2SensorAutomaticSelfCalibration/performForcedCo2RecalibrationSen6xCal 0|1|351..10000自动自校准开关payload 350 时执行强制重校准FRC其中 FRC 强制重校准的调用链充分体现了 CHANGELOG 中接口完备性的价值Tasmota 收到Sen6xCal 444后会stopMeasurement()、等待约 1400ms、调用performForcedCo2Recalibration(reference, correction)并以FRC correction - 0x8000的规则把修正值返回给用户失败返回 0xFFFF。九、升级到 1.2.0 的实践注意事项结合 CHANGELOG 与源码开发者在使用或升级到 1.2.0 时应重点关注固件版本先行getVersion应在初始化时尽早调用用于分支判断 SHT 加热时序Tasmota 驱动即采用该模式。SHT 加热时序升级后不要再依赖加热 1 秒的旧行为固件 ≥ 4.0 时用getShtHeaterMeasurements每 50ms 轮询确认结束固件 4.0 时硬性等待 1300ms且两种情况下开始测量前都建议等待 20 秒。字符串类型序列号/产品名缓冲区使用int8_t[32]读取后可直接以(const char*)打印或做型号匹配。无效值判断读取整数值接口在无数据时返回0xFFFFuint16或0x7FFFint16例如 CO₂ 在上电后前 5~6 秒、NOx 在上电后前 10~11 秒、HCHO 在首次测量后前 60 秒都可能处于无效状态驱动中的Sen6xUInt16Div10等函数会将无效值转换为NAN而非存储脏数据见 xsns_119_sen6x.ino 的Sen6xUpdate读取失败时不覆盖旧值。命令可用状态多数配置命令VOC/NOx 调参、ALT、Cal 等仅在 idle 模式生效因此 Tasmota 统一用Sen6xStopStartMeasurement()停止并 1 秒后重启测量包裹配置操作仅setAmbientPressure、setTemperatureOffsetParameters可在测量状态下调用。十、小结从 0.1.0 到 1.2.0Sensirion SEN6X 库的演进脉络清晰先打通测量 身份读取的最小闭环再补齐全部公共接口并修正 CO₂ 返回类型与数量浓度命名随后把序列号/产品名规范为字符串最终在 1.2.0 引入固件版本查询与 SHT 加热测量机制使高湿度场景的维护操作变得可编程、可精确判断。这些能力全部落地于 Tasmota 的Sen6x*命令集开发者可直接在控制台或 exampleUsage.ino 基础上组合出初始化探测 → 连续测量 → 周期维护风扇清理 / SHT 加热→ 状态诊断的完整环境监测方案。【免费下载链接】TasmotaAlternative firmware for ESP8266 and ESP32 based devices with easy configuration using webUI, OTA updates, automation using timers or rules, expandability and entirely local control over MQTT, HTTP, Serial or KNX. Full documentation at项目地址: https://gitcode.com/GitHub_Trending/ta/Tasmota创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表