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

Arduino Uno+TCA9548+BME280传感器无法识别求助(I2C扫描可检测到)

问题:TCA9548 I2C多路复用器搭配BME280传感器初始化失败(总线0检测不到)

使用Arduino Uno搭配TCA9548 I2C多路复用器连接两个BME280传感器,运行I2C扫描程序时能检测到总线0和总线1上的传感器地址0x76,但运行自定义代码时提示无法找到总线0上的有效BME280传感器,最终需要连接4个该类传感器,求解决。

原代码

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define SEALEVELPRESSURE_HPA (1022)

Adafruit_BME280 bme1; // I2C
Adafruit_BME280 bme2; // I2C

// Select I2C BUS
void TCA9548A(uint8_t bus){
  Wire.beginTransmission(0x70);  // TCA9548A address
  Wire.write(1 << bus);          // send byte to select bus
  Wire.endTransmission();
}

void printValues(Adafruit_BME280 bme, int bus) {
  TCA9548A (bus);
  Serial.print("Sensor number on bus");
  Serial.println(bus);
  Serial.print("Temperature = ");
  Serial.print(bme.readTemperature());
  Serial.println(" *C");
  
  Serial.print("Pressure = ");
  Serial.print(bme.readPressure() / 100.0F);
  Serial.println(" hPa");

  Serial.print("Approx. Altitude = ");
  Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  Serial.println(" m");

  Serial.print("Humidity = ");
  Serial.print(bme.readHumidity());
  Serial.println(" %");

  Serial.println();
}

void setup() {
  Serial.begin(115200);
  
  // Start I2C communication with the Multiplexer
  Wire.begin();

  // Init sensor on bus number 0
  TCA9548A(0);
  if (!bme1.begin(0x76)) {
    Serial.println("Could not find a valid BME280 sensor on bus 0, check wiring!");
    while (1);
  }
  Serial.println();
  
  // Init sensor on bus number 1
  TCA9548A(1);
  if (!bme2.begin(0x76)) {
    Serial.println("Could not find a valid BME280 sensor on bus 1, check wiring!");
    while (1);
  }

}

void loop() { 
  printValues(bme1, 0);
  printValues(bme2, 1);
  delay(5000);
}

串口输出

12:02:06.477 -> Could not find a valid BME280 sensor on bus 0, check wiring!

I2C扫描结果

12:37:34.158 -> TCAScanner ready!
12:37:34.158 -> TCA Port #0
12:37:34.196 -> Found I2C 0x76
12:37:34.196 -> TCA Port #1
12:37:34.196 -> Found I2C 0x76
12:37:34.196 -> TCA Port #2
12:37:34.196 -> TCA Port #3
12:37:34.227 -> TCA Port #4
12:37:34.265 -> TCA Port #5
12:37:34.265 -> TCA Port #6
12:37:34.265 -> TCA Port #7

解决方案

问题分析

  1. TCA9548多路复用器切换总线后需要短暂延时,确保内部切换完成,否则传感器初始化时可能无法正确通信
  2. printValues函数采用值传递方式传递Adafruit_BME280对象,会复制对象导致传感器的I2C上下文丢失,读取数据时出错

修复步骤

  1. 给TCA总线切换添加延时:修改TCA9548A函数,在总线切换后添加10ms延时,确保多路复用器稳定切换
  2. 改用引用传递BME对象:修改printValues函数的参数为引用类型,避免复制对象丢失上下文
  3. 初始化时明确指定Wire对象(可选,增强兼容性):调用begin时传入&Wire参数,明确指定I2C总线

修改后的完整代码

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define SEALEVELPRESSURE_HPA (1022)

Adafruit_BME280 bme1; // I2C
Adafruit_BME280 bme2; // I2C

// Select I2C BUS, add delay after switching
void TCA9548A(uint8_t bus){
  Wire.beginTransmission(0x70);  // TCA9548A address
  Wire.write(1 << bus);          // send byte to select bus
  Wire.endTransmission();
  delay(10); // Wait for multiplexer to switch bus
}

// Use reference to avoid copying BME object
void printValues(Adafruit_BME280 &bme, int bus) {
  TCA9548A(bus);
  Serial.print("Sensor number on bus");
  Serial.println(bus);
  Serial.print("Temperature = ");
  Serial.print(bme.readTemperature());
  Serial.println(" *C");
  
  Serial.print("Pressure = ");
  Serial.print(bme.readPressure() / 100.0F);
  Serial.println(" hPa");

  Serial.print("Approx. Altitude = ");
  Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  Serial.println(" m");

  Serial.print("Humidity = ");
  Serial.print(bme.readHumidity());
  Serial.println(" %");

  Serial.println();
}

void setup() {
  Serial.begin(115200);
  
  Wire.begin();

  // Init sensor on bus 0, specify Wire object explicitly
  TCA9548A(0);
  if (!bme1.begin(0x76, &Wire)) {
    Serial.println("Could not find a valid BME280 sensor on bus 0, check wiring!");
    while (1);
  }
  Serial.println("Bus 0 sensor initialized successfully");
  
  // Init sensor on bus 1
  TCA9548A(1);
  if (!bme2.begin(0x76, &Wire)) {
    Serial.println("Could not find a valid BME280 sensor on bus 1, check wiring!");
    while (1);
  }
  Serial.println("Bus 1 sensor initialized successfully");

}

void loop() { 
  printValues(bme1, 0);
  printValues(bme2, 1);
  delay(5000);
}

扩展到4个传感器的方法

只需重复以下步骤即可添加更多传感器:

  1. 新增Adafruit_BME280 bme3;、Adafruit_BME280 bme4;对象
  2. 在setup中切换到对应总线(2、3),调用begin初始化
  3. 在loop中调用printValues(bme3, 2);、printValues(bme4, 3);读取数据

内容的提问来源于stack exchange,提问作者Ruben de Jesús Moraga Ramírez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:32:08