先确认:你手上这颗是 SCD40 还是 SCD41
SCD40 和 SCD41 引脚完全相同、I2C 地址都是 0x62、外观也几乎一样, 光看板子分不出来。已经有客户反馈买到的模块实际是 SCD40。
如果你的项目对量程和精度有要求,请先用下面的自测程序确认芯片型号再投入使用。 确认结果和商品描述不符,可以直接联系淘宝客服处理。
方法 1(最快):直接看芯片壳上的激光刻字
新批号的传感器,型号直接激光刻在顶部金属壳上,旁边还有一个二维码(批次信息)。 拿到手先翻过来看一眼,比烧程序去试快得多。
SCD41 或 SCD40 字样,右下角是二维码。图为示意,实物刻字位置以手上模块为准。老批号可能没有刻字,或者刻字被模块的排针、外壳挡住看不清。 这种情况用下面两种软件方法识别,不用拆板子。
方法 2 / 3:用程序读出来
看不到刻字时,用 I2C 命令识别。建议两个都跑一遍:
| 方法 | 命令 | 判据 | 可靠性 |
|---|---|---|---|
| 2. 单次测量命令 最关键的软件判据 |
0x219D measure_single_shot |
命令被接受并能读出有效数据 → SCD41 命令无应答或读不出数据 → SCD40 |
高。SCD40 本身不支持这条命令 |
| 3. 变体寄存器 | 0x202F get_sensor_variant |
返回值高 4 位:0 → SCD40,1 → SCD41 | 仅较新固件支持,老固件读不到(待确认) |
下面的代码包里有一份 SCD4x_识别是40还是41.ino,
烧进 Arduino 或 ESP32、打开串口监视器(115200)就会自动跑完上面两个方法并直接给出结论。
见 第 6 节代码下载。
SCD40 与 SCD41 到底差在哪
两颗都是 Sensirion SCD4x 系列的光声式 NDIR CO2 传感器,同一个封装、同一套基础命令。真正的差别集中在量程规格和单次测量能力两点上。
| 项目 | SCD40 | SCD41 |
|---|---|---|
| CO2 规格量程 | 400 – 2000 ppm | 400 – 5000 ppm |
| 单次测量 0x219D | 不支持 | 支持 |
| 低功耗间歇测量 | 受限 | 可用单次测量做低功耗 |
| I2C 地址 | 0x62 | 0x62 |
| 引脚 / 封装 | 完全相同,可直接互换 | |
| 周期测量周期 | 5 秒一组 | |
| 基础命令集 | 相同(启动 / 读数 / 停止 / 序列号 / 校准) | |
室内空气质量、新风联动、CO2 报警这类应用,日常浓度在 400–2000 ppm 之间,
SCD40 完全够用。
密闭空间、车内、发酵、温室、人多的会议室可能冲到 2000 ppm 以上,
或者需要低功耗电池供电,那就要 SCD41。
上表的量程按 Sensirion 官方规格整理。具体精度指标(如 ±(40 ppm + 5%)) 随批次和固件版本可能不同,需要写进方案文档时请查对应型号的最新数据手册, 不要直接引用本页数字。本页没有列出的参数一律待确认,不做推测。
引脚定义
蓝板正面丝印从左到右依次是:
- GND地。所有主控接线都必须共地,这是最常见的疏漏。
- VCC电源正。芯片供电范围 2.4 – 5.5 V,3.3V 和 5V 都行;接和主控逻辑相同的那一路(UNO 接 5V,ESP32/STM32/树莓派接 3.3V)。详见第 4 节。
- SCLI2C 时钟线。
- SDAI2C 数据线。
- NC空脚,不接。
板子背面丝印顺序是 SDA / SCL / VCC / GND,和正面相反——那是从背面看的顺序。
接线以正面丝印为准,或者直接对着焊盘旁边的字接。
这块蓝板上带了:
- 10K 上拉电阻 × 2 —— 接在 SDA 和 SCL 上,上拉到 VCC。 所以不用你另外加上拉电阻,直接四根线接上去就行。
- 100nF 去耦电容 × 1 —— 给传感器供电滤波用。
板上没有 LDO 稳压和电平转换芯片,但并不需要:SCD4x 本身 2.4 – 5.5 V 都能供电, 而上拉电阻是接到 VCC 的——这正是「VCC 要接和主控逻辑相同那一路」的原因,详见第 4 节。
供电与电平:最容易踩的两个坑
SCD4x 是光声式传感器,每次测量要驱动光源,瞬间峰值电流可达约 205 mA。 这个数字比大多数 I2C 传感器高一个数量级,是很多「读数乱跳」「模块一会儿认得到一会儿认不到」的真正原因。
这也意味着:不是随便找个脚给电就行,要看那个脚能出多少电流。
按 Sensirion 数据手册,SCD4x 的供电范围是 2.4 – 5.5 V, 3.3V 和 5V 都在范围内,接哪个都能工作。
SCL / SDA 是开漏输出,I2C 的电平由上拉电阻接到哪一路电源决定。 所以有一条很省事的原则:
模块 VCC 接到和主控逻辑相同的那一路电源,I2C 电平自然就一致,不需要电平转换。
| 主控 | VCC 接 | 为什么 |
|---|---|---|
| Arduino UNO / Nano 5V 逻辑 |
5V | 电平和 UNO 一致,直接接 A4 / A5 即可; 而且 5V 脚电流够,见下方说明 |
| ESP32 / STM32 / 树莓派 3.3V 逻辑 |
3.3V | 同理,电平一致,直接接 |
ESP32 板上的输出本来就是 3.3V,没有 5V 可选,直接接 3V3。
Arduino UNO 上 5V 和 3.3V 两个输出脚都有,但给 SCD4x 供电要用 5V 那个:
| UNO 的脚 | 电流能力 | 结论 |
|---|---|---|
| 3.3V | 约 50 mA | 不要用。205 mA 峰值一来就掉压,表现为扫不到地址、读数乱跳 |
| 5V | USB 供电时整板约 500 mA | 用这个。电流够,电平也和 UNO 一致 |
3.3V 系统(ESP32 / STM32 / 树莓派)同样要注意 3.3V 那一路能不能扛住 205 mA 峰值。 如果同时还带屏幕、WiFi、电机,建议给 3.3V 加大电容,或者用外部电源单独供并共地。
四种主控接线图
下面四张图的连线一一对应、不交叉,照着接即可。所有图都以蓝板正面丝印为准。
代码下载
Sensirion 官方给四个平台都提供了现成的驱动和示例,由厂家维护、跟着固件更新, 比任何第三方教程都可靠,建议优先用这些。下面先列官方仓库,再放本站整理的精简版。
一、官方驱动与示例(推荐)
| 平台 | 官方仓库 / 包 | 怎么用 |
|---|---|---|
| Arduino / ESP32 | Sensirion/arduino-i2c-scd4x | IDE 库管理器搜 Sensirion I2C SCD4x 安装,示例在文件 → 示例 → Sensirion I2C SCD4x → exampleUsage |
| 树莓派(C) | Sensirion/raspberry-pi-i2c-scd4x | 下载解压后:cd example-usage && make && ./scd4x_i2c_example_usage |
| 树莓派(Python) | Sensirion/python-i2c-scd4xpip install sensirion-i2c-scd4x |
默认走 /dev/i2c-1,仓库 examples/ 里有完整示例 |
| STM32 / 其它单片机 | Sensirion/embedded-i2c-scd4x | 平台无关的 C 驱动,只要实现 sensirion_i2c_hal 里几个函数(用 HAL_I2C_Master_Transmit / Receive 对接即可) |
当前官方库的头文件是 SensirionI2cScd4x.h(小写的 c),
类名是 SensirionI2cScd4x。
网上不少老教程写的是 SensirionI2CScd4x.h(大写 C)和旧的三段式序列号接口,
那是旧版本的写法,照抄会编译不过。以库自带示例为准。
二、本站整理的打包下载
Arduino 那一份是官方示例原样收录(保留 Sensirion BSD-3 版权声明), 只在开头加了中文接线和供电注释。 其余几份是本站写的精简版:不依赖第三方库、直接发 I2C 命令, 方便你一步步看哪里不通——这几份尚未实机验证,请以实测为准, 正式项目建议用上面的官方驱动。
使用要点
- 周期测量每 5 秒出一组数据。启动后第一组数据要等约 5 秒,不是立刻就有。
- 发配置类命令前必须先停:发
stop_periodic_measurement(0x3F86)并等 500 ms,否则命令会被忽略。这是新手最常见的错误。 - 读数为 0 表示该帧无效,程序里应当丢弃,不要显示成"CO2 浓度为 0"。
- 刚上电前几分钟读数会漂,属于正常现象,需要预热。
- 每个数据字后面跟 1 字节 CRC(多项式
0x31,初始值0xFF)。CRC 校验不过通常是杜邦线松动、线太长或缺上拉电阻。 - I2C 速度用 100 kHz,不要拉到 400 kHz。
| 命令 | 值 | 说明 |
|---|---|---|
| start_periodic_measurement | 0x21B1 | 启动周期测量 |
| read_measurement | 0xEC05 | 读 CO2 / 温度 / 湿度 |
| stop_periodic_measurement | 0x3F86 | 停止,之后等 500 ms |
| get_serial_number | 0x3682 | 读序列号,用来确认通信正常 |
| get_data_ready_status | 0xE4B8 | 低 11 位非 0 表示数据就绪 |
| measure_single_shot | 0x219D | 单次测量,仅 SCD41 支持 |
换算公式(来自数据手册):
| 物理量 | 换算 |
|---|---|
| CO2 | 原始值直接就是 ppm |
| 温度 (°C) | -45 + 175 × raw / 65535 |
| 湿度 (%RH) | 100 × raw / 65535 |
排查流程
- 先跑 I2C 扫描,确认总线上能看到
0x62。树莓派用i2cdetect -y 1,Arduino / ESP32 用任意 I2C Scanner。 - 扫不到 0x62:检查 SDA / SCL 有没有接反、VCC 是否接对(UNO 接 5V,ESP32 / STM32 / 树莓派接 3.3V)、有没有共地。UNO 用户重点查供电是否够(见第 4 节)。
- 扫得到但读数失败:多半是 CRC 校验不过。板上已有 10K 上拉,所以重点查杜邦线是否松动、线是否过长、有没有干扰源。
- 能读但数值是 0:那一帧无效,正常现象,程序里丢弃即可。
- 数值一直不变或明显不合理:确认是否忘了先发停止命令就直接发配置命令;再确认预热时间是否足够。
- 怀疑型号不符:跑第 1 节的识别程序确认是 SCD40 还是 SCD41。
客服话术
客户问"接上去没反应 / 扫不到地址":
您好,SCD4x 这颗芯片测量瞬间的峰值电流大概 205 mA,比一般传感器高很多。如果您用的是 Arduino UNO,请注意 UNO 上 5V 和 3.3V 两个脚都有:3.3V 那个脚只能给 50 mA 左右,是带不动的,会出现扫不到地址或者读数乱跳;5V 脚电流够。具体接哪个要看模块带不带稳压电路,资料页第 4 节有对照表。ESP32、STM32、树莓派本身是 3.3V 系统,直接接 3.3V 就行。四种主控的接线图和现成代码都在这里:
mingwei-tech-site.pages.dev/pages/scd41-co2-sensor
客户问"这个是 SCD40 还是 SCD41":
您好,SCD40 和 SCD41 引脚和地址完全一样,肉眼分不出来。资料页第 1 节有一个现成的自测程序,烧进 Arduino 或 ESP32 打开串口就会直接告诉您是哪一颗。如果确认结果和商品描述不符,麻烦把串口截图发给我,我这边给您处理。
官方资料
- Sensirion SCD4x 产品页与数据手册:sensirion.com/products/catalog/SCD41
- Arduino 官方库:库管理器搜索
Sensirion I2C SCD4x - 树莓派 smbus2:pypi.org/project/smbus2
引脚顺序、尺寸和板载元件(2 × 10K 上拉、100nF 去耦)来自实物与卖家确认; 供电范围(2.4 – 5.5 V)、命令字、CRC 和换算公式来自 Sensirion 官方数据手册; Arduino 例程为官方原版,其余精简版尚未实机验证。