使用SGP40传感器时Attiny841遇到的VOC指数读取问题
Attiny841 + SGP40 VOC传感器无法获取有效数据,返回-100错误码
项目背景
我制作了一块定制PCB,包含Attiny841微控制器、SGP40传感器和若干LED,设计逻辑是LED根据传感器通过I2C传输的VOC指数点亮。已完成PCB组装和微控制器与LED的测试,之前因学业和工作暂停开发。
相关资料
- SGP40数据手册参考Sensirion官方文档
- 定制板原理图:

运行代码
#include "SparkFun_SGP40_Arduino_Library.h" #include <Wire.h> SGP40 mySensor; void setup() { pinMode(1, OUTPUT); pinMode(2, OUTPUT); pinMode(3, OUTPUT); Wire.begin(); if (mySensor.begin() == false) { while (1) { digitalWrite(3, HIGH); digitalWrite(2, HIGH); } } } void loop() { int32_t vocIndex = mySensor.getVOCindex(); if (vocIndex > 0 && vocIndex <= 165) { digitalWrite(1, LOW); digitalWrite(2, LOW); digitalWrite(3, HIGH); } else if (vocIndex > 165 && vocIndex <= 330) { digitalWrite(1, LOW); digitalWrite(3, LOW); digitalWrite(2, HIGH); } else if (vocIndex > 330) { digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(1, HIGH); } else if (vocIndex == -100){ digitalWrite(1, HIGH); digitalWrite(2, LOW); digitalWrite(3, HIGH); } else { digitalWrite(1, HIGH); digitalWrite(2, HIGH); digitalWrite(3, HIGH); } delay(1000); }
当前问题
运行上述代码后,微控制器获取的vocIndex值固定为-100(疑似SGP40错误码),对应LED1和LED3点亮,无法正常获取有效VOC指数。
已尝试操作
- 通过老化插座将Attiny841更换至不同电路板,结果一致
- 修改代码但未解决问题
预期目标
设备可正常获取VOC指数,并根据指数区间点亮对应LED。
排查与解决建议
I2C总线硬件检查
- 确认Attiny841的SDA/SCL引脚与SGP40的对应连接,检查PCB走线是否存在虚焊、短路;务必确认I2C总线上已焊接4.7kΩ左右的上拉电阻(连接SDA/SCL至VCC),SGP40依赖上拉电阻实现正常I2C通信
- 用万用表测量SDA/SCL引脚的静态电压,正常情况下应接近VCC电压,若电压过低则说明上拉电阻缺失或连接异常
传感器供电验证
- 测量SGP40的VCC引脚电压,确保在3.0V~5.5V的额定范围内;检查电源纹波,若纹波过大可尝试外接独立的线性电源测试
- 确认SGP40的GND与Attiny841的GND可靠共地,避免出现地电位差导致通信失败
代码调试与验证
- 添加I2C总线扫描功能,确认SGP40设备地址(默认0x59)可被检测:
注意需为Attiny841配置正确的串口引脚(参考其数据手册)void setup() { pinMode(1, OUTPUT); pinMode(2, OUTPUT); pinMode(3, OUTPUT); Wire.begin(); Serial.begin(9600); while (!Serial); // 等待串口连接 scanI2C(); if (mySensor.begin() == false) { while (1) { digitalWrite(3, HIGH); digitalWrite(2, HIGH); } } } void scanI2C() { byte error, address; int nDevices = 0; Serial.println("Scanning I2C bus..."); for(address = 1; address < 127; address++) { Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at 0x"); if (address < 16) Serial.print("0"); Serial.println(address, HEX); nDevices++; } } if (nDevices == 0) Serial.println("No I2C devices detected"); } - 查看SparkFun_SGP40库的源码,确认
-100错误码对应的具体故障(通常为传感器未完成初始化或通信超时) - 尝试先调用
mySensor.measureRaw()获取原始传感器数据,若该函数也返回错误,则说明通信链路存在根本问题
- 添加I2C总线扫描功能,确认SGP40设备地址(默认0x59)可被检测:
传感器初始化确认
- 在
setup()中添加串口打印,验证mySensor.begin()的返回值:
若打印"初始化成功"但仍返回错误码,说明传感器可能存在硬件故障,可尝试更换SGP40传感器测试if (mySensor.begin() == false) { Serial.println("Sensor initialization failed!"); while (1) { digitalWrite(3, HIGH); digitalWrite(2, HIGH); } } else { Serial.println("Sensor initialized successfully"); }
- 在
内容的提问来源于stack exchange,提问作者Noodle
相关产品推荐
相关产品推荐

