You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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。


排查与解决建议

  1. I2C总线硬件检查

    • 确认Attiny841的SDA/SCL引脚与SGP40的对应连接,检查PCB走线是否存在虚焊、短路;务必确认I2C总线上已焊接4.7kΩ左右的上拉电阻(连接SDA/SCL至VCC),SGP40依赖上拉电阻实现正常I2C通信
    • 用万用表测量SDA/SCL引脚的静态电压,正常情况下应接近VCC电压,若电压过低则说明上拉电阻缺失或连接异常
  2. 传感器供电验证

    • 测量SGP40的VCC引脚电压,确保在3.0V~5.5V的额定范围内;检查电源纹波,若纹波过大可尝试外接独立的线性电源测试
    • 确认SGP40的GND与Attiny841的GND可靠共地,避免出现地电位差导致通信失败
  3. 代码调试与验证

    • 添加I2C总线扫描功能,确认SGP40设备地址(默认0x59)可被检测:
      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");
      }
      
      注意需为Attiny841配置正确的串口引脚(参考其数据手册)
    • 查看SparkFun_SGP40库的源码,确认-100错误码对应的具体故障(通常为传感器未完成初始化或通信超时)
    • 尝试先调用mySensor.measureRaw()获取原始传感器数据,若该函数也返回错误,则说明通信链路存在根本问题
  4. 传感器初始化确认

    • 在setup()中添加串口打印,验证mySensor.begin()的返回值:
      if (mySensor.begin() == false) {
        Serial.println("Sensor initialization failed!");
        while (1) {
          digitalWrite(3, HIGH);
          digitalWrite(2, HIGH);
        }
      } else {
        Serial.println("Sensor initialized successfully");
      }
      
      若打印"初始化成功"但仍返回错误码,说明传感器可能存在硬件故障,可尝试更换SGP40传感器测试

内容的提问来源于stack exchange,提问作者Noodle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 10:57:02