Руководство по I2C мультиплексору TCA9548A: ESP32, ESP8266, Arduino
В этом руководстве вы узнаете, как расширить порты шины I2C (ESP32, ESP8266, Arduino) с помощью I2C мультиплексора TCA9548A 1-к-8. Этот аппаратный модуль полезен, если вы хотите управлять несколькими I2C-устройствами с одинаковым I2C-адресом. Например, несколькими OLED-дисплеями или несколькими датчиками, такими как BME280.
Это руководство совместимо с платами ESP32, ESP8266 и Arduino. Мы будем программировать платы с помощью Arduino IDE.
Содержание
В этом руководстве мы рассмотрим следующие темы:
Управление несколькими OLED-дисплеями – I2C мультиплексор TCA9548A
Чтение данных с нескольких датчиков BME280 – I2C мультиплексор TCA9548A
Знакомство с I2C мультиплексором TCA9548A 1-к-8
Протокол связи I2C позволяет обмениваться данными с несколькими I2C-устройствами на одной шине I2C, при условии, что все устройства имеют уникальный I2C-адрес. Однако это не будет работать, если вы хотите подключить несколько I2C-устройств с одинаковым адресом.
I2C мультиплексор TCA9548A позволяет обмениваться данными с до 8 I2C-устройствами на одной шине I2C. Мультиплексор связывается с микроконтроллером по протоколу I2C. Затем вы можете выбрать, к какой шине I2C на мультиплексоре вы хотите обратиться.
Чтобы обратиться к конкретному порту, достаточно отправить мультиплексору один байт с номером нужного выходного порта.
Характеристики мультиплексора 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-дисплеев (до 8)
Вы можете использовать ссылки выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Схема подключения нескольких OLED-дисплеев с I2C мультиплексором
Подключите четыре OLED-дисплея, как показано на следующей схеме. Мы используем шины номер 2, 3, 4 и 5. Вы можете выбрать любые другие номера портов.
Мы также подключаем A0, A1 и A2 к GND. Это устанавливает адрес 0x70 для мультиплексора.
Вот стандартные выводы 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-дисплеями, отображающими различную графику, с помощью I2C мультиплексора довольно просто.
Чтение данных с нескольких датчиков BME280 – I2C мультиплексор TCA9548A
В этом разделе вы узнаете, как считывать данные с нескольких датчиков BME280, используя I2C мультиплексор TCA9548A. Мы будем считывать данные с четырех датчиков, но вы можете подключить до 8 датчиков.
Необходимые компоненты
Вот список компонентов, необходимых для этого примера:
Несколько датчиков BME280 (до 8)
Вы можете использовать ссылки выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Схема подключения нескольких датчиков BME280 с I2C мультиплексором
Подключите четыре датчика BME280, как показано на следующей схеме. Мы используем шины номер 2, 3, 4 и 5. Вы можете выбрать любые другие номера портов.
Мы также подключаем A0, A1 и A2 к GND. Это устанавливает адрес 0x70 для мультиплексора.
Вот стандартные выводы 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:
ESP32 с датчиком BME280 в Arduino IDE (давление, температура, влажность)
ESP8266 с BME280 в Arduino IDE (давление, температура, влажность)
Руководство по датчику BME280 с Arduino (давление, температура, влажность)
Установка библиотек
Мы будем использовать следующие библиотеки для чтения данных с датчика 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.
Заключение
Из этого руководства вы узнали, как добавить больше I2C-портов к вашему микроконтроллеру с помощью I2C мультиплексора TCA9548A. Это особенно полезно, если вы хотите подключить несколько устройств с одинаковым I2C-адресом. Кроме того, I2C-адрес самого мультиплексора может быть изменен с 0x70 на 0x77. Это позволяет подключить до 8 мультиплексоров одновременно, что дает возможность управлять 64 устройствами.
Примеры, показанные в этом руководстве, совместимы с платами ESP32, ESP8266 и Arduino.
У нас есть подробное руководство по функциям I2C для ESP32:
Узнайте больше об ESP32, ESP8266 и Arduino с помощью наших ресурсов:
Бесплатные проекты |
Курс/Книга |
|
|---|---|---|
ESP32 |
||
ESP8266 |
||
Arduino |
Надеемся, это руководство было для вас полезным.
Спасибо за чтение.