Руководство по 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 дисплеев.

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

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

Вы можете использовать ссылки выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Схема подключения нескольких 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. Перейдите в 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

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

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

Вы можете использовать ссылки выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Схема подключения нескольких датчиков 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. Перейдите в 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:

Узнайте больше об ESP32, ESP8266 и Arduino с помощью наших ресурсов:

Бесплатные проекты

Курс/Книга

ESP32

Руководства по ESP32

Изучите ESP32 с Arduino IDE

ESP8266

Руководства по ESP8266

Домашняя автоматизация на ESP8266

Arduino

Руководства по Arduino

Проекты Arduino шаг за шагом

Надеемся, это руководство было для вас полезным.

Спасибо за чтение.