OK, now to code up the example with a TCA9548A multiplexer and four BME280s, all with I2C addresses of 0x77.
Here's the code:
// SPDX-FileCopyrightText: 2022 Carter Nelson for Adafruit Industries
//
// SPDX-License-Identifier: MIT
#include <Adafruit_BME280.h>
#define TCAADDR 0x70
// For each device, create a separate instance.
Adafruit_BME280 bme1; // BME280 #1
Adafruit_BME280 bme2; // BME280 #2
Adafruit_BME280 bme3; // BME280 #3
Adafruit_BME280 bme4; // BME280 #4
// Helper function for changing TCA output channel
void tcaselect(uint8_t channel) {
if (channel > 7) return;
Wire.beginTransmission(TCAADDR);
Wire.write(1 << channel);
Wire.endTransmission();
}
void setup() {
Serial.begin(9600);
while(!Serial);
Serial.println(F("Four BME280 Example"));
// NOTE!!! VERY IMPORTANT!!!
// Must call this once manually before first call to tcaselect()
Wire.begin();
// Before using any BME280, call tcaselect to select its output channel
tcaselect(0); // TCA channel for bme1
bme1.begin(); // use the default address of 0x77
tcaselect(1); // TCA channel for bme2
bme2.begin(); // use the default address of 0x77
tcaselect(2); // TCA channel for bme3
bme3.begin(); // use the default address of 0x77
tcaselect(3); // TCA channel for bme4
bme4.begin(); // use the default address of 0x77
}
void loop() {
float pressure1, pressure2, pressure3, pressure4;
// Read each device separately
tcaselect(0);
pressure1 = bme1.readPressure();
tcaselect(1);
pressure2 = bme2.readPressure();
tcaselect(2);
pressure3 = bme3.readPressure();
tcaselect(3);
pressure4 = bme4.readPressure();
Serial.println("------------------------------------");
Serial.print("BME280 #1 Pressure = "); Serial.println(pressure1);
Serial.print("BME280 #2 Pressure = "); Serial.println(pressure2);
Serial.print("BME280 #3 Pressure = "); Serial.println(pressure3);
Serial.print("BME280 #4 Pressure = "); Serial.println(pressure4);
delay(1000);
}
With that sketch running on the Arduino board, the output in the Serial Monitor will look like this:
Hopefully by comparing the 4xBME280 code to the previous 3xBME280 code example, the basic code pattern can be seen. It's essentially just a copy-paste of the same code to add one more instance:
Adafruit_BME280 bme4; // BME280 #4
And then call tcaselect() same as done for the other BME280s:
tcaselect(3); // TCA channel for bme4 bme4.begin(); // use the default address of 0x77
Page last edited January 22, 2025
Text editor powered by tinymce.