Руководство по I2C мультиплексору TCA9548A: ESP32, ESP8266, Arduino

В этом руководстве вы узнаете, как расширить порты шины I2C (ESP32, ESP8266, Arduino) с помощью I2C мультиплексора TCA9548A 1-к-8. Это оборудование полезно, если вы хотите управлять несколькими устройствами I2C с одинаковым I2C адресом. Например, несколькими OLED дисплеями или несколькими датчиками, такими как BME280.

Руководство по I2C мультиплексору TCA9548A ESP32 ESP8266 Arduino

Это руководство совместимо с платами ESP32, ESP8266 и Arduino. Программирование плат осуществляется с помощью Arduino IDE.

Знакомство с I2C мультиплексором TCA9548A 1-к-8

Модуль I2C мультиплексора TCA9548A

Протокол связи I2C позволяет обмениваться данными с несколькими устройствами I2C на одной шине I2C, при условии, что все устройства имеют уникальный I2C адрес. Однако это не будет работать, если вы хотите подключить несколько устройств I2C с одинаковым адресом.

I2C мультиплексор TCA9548A позволяет обмениваться данными с 8 устройствами I2C на одной шине I2C. Мультиплексор общается с микроконтроллером по протоколу I2C. Затем вы можете выбрать, к какой шине I2C на мультиплексоре обратиться.

Чтобы обратиться к определённому порту, вам нужно отправить один байт мультиплексору с номером нужного выходного порта.

Принцип работы I2C мультиплексора TCA9548A

Характеристики мультиплексора TCA9548A

Вот краткое описание основных характеристик:

  • 1 к 8 двунаправленных переключателей трансляции

  • Вход сброса с активным низким уровнем

  • Три адресных вывода — до 8 устройств TCA9548A на одной шине I2C

  • Выбор канала через шину I2C

  • Диапазон напряжения питания: 1,65 В — 5,5 В

  • Выводы с допустимым напряжением 5 В

Более подробное описание смотрите в даташите.

I2C адрес мультиплексора TCA9548A

Мультиплексор TCA9548A общается с микроконтроллером по протоколу связи I2C. Для этого ему нужен I2C адрес. Адрес мультиплексора настраивается. Вы можете выбрать значение от 0x70 до 0x77, регулируя значения выводов A0, A1 и A2, как показано в таблице ниже.

A0

A1

A2

I2C адрес

LOW

LOW

LOW

0x70

HIGH

LOW

LOW

0x71

LOW

HIGH

LOW

0x72

HIGH

HIGH

LOW

0x73

LOW

LOW

HIGH

0x74

HIGH

LOW

HIGH

0x75

LOW

HIGH

HIGH

0x76

HIGH

HIGH

HIGH

0x77

Таким образом, вы можете подключить до 8 мультиплексоров TCA9548A к одной шине I2C, что позволит подключить 64 устройства с одинаковым адресом, используя только одну шину I2C микроконтроллера.

Например, если вы подключите A0, A1 и A2 к GND, это установит адрес 0x70 для мультиплексора.

Распиновка TCA9548A

В следующей таблице описана распиновка TCA9548A.

Вывод

Описание

VIN

Питание мультиплексора

GND

Подключить к GND

SDA

Подключить к выводу SDA главного микроконтроллера

SCL

Подключить к выводу SCL главного микроконтроллера

RST

Вывод сброса с активным низким уровнем — можно использовать для сброса мультиплексора

A0

Выбор I2C адреса мультиплексора — подключить к GND или VCC

A1

Выбор I2C адреса мультиплексора — подключить к GND или VCC

A2

Выбор I2C адреса мультиплексора — подключить к GND или VCC

SD0

SDA для канала 0

SC0

SCL для канала 0

SD1

SDA для канала 1

SC1

SCL для канала 1

SD2

SDA для канала 2

SC2

SCL для канала 2

SD3

SDA для канала 3

SC3

SCL для канала 3

SD4

SDA для канала 4

SC4

SCL для канала 4

SD5

SDA для канала 5

SC5

SCL для канала 5

SD6

SDA для канала 6

SC6

SCL для канала 6

SD7

SDA для канала 7

SC7

SCL для канала 7

Выбор шины I2C на мультиплексоре TCA9548A

Как упоминалось ранее, для выбора конкретной шины I2C для чтения/записи данных вам нужно отправить один байт мультиплексору с номером нужного выходного порта (от 0 до 7).

Для этого вы можете использовать следующую пользовательскую функцию:

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

Затем вам нужно вызвать эту функцию и передать в качестве аргумента номер порта шины, которым вы хотите управлять, перед отправкой команд I2C. Например, чтобы управлять устройством, подключённым к шине номер 3, вы вызовете следующую строку перед другими командами I2C (обратите внимание, что нумерация начинается с 0):

TCA9548A(2);

Вы увидите, как это работает, на практических примерах в следующих разделах.

Управление несколькими OLED дисплеями — I2C мультиплексор TCA9548A

В этом разделе мы покажем вам, как управлять несколькими OLED дисплеями. В качестве примера мы будем управлять четырьмя OLED дисплеями, но вы можете подключить до 8 дисплеев.

Необходимые компоненты

Вот список компонентов, необходимых для этого примера:

Схема подключения нескольких OLED дисплеев с I2C мультиплексором

Подключите четыре OLED дисплея, как показано на следующей схеме. Мы используем шины номер 2, 3, 4 и 5. Вы можете выбрать любой другой номер порта.

Мы также подключаем A0, A1 и A2 к GND. Это устанавливает адрес 0x70 для мультиплексора.

Схема подключения нескольких OLED дисплеев с I2C мультиплексором TCA9548A

Вот стандартные выводы I2C в зависимости от используемого микроконтроллера:

Микроконтроллер

Выводы I2C

ESP32

GPIO 22 (SCL), GPIO 21 (SDA)

ESP8266

GPIO 5 (D1) (SCL), GPIO 4 (D2) (SDA)

Arduino Uno

A5 (SCL), A4 (SDA)

Код для нескольких OLED дисплеев с I2C мультиплексором

Управление дисплеями так же просто, как управление одним дисплеем. Вам просто нужно учитывать выбор правильной шины I2C перед отправкой команд записи на дисплей.

Чтобы узнать, как управлять I2C дисплеем, вы можете прочитать следующие статьи:

Установка библиотек

Мы будем использовать следующие библиотеки для управления OLED дисплеем. Убедитесь, что эти библиотеки установлены:

Вы можете установить библиотеки через Arduino Library Manager. Перейдите в Sketch > Include Library > Manage Libraries и найдите название библиотеки.

Если вы используете VS Code с расширением PlatformIO, скопируйте следующее в файл platformio.ini для подключения библиотек.

lib_deps = adafruit/Adafruit SSD1306@^2.4.6
     adafruit/Adafruit GFX Library@^1.10.10

После установки библиотек можно продолжить.

Скопируйте следующий код в Arduino IDE и загрузите его на вашу плату. Он заработает сразу.

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/tca9548a-i2c-multiplexer-esp32-esp8266-arduino/

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*********/

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

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

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

  // Start I2C communication with the Multiplexer
  Wire.begin();

  // Init OLED display on bus number 2
  TCA9548A(2);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  // Clear the buffer
  display.clearDisplay();

  // Init OLED display on bus number 3
  TCA9548A(3);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  // Clear the buffer
  display.clearDisplay();

  // Init OLED display on bus number 4
  TCA9548A(4);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  // Clear the buffer
  display.clearDisplay();

  // Init OLED display on bus number 5
  TCA9548A(5);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  // Clear the buffer
  display.clearDisplay();

  // Write to OLED on bus number 2
  TCA9548A(2);
  display.clearDisplay();
  display.setTextSize(8);
  display.setTextColor(WHITE);
  display.setCursor(45, 10);
  // Display static text
  display.println("1");
  display.display();

  // Write to OLED on bus number 3
  TCA9548A(3);
  display.clearDisplay();
  display.setTextSize(8);
  display.setTextColor(WHITE);
  display.setCursor(45, 10);
  // Display static text
  display.println("2");
  display.display();

  // Write to OLED on bus number 4
  TCA9548A(4);
  display.clearDisplay();
  display.setTextSize(8);
  display.setTextColor(WHITE);
  display.setCursor(45, 10);
  // Display static text
  display.println("3");
  display.display();

  // Write to OLED on bus number 5
  TCA9548A(5);
  display.clearDisplay();
  display.setTextSize(8);
  display.setTextColor(WHITE);
  display.setCursor(45, 10);
  // Display static text
  display.println("4");
  display.display();
}

void loop() {

}

Просмотреть исходный код

Как работает код

Продолжайте чтение, чтобы узнать, как работает код, или перейдите к разделу Демонстрация.

Сначала импортируйте необходимые библиотеки для управления OLED дисплеем: Adafruit_GFX и Adafruit_SSD1306. Библиотека Wire необходима для использования протокола связи I2C.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Определите ширину и высоту OLED.

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Создайте экземпляр Adafruit_SSD1306 для связи с OLED дисплеем.

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

Вы можете использовать один и тот же экземпляр для связи со всеми дисплеями. В этом случае вам нужно очищать буфер дисплея (display.clearDisplay()) перед записью на другой OLED.

В качестве альтернативы вы можете создать несколько экземпляров Adafruit_SSD1306, по одному для каждого OLED. В этом случае вам не нужно очищать буфер. Мы покажем вам пример с несколькими экземплярами в конце этого раздела.

Выбор канала I2C

Функция TCA9548A() может быть вызвана для выбора шины, с которой вы хотите общаться. Она отправляет байт мультиплексору с номером порта.

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

Вы должны вызывать эту функцию каждый раз, когда хотите выбрать порт I2C.

setup()

В setup() инициализируйте последовательную связь для целей отладки.

Serial.begin(115200);

Запустите связь I2C на стандартных выводах I2C с мультиплексором I2C.

Wire.begin();

Затем инициализируйте каждый дисплей. Следующие строки показывают пример для первого OLED дисплея (он подключён к шине номер 2).

//Init OLED display on bus number 2
TCA9548A(2);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
  Serial.println(F("SSD1306 allocation failed"));
  for(;;);
}
// Clear the buffer
display.clearDisplay();

Инициализация других дисплеев аналогична, но вам нужно вызвать функцию TCA9548A() с соответствующим номером шины I2C.

Затем запишите что-нибудь на дисплеи. Не забывайте, что вам нужно вызывать функцию TCA9548A() каждый раз, когда хотите переключиться между OLED. Вам также нужно очистить буфер дисплея перед записью на OLED.

// Write to OLED on bus number 2
TCA9548A(2);
display.clearDisplay();
display.setTextSize(8);
display.setTextColor(WHITE);
display.setCursor(45, 10);
// Display static text
display.println("1");
display.display();

В данном случае мы просто выводим разные числа на каждом дисплее. Вот пример для OLED номер 4 (он подключён к шине номер 5).

// Write to OLED on bus number 5
TCA9548A(5);
display.clearDisplay();
display.setTextSize(8);
display.setTextColor(WHITE);
display.setCursor(45, 10);
// Display static text
display.println("4");
display.display();

Вот в основном и всё, как работает код.

Пример с несколькими экземплярами

Следующий код показывает аналогичный пример, но с использованием нескольких экземпляров Adafruit_SSD1306. Обратите внимание, что вам не нужно очищать буфер перед записью на дисплей.

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/tca9548a-i2c-multiplexer-esp32-esp8266-arduino/

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*********/

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display1(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Adafruit_SSD1306 display2(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Adafruit_SSD1306 display3(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Adafruit_SSD1306 display4(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

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

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

  // Start I2C communication with the Multiplexer
  Wire.begin();

  // Init OLED display on bus number 2 (display 1)
  TCA9548A(2);
  if(!display1.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  // Clear the buffer
  display1.clearDisplay();

  // Init OLED display on bus number 3
  TCA9548A(3);
  if(!display2.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  // Clear the buffer
  display2.clearDisplay();

  // Init OLED display on bus number 4
  TCA9548A(4);
  if(!display3.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  // Clear the buffer
  display3.clearDisplay();

  // Init OLED display on bus number 5
  TCA9548A(5);
  if(!display4.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  // Clear the buffer
  display4.clearDisplay();

  // Write to OLED on bus number 2
  TCA9548A(2);
  display1.setTextSize(8);
  display1.setTextColor(WHITE);
  display1.setCursor(45, 10);
  // Display static text
  display1.println("1");
  display1.display();

  // Write to OLED on bus number 3
  TCA9548A(3);
  display2.setTextSize(8);
  display2.setTextColor(WHITE);
  display2.setCursor(45, 10);
  // Display static text
  display2.println("2");
  display2.display();

  // Write to OLED on bus number 4
  TCA9548A(4);
  display3.setTextSize(8);
  display3.setTextColor(WHITE);
  display3.setCursor(45, 10);
  // Display static text
  display3.println("3");
  display3.display();

  // Write to OLED on bus number 5
  TCA9548A(5);
  display4.setTextSize(8);
  display4.setTextColor(WHITE);
  display4.setCursor(45, 10);
  // Display static text
  display4.println("4");
  display4.display();
}

void loop() {

}

Просмотреть исходный код

Демонстрация

Загрузите код на вашу плату. Вот что вы должны получить.

Демонстрация OLED SSD1306 с I2C мультиплексором TCA9548A

Как видите, управлять несколькими OLED дисплеями, отображающими различную графику, с помощью I2C мультиплексора довольно просто.

Чтение нескольких датчиков BME280 — I2C мультиплексор TCA9548A

В этом разделе вы узнаете, как считывать данные с нескольких датчиков BME280 с помощью I2C мультиплексора TCA9548A. Мы будем считывать данные с четырёх датчиков, но вы можете подключить до 8 датчиков.

Демонстрация BME280 с I2C мультиплексором TCA9548A

Необходимые компоненты

Вот список компонентов, необходимых для этого примера:

Схема подключения нескольких датчиков BME280 с I2C мультиплексором

Подключите четыре датчика BME280, как показано на следующей схеме. Мы используем шины номер 2, 3, 4 и 5. Вы можете выбрать любые другие номера портов.

Мы также подключаем A0, A1 и A2 к GND. Это устанавливает адрес 0x70 для мультиплексора.

Схема подключения нескольких датчиков BME280 с I2C мультиплексором TCA9548A

Вот стандартные выводы I2C в зависимости от используемого микроконтроллера:

Микроконтроллер

Выводы I2C

ESP32

GPIO 22 (SCL), GPIO 21 (SDA)

ESP8266

GPIO 5 (D1) (SCL), GPIO 4 (D2) (SDA)

Arduino Uno

A5 (SCL), A4 (SDA)

Код для нескольких датчиков BME280 с I2C мультиплексором

Аналогично OLED дисплею, чтение данных с нескольких датчиков так же просто, как управление одним датчиком. Вам просто нужно учитывать выбор правильной шины I2C перед обменом данными с датчиком.

Чтобы узнать, как считывать данные с датчика BME280:

Установка библиотек

Мы будем использовать следующие библиотеки для чтения данных с датчика BME280. Убедитесь, что эти библиотеки установлены:

Вы можете установить библиотеки через Arduino Library Manager. Перейдите в Sketch > Include Library > Manage Libraries и найдите название библиотеки.

Если вы используете VS Code с расширением PlatformIO, скопируйте следующее в файл platformio.ini для подключения библиотек.

lib_deps = adafruit/Adafruit Unified Sensor @ ^1.1.4
            adafruit/Adafruit BME280 Library @ ^2.1.2

После установки библиотек можно продолжить.

Скопируйте следующий код в Arduino IDE и загрузите его на вашу плату. Он заработает сразу.

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/tca9548a-i2c-multiplexer-esp32-esp8266-arduino/

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*********/

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

#define SEALEVELPRESSURE_HPA (1022)

Adafruit_BME280 bme1; // I2C
Adafruit_BME280 bme2; // I2C
Adafruit_BME280 bme3; // I2C
Adafruit_BME280 bme4; // 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 2
  TCA9548A(2);
  if (!bme1.begin(0x76)) {
    Serial.println("Could not find a valid BME280 sensor on bus 2, check wiring!");
    while (1);
  }
  Serial.println();

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

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

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

void loop() {
  //Print values for sensor 1
  printValues(bme1, 2);
  printValues(bme2, 3);
  printValues(bme3, 4);
  printValues(bme4, 5);
  delay(5000);
}

Просмотреть исходный код

Как работает код

Продолжайте чтение, чтобы узнать, как работает код, или перейдите к разделу Демонстрация BME280.

Сначала импортируйте необходимые библиотеки для работы с BME280: Adafruit_BME280 и Adafruit_Sensor. Библиотека Wire необходима для использования протокола связи I2C.

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

Затем вам нужно создать несколько экземпляров Adafruit_BME280, по одному для каждого датчика: bme1, bme2, bme3 и bme4.

Adafruit_BME280 bme1; // I2C
Adafruit_BME280 bme2; // I2C
Adafruit_BME280 bme3; // I2C
Adafruit_BME280 bme4; // I2C

Выбор канала I2C

Функция TCA9548A() может быть вызвана для выбора шины, с которой вы хотите общаться. Она отправляет байт мультиплексору с номером порта.

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

Вы должны вызывать эту функцию каждый раз, когда хотите выбрать порт I2C.

Функция printValues()

Затем мы создаём функцию printValues(), которая позволяет выводить в Serial Monitor значения каждого датчика. Эта функция позволяет передать экземпляр Adafruit_BME280 и его шину.

Внутри функции мы выбираем шину I2C, с которой хотим общаться, вызывая функцию TCA9548A() и передавая шину в качестве аргумента.

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(" %");

setup()

В setup() инициализируйте последовательную связь для целей отладки.

Serial.begin(115200);

Запустите связь I2C на стандартных выводах I2C с мультиплексором I2C.

Wire.begin();

Затем инициализируйте каждый датчик. Следующие строки показывают пример для первого датчика BME280 (он подключён к шине номер 2 и ссылается на экземпляр bme1).

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

Инициализация других датчиков аналогична, но вам нужно вызвать функцию TCA9548A() с соответствующим номером шины I2C. Также не забывайте, что каждый датчик имеет свой собственный экземпляр.

loop()

В loop() мы вызываем функцию printValues() для каждого датчика.

printValues(bme1, 2);
printValues(bme2, 3);
printValues(bme3, 4);
printValues(bme4, 5);

Вот в основном и всё, как работает код.

Демонстрация

Загрузите код на вашу плату. Откройте Serial Monitor на скорости 115200 бод. Показания каждого датчика будут отображаться в Serial Monitor.

Демонстрация нескольких датчиков BME280 с I2C мультиплексором

Заключение

В этом руководстве вы узнали, как добавить больше портов I2C к вашему микроконтроллеру с помощью I2C мультиплексора TCA9548A. Это особенно полезно, если вы хотите подключить несколько устройств с одинаковым I2C адресом. Кроме того, I2C адрес самого мультиплексора можно изменить с 0x70 на 0x77. Это позволяет подключить до 8 мультиплексоров одновременно, что даёт возможность управлять 64 устройствами.

Примеры, показанные в этом руководстве, совместимы с платами ESP32, ESP8266 и Arduino.

У нас есть подробное руководство о функциях I2C с ESP32:

Источник: :doc:`Random Nerd Tutorials — Guide for TCA9548A I2C Multiplexer: ESP32, ESP8266, Arduino <../tca9548a-i2c-multiplexer-esp32-esp8266-arduino/index>`