Multiplexeur TCA9548A I2C : ESP32, ESP8266, Arduino

Multiplexeur TCA9548A I2C : ESP32, ESP8266, Arduino

Dans ce guide, vous apprendrez à étendre les ports de bus I2C (ESP32, ESP8266, Arduino) à l’aide du multiplexeur TCA9458A 1 à 8 I2C. Ce matériel est utile si vous souhaitez contrôler plusieurs périphériques I2C avec la même adresse I2C. Par exemple, plusieurs écrans OLED ou plusieurs capteurs comme le BME280.

Guide pour multiplexeur TCA9548A I2C ESP32 ESP8266 Arduino

Ce tutoriel est compatible avec les cartes ESP32, ESP8266 et Arduino. Nous programmerons les cartes à l’aide de l’IDE Arduino.

Table des matières

Dans ce didacticiel, nous aborderons les sujets suivants :

Présentation du multiplexeur TCA9548A 1 à 8 I2C

Module de capteur multiplexeur TCA9548A I2C

Le protocole de communication I2C vous permet de communiquer avec plusieurs appareils I2C sur le même bus I2C tant que tous les appareils ont une adresse I2C unique. Cependant, cela ne fonctionnera pas si vous souhaitez connecter plusieurs périphériques I2C avec la même adresse.

Le Multiplexeur TCA9548A I2C vous permet de communiquer avec jusqu’à 8 appareils I2C avec le même bus I2C. Le multiplexeur communique avec un microcontrôleur en utilisant le protocole de communication I2C. Ensuite, vous pouvez sélectionner le bus I2C du multiplexeur que vous souhaitez adresser.

Pour adresser un port spécifique, il vous suffit d’envoyer un seul octet au multiplexeur avec le numéro de port de sortie souhaité.

Multiplexeur TCA9548A I2C Comment ça marche

Caractéristiques du multiplexeur TCA9548A

Voici un résumé de ses principales fonctionnalités :

  • 1 à 8 commutateurs de traduction bidirectionnels
  • Entrée de réinitialisation active-basse
  • Trois broches d’adresse – jusqu’à 8 appareils TCA9548A sur le même bus I2C
  • Sélection de canal via un bus I2C
  • Plage de tension d’alimentation de fonctionnement : 1,65 V à 5,5 V
  • Broches tolérantes 5V

Pour une description plus détaillée, consultez la fiche technique.

Adresse I2C du multiplexeur TCA9548A

Le multiplexeur TCA9548A communique avec un microcontrôleur en utilisant le protocole de communication I2C. Donc, il a besoin d’une adresse I2C. L’adresse du multiplexeur est configurable. Vous pouvez sélectionner une valeur comprise entre 0x70 et 0x77 en ajustant les valeurs des broches A0, A1 et A2, comme indiqué dans le tableau ci-dessous.

A0 A1 A2 Adresse I2C
FAIBLE FAIBLE FAIBLE 0x70
HAUT FAIBLE FAIBLE 0x71
FAIBLE HAUT FAIBLE 0x72
HAUT HAUT FAIBLE 0x73
FAIBLE FAIBLE HAUT 0x74
HAUT FAIBLE HAUT 0x75
FAIBLE HAUT HAUT 0x76
HAUT HAUT HAUT 0x77

Ainsi, vous pouvez connecter jusqu’à 8 multiplexeurs TCA9548A au même bus I2C, ce qui vous permettrait de connecter 64 appareils avec la même adresse en utilisant un seul bus I2C du microcontrôleur.

Par exemple, si vous connectez A0, A1 et A2 à GND, cela définit l’adresse 0x70 pour le multiplexeur.

Brochage TCA9548A

Le tableau suivant décrit le brochage du TCA9584A.

Broche Description
NIV Alimente le multiplexeur
Terre Connectez-vous à GND
SDA Connectez-vous à la broche SDA du microcontrôleur maître
SCL Connectez-vous à la broche SCL du microcontrôleur maître
TVD Broche RST basse active – peut être utilisée pour réinitialiser le multiplexeur
A0 Sélectionne l’adresse I2C du multiplexeur – se connecte à GND ou VCC
A1 Sélectionne l’adresse I2C du multiplexeur – se connecte à GND ou VCC
A2 Sélectionne l’adresse I2C du multiplexeur – se connecte à GND ou VCC
SD0 SDA pour le canal 0
SC0 SCL pour le canal 0
SD1 SDA pour le canal 1
SC1 SCL pour le canal 1
SD2 SDA pour le canal 2
SC2 SCL pour le canal 2
SD3 SDA pour le canal 3
SC3 SCL pour le canal 3
SD4 SDA pour le canal 4
SC4 SCL pour le canal 4
SD5 SDA pour le canal 5
SC5 SCL pour le canal 5
SD6 SDA pour le canal 6
SC6 SCL pour le canal 6
SD7 SDA pour le canal 7
SC7 SCL pour le canal 7

Multiplexeur TCA9548A I2C Sélection d’un bus I2C

Comme mentionné précédemment, pour sélectionner un bus I2C spécifique pour lire/écrire des données, il vous suffit d’envoyer un seul octet au multiplexeur avec le numéro de port de sortie souhaité (0 à 7).

Pour ce faire, vous pouvez simplement utiliser la fonction définie par l’utilisateur suivante :

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);
}

Ensuite, il vous suffit d’appeler cette fonction et de passer en argument le numéro de bus du port que vous souhaitez contrôler avant d’envoyer les commandes I2C. Par exemple, pour contrôler l’appareil connecté au bus numéro 3, vous appelleriez la ligne suivante avant d’appeler d’autres commandes I2C (notez qu’elle commence à 0) :

TCA9548A(2);

Vous verrez comment cela fonctionne avec des exemples pratiques dans les sections suivantes.


Contrôlez plusieurs écrans OLED—Multiplexeur I2C TCA9548A

Dans cette section, nous allons vous montrer comment contrôler plusieurs écrans OLED. À titre d’exemple, nous contrôlerons quatre écrans OLED, mais vous pouvez connecter jusqu’à 8 écrans.

Pièces requises

Voici une liste des pièces nécessaires pour cet exemple :

Vous pouvez utiliser les liens précédents ou accéder directement à MakerAdvisor.com/tools pour trouver toutes les pièces pour vos projets au meilleur prix !

1686132017 538 Multiplexeur TCA9548A I2C ESP32 ESP8266 Arduino

Plusieurs écrans OLED avec circuit multiplexeur I2C

Connectez quatre écrans OLED comme indiqué dans le diagramme schématique suivant. Nous utilisons les bus numéros 2, 3, 4 et 5. Vous pouvez choisir n’importe quel autre numéro de port.

Nous connectons également A0, A1 et A2 à GND. Ceci sélectionne l’adresse 0x70 pour le multiplexeur.

Plusieurs écrans OLED Schéma de circuit de câblage du multiplexeur TCA9548A I2C

Voici les broches I2C par défaut en fonction du microcontrôleur que vous utilisez :

Microcontrôleur Broches I2C
ESP32 GPIO 22 (SCL), GPIO 21 (SDA)
ESP8266 GPIO 5 (D1) (SCL), GPIO 4 (D2) (SDA)
Arduino Uno A5 (SCL), A4 (SDA)

Plusieurs écrans OLED avec code multiplexeur I2C

Le contrôle des écrans est aussi simple que le contrôle d’un seul écran. Il vous suffit de penser à sélectionner le bon bus I2C avant d’envoyer les commandes d’écriture à l’écran.

Pour savoir comment contrôler un affichage I2C, vous pouvez lire les articles suivants :

Installation des bibliothèques

Nous utiliserons les bibliothèques suivantes pour contrôler l’affichage OLED. Assurez-vous que ces bibliothèques sont installées :

Vous pouvez installer les bibliothèques à l’aide du gestionnaire de bibliothèque Arduino. Accédez à Esquisse > Inclure la bibliothèque > Gérer les bibliothèques et recherchez le nom de la bibliothèque.

Si vous utilisez VS Code avec l’extension PlatformIO, copiez ce qui suit dans le fichier platformio.ini pour inclure les bibliothèques.

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

Après avoir installé les bibliothèques, vous pouvez continuer.

Copiez le code suivant dans votre IDE Arduino et téléchargez-le sur votre carte. Cela fonctionnera tout de suite.

/*********
  Rui Santos
  Complete project details at https://Raspberryme.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() {
  
}

Afficher le code brut

Comment fonctionne le code

Continuez à lire pour savoir comment le code fonctionne ou passez à la Manifestation section.

Tout d’abord, importez les bibliothèques requises pour contrôler l’affichage OLED : Adafruit_GFX et Adafruit_SSD1306. La bibliothèque Wire est nécessaire pour utiliser le protocole de communication I2C.

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

Définissez la largeur et la hauteur de l’OLED.

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Créez une instance Adafruit_SSD1306 pour communiquer avec l’écran OLED.

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

Vous pouvez utiliser la même instance pour communiquer avec tous les écrans. Dans ce cas, vous devez effacer le tampon d’affichage (display.clearDisplay()) avant d’écrire sur un autre OLED.

Vous pouvez également créer plusieurs instances Adafruit_SSD1306, une pour chaque OLED. Dans ce cas, vous n’avez pas besoin d’effacer le tampon. Nous allons vous montrer un exemple avec plusieurs instances à la fin de cette section.

Sélectionnez le canal I2C

La fonction TCA9548A() peut être appelée pour sélectionner le bus avec lequel vous souhaitez communiquer. Il envoie un octet au multiplexeur avec le numéro de port.

// 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);
}

Vous devez appeler cette fonction chaque fois que vous souhaitez sélectionner le port I2C.

installation()

Dans setup(), initialisez une communication série à des fins de débogage.

Serial.begin(115200);

Démarrez la communication I2C sur les broches I2C par défaut avec le multiplexeur I2C.

Wire.begin();

Ensuite, initialisez chaque affichage. Les lignes suivantes montrent un exemple pour le premier écran OLED (il est connecté au bus numéro 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();

L’initialisation des autres écrans est similaire, mais vous devez appeler la fonction TCA9548A() avec le numéro de bus I2C correspondant.

Ensuite, écrivez quelque chose sur les écrans. N’oubliez pas que vous devez appeler la fonction TCA9548A() chaque fois que vous souhaitez basculer entre les OLED. Vous devez également effacer le tampon d’affichage avant d’écrire quoi que ce soit sur l’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(); 

Dans ce cas, nous imprimons simplement un numéro différent sur chaque écran. Voici un exemple pour l’OLED numéro 4 (il est connecté au bus numéro 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();

Et c’est à peu près comme ça que le code fonctionne.

Le code suivant montre un exemple similaire mais utilisant plusieurs instances Adafruit_SSD1306. Notez que vous n’avez pas besoin d’effacer le tampon avant d’écrire sur l’écran.

/*********
  Rui Santos
  Complete project details at https://Raspberryme.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() {
  
}

Afficher le code brut

Manifestation

Téléchargez le code sur votre tableau. Voici ce que vous devriez obtenir.

Démonstration OLED SSD1306 Module de capteur multiplexeur TCA9548A I2C

Comme vous pouvez le constater, il est assez facile de contrôler plusieurs écrans OLED affichant différents graphiques à l’aide d’un multiplexeur I2C.


Lire plusieurs capteurs BME280 – Multiplexeur TCA9548A I2C

Dans cette section, vous apprendrez à lire les données de plusieurs capteurs BME280 à l’aide du multiplexeur TCA9548A I2C. Nous allons lire les données de quatre capteurs, mais vous pouvez connecter jusqu’à 8 capteurs.

Démonstration BME280 Module de capteur multiplexeur TCA9548A I2C

Pièces requises

Voici une liste des pièces nécessaires pour cet exemple :

Vous pouvez utiliser les liens précédents ou accéder directement à MakerAdvisor.com/tools pour trouver toutes les pièces pour vos projets au meilleur prix !

1686132017 538 Multiplexeur TCA9548A I2C ESP32 ESP8266 Arduino

Plusieurs capteurs BME280 avec circuit multiplexeur I2C

Connectez quatre capteurs BME280 comme indiqué dans le diagramme schématique suivant. Nous utilisons les bus numéros 2, 3, 4 et 5. Vous pouvez choisir n’importe quel autre numéro de port.

Nous connectons également A0, A1 et A2 à GND. Ceci sélectionne l’adresse 0x70 pour le multiplexeur.

Plusieurs capteurs BME280 avec schéma de circuit de câblage du multiplexeur TCA9548A I2C

Voici les broches I2C par défaut en fonction du microcontrôleur que vous utilisez :

Microcontrôleur Broches I2C
ESP32 GPIO 22 (SCL), GPIO 21 (SDA)
ESP8266 GPIO 5 (D1) (SCL), GPIO 4 (D2) (SDA)
Arduino Uno A5 (SCL), A4 (SDA)

Plusieurs capteurs BME280 avec code multiplexeur I2C

Semblable à l’écran OLED, la lecture des données de plusieurs capteurs est aussi simple que le contrôle d’un seul capteur. Il suffit de prendre en compte la sélection du bon bus I2C avant de communiquer avec le capteur.

Pour apprendre à lire les données d’un capteur BME280 :

Installation des bibliothèques

Nous utiliserons les bibliothèques suivantes pour lire à partir du capteur BME280. Assurez-vous que ces bibliothèques sont installées :

Vous pouvez installer les bibliothèques à l’aide du gestionnaire de bibliothèque Arduino. Accédez à Esquisse > Inclure la bibliothèque > Gérer les bibliothèques et recherchez le nom de la bibliothèque.

Si vous utilisez VS Code avec l’extension PlatformIO, copiez ce qui suit dans le fichier platformio.ini pour inclure les bibliothèques.

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

Après avoir installé les bibliothèques, vous pouvez continuer.

Copiez le code suivant dans votre IDE Arduino et téléchargez-le sur votre carte. Cela fonctionnera tout de suite.

/*********
  Rui Santos
  Complete project details at https://Raspberryme.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);
}

Afficher le code brut

Comment fonctionne le code

Continuez à lire pour savoir comment le code fonctionne ou passez à la Manifestation section.

Tout d’abord, importez les bibliothèques requises pour contrôler l’affichage BME280 : Adafruit_BME280 et Adafruit_Sensor. La bibliothèque Wire est nécessaire pour utiliser le protocole de communication I2C.

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

Ensuite, vous devez créer plusieurs instances d’Adafruit_BME280, une pour chaque capteur : bme1, bme2, bme3 et bme4.

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

Sélectionnez le canal I2C

La fonction TCA9548A() peut être appelée pour sélectionner le bus avec lequel vous souhaitez communiquer. Il envoie un octet au multiplexeur avec le numéro de port.

// 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);
}

Vous devez appeler cette fonction chaque fois que vous souhaitez sélectionner le port I2C.

fonction printValues()

Ensuite, nous créons une fonction printValues() qui nous permet d’imprimer dans le Serial Monitor les valeurs de chaque capteur. Cette fonction nous permet de passer l’instance Adafruit_BME280 et son bus.

Dans la fonction, nous sélectionnons le bus I2C auquel nous voulons parler en appelant la fonction TCA9548A() et en passant le bus comme argument.

TCA9548A (bus);

Ensuite, nous utilisons les fonctions habituelles pour obtenir des lectures du capteur.

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

installation()

Dans setup(), initialisez une communication série à des fins de débogage.

Serial.begin(115200);

Démarrez la communication I2C sur les broches I2C par défaut avec le multiplexeur I2C.

Wire.begin();

Ensuite, initialisez chaque capteur. Les lignes suivantes montrent un exemple pour le premier capteur BME280 (il est connecté au bus numéro 2 et fait référence à l’instance 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();

L’initialisation des autres capteurs est similaire, mais vous devez appeler la fonction TCA9548A() avec le numéro de bus I2C correspondant. N’oubliez pas non plus que chaque capteur a sa propre instance.

boucle()

Dans la boucle(), nous appelons la fonction printValues() pour chaque capteur.

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

Et c’est à peu près comme ça que le code fonctionne.

Manifestation

Téléchargez le code sur votre tableau. Ouvrez le moniteur série à un débit en bauds de 115200. Les lectures de chaque capteur seront affichées sur le moniteur série.

Démonstration du multiplexeur I2C de plusieurs capteurs BME280

Conclusion

Ce tutoriel vous a appris à ajouter plus de ports I2C à votre microcontrôleur avec le multiplexeur I2C TCA9548A. Ceci est particulièrement utile si vous souhaitez connecter plusieurs appareils avec la même adresse I2C. De plus, l’adresse I2C du multiplexeur lui-même peut être modifiée de 0x70 à 0x77. Cela nous permet de connecter jusqu’à 8 multiplexeurs simultanément, ce qui vous permet de contrôler 64 appareils.

Les exemples présentés tout au long de ce didacticiel sont compatibles avec les cartes ESP32, ESP8266 et Arduino.

Nous avons un tutoriel complet sur les fonctions I2C avec l’ESP32 :

Apprenez-en plus sur ESP32, ESP8266 et Arduino avec nos ressources :

Nous espérons que vous trouverez ce tutoriel utile.

Merci d’avoir lu.

Cette vidéo vous emmène dans l’histoire de Raspberry Pi :

  • DollaTek Carte d'extension de multiplexeur d'IIC de TCA9548A I2C Carte d'expansion de 8 canaux
    Interface: I2C IIC Puce: TCA9548A Adresse I2C sélectionnable: 0x70-0x77 Tension de fonctionnement: 1.65-5.5V Fréquence d'horloge maximale: 400KHz
  • DAOKAI 5PCS TCA9548A IIC Multiplexeur Carte de Déploiement 400kHz 1.8V - 5V 8 Canaux I2C Communication Commutateur Développement Carte d'Extension avec Réinitialisation pour Arduino
    🔢[Interface] Il y a 8 interfaces I2C sur 1 extenseur, équipées de 8 commutateurs bidirectionnels qui peuvent être contrôlés via le bus I2C. Cela signifie : après la connexion d'un extenseur, 8 appareils avec la même adresse peuvent être connectés au même port I2C et utilisés normalement. 🔢 [Adresse par défaut] L'adresse par défaut de cet extenseur est 0x70, l'adresse peut être modifiée et peut être définie entre 0x70 ~ 0x77 selon vos besoins. 🔢 [Compatible] Compatible avec le bus IIC et le bus de gestion du système, entrée active de réinitialisation basse, prise en charge de l'insertion à chaud, faible courant de veille. Aucune impulsion de pépin lors de la mise sous tension, prise en charge de la tension entre 1,8 V, 2,5 V, 3,3 V et 5 V bus Conversion plate. 🔢[Caractéristiques] 8 extenseurs peuvent être mis en cascade dans l'adresse de 0x70 ~ 0x77, et chaque extenseur peut être connecté à 8 appareils avec la même adresse, ce qui réalise que la même interface I2C est connectée à 64 appareils avec la même adresse et une utilisation normale. 🔢 [Le forfait comprend] Vous obtiendrez 5 x TCA9548A I2C IIC Multiplexer Breakout Board.
  • AZDelivery PCA9548A Multiplexeur I2C Multiplexeur 8 canaux Compatible avec Arduino incluant Un Ebook!
    ✅ Le multiplexeur I2C commute 8 adresses I2C différentes dans la plage de 0x70 à 0x77. Cela permet à jusqu'à 8 appareils différents avec la même adresse I2C d'être connectés à la même interface I2C, le PCA9548A jouant le rôle de contrôleur d'accès. ✅ Permet la conversion du niveau de tension entre les bus 1,8 V, 2,5 V, 3,3 V et 5 V. ✅ Tension de fonctionnement: 1,8 V - 5 V. ✅ Fréquence d'horloge: 0 - 400 kHz. ✅ Ce produit inclut un E-Book qui fournit des informations utiles sur la façon de commencer votre projet. Il permet une installation rapide et fait gagner du temps sur le processus de configuration. On y trouve une série d'exemples d'applications, des guides d'installation complets et des bibliothèques.