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
解决方案
问题分析
- TCA9548多路复用器切换总线后需要短暂延时,确保内部切换完成,否则传感器初始化时可能无法正确通信
printValues函数采用值传递方式传递Adafruit_BME280对象,会复制对象导致传感器的I2C上下文丢失,读取数据时出错
修复步骤
- 给TCA总线切换添加延时:修改
TCA9548A函数,在总线切换后添加10ms延时,确保多路复用器稳定切换 - 改用引用传递BME对象:修改
printValues函数的参数为引用类型,避免复制对象丢失上下文 - 初始化时明确指定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个传感器的方法
只需重复以下步骤即可添加更多传感器:
- 新增
Adafruit_BME280 bme3;、Adafruit_BME280 bme4;对象 - 在
setup中切换到对应总线(2、3),调用begin初始化 - 在
loop中调用printValues(bme3, 2);、printValues(bme4, 3);读取数据
内容的提问来源于stack exchange,提问作者Ruben de Jesús Moraga Ramírez
相关产品推荐
相关产品推荐

