# zwei oder mehr TCA9548A Multiplexer an einen I2C?

**URL:** <https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813>\
**Category:** Deutsch\
**Created:** [October 9, 2020, 8:54pm UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813 "2020-10-09T20:54:34Z")\
**Posts on this page:** 19\
**Page:** 1

<div class="post-metadata">

**Author:** ![spunky1a](https://avatars.discourse-cdn.com/v4/letter/s/96bed5/32.png) [@spunky1a](https://forum.arduino.cc/u/spunky1a)\
**Post date:** [October 9, 2020, 8:54pm UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/1 "2020-10-09T20:54:34Z")

</div>

Hallo,

ich möchte 48 Sensoren (Luftdruck, BMP180) auslesen (per i2c), das wollte ich mit 6 TCA9548A realisieren. Die TCA9548A kann man ja auch adressieren, also müsste das gehen.

Ich suche nun ein Code-Beispiel mit mehr als einem TCA9548A, kann da jemand helfen?

MfG.

---

<div class="post-metadata">

**Author:** ![agmue](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/agmue/32/750067_2.png) [@agmue](https://forum.arduino.cc/u/agmue)\
**Post date:** [October 9, 2020, 9:02pm UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/2 "2020-10-09T21:02:39Z")

</div>

Ungetestet: [Tutorial – Using the TCA9548A 1-to-8 I2C Multiplexer Breakout with Arduino](https://tronixstuff.com/2019/10/29/tutorial-using-the-tca9548a-1-to-8-i2c-multiplexer-breakout-with-arduino/)

Generell ist diese Quelle aber ganz gut.

---

<div class="post-metadata">

**Author:** ![HotSystems](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/hotsystems/32/219785_2.png) [@HotSystems](https://forum.arduino.cc/u/HotSystems)\
**Post date:** [October 9, 2020, 9:05pm UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/3 "2020-10-09T21:05:02Z")

</div>

Und eine weitere Quelle: [I2C-Multipl. TCA9548A :: Meine Arduino-Projekte](https://arduino-projekte.webnode.at/meine-libraries/i2c-multiplexer-tca9548a/)

---

<div class="post-metadata">

**Author:** ![noiasca](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/noiasca/32/1126910_2.png) [@noiasca](https://forum.arduino.cc/u/noiasca)\
**Post date:** [October 10, 2020, 3:56am UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/4 "2020-10-10T03:56:03Z")

</div>

a)  
eigentlich muss du dem Umschalter nur noch die jeweilige Adresse mitgeben

also die eigentliche Funktion mit einem zweiten Parameter ausstatten

```cpp
uint8_t TCA9548A(uint8_t addr, uint8_t bus)      // switch bus
{
  uint8_t result = 0; // 0 = success
  Wire.beginTransmission(addr);  // TCA9548A address is 0x70 .. 0x77
  Wire.write(1 << bus);          // send byte to select bus
  return Wire.endTransmission();
}

```

dann kannst du einfach mit

TCA9548A(0x71, 3);

auf den zweiten (0x71) TCA, Bus 3 aktivieren und danach deinen Sensor auslesen

aber  
b)  
48 Sensoren. Das ist massiv. Machst du da eine eigene Platine mit den 48 Sensoren oder wie sorgst du dafür dass die Leitungen so kurz wie möglich sind? Du kommst da eh nicht auf die Idee nun i2c quer durchs Haus mit Klingeldraht zu verlegen?

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [October 10, 2020, 7:31am UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/5 "2020-10-10T07:31:03Z")

</div>

(deleted)

---

<div class="post-metadata">

**Author:** ![spunky1a](https://avatars.discourse-cdn.com/v4/letter/s/96bed5/32.png) [@spunky1a](https://forum.arduino.cc/u/spunky1a)\
**Post date:** [October 10, 2020, 3:33pm UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/6 "2020-10-10T15:33:10Z")

</div>

ja, die Quellen habe ich natürlich als ersten gefunden.

bin dann selbst auf die Lösung gekommen, siehe auch noiasca.

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

void loop()
{
  for (addr = 0x70; addr < 0x76; addr++) {
    for (tcanr = 0; tcanr < 8; tcanr++) {
      TCA9548A(addr, tcanr);   
      pressure = int(BMP180.readPressure());
      Serial.print(tcanr);
      Serial.print(":");
      Serial.print(pressure);
      Serial.println();
    }
  }
}

```

ich will den Luftdruck in 48 Schläuchen überwachen, in denen leichtes Schüttgut transportiert wird. Erhöht sich der Druck, liegt eine Blockierung nach dem Sensor vor, verringert sich der Druck, gibt es eine Blockierung vor dem Sensor (so die Theorie). Die Leitungen der Sensoren sind max. 1-2m lang.  
"Normal" mit optischen Sensoren würde sowas ca. 7.000 - 8.000 € kosten, das will ich mir aber sparen.

---

<div class="post-metadata">

**Author:** ![HotSystems](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/hotsystems/32/219785_2.png) [@HotSystems](https://forum.arduino.cc/u/HotSystems)\
**Post date:** [October 10, 2020, 3:44pm UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/7 "2020-10-10T15:44:15Z")

</div>

> spunky1a:  
> ja, die Quellen habe ich natürlich als ersten gefunden.
> 
> bin dann selbst auf die Lösung gekommen, siehe auch noiasca.

Ok, aber das muss ich jetzt nicht verstehen ?

---

<div class="post-metadata">

**Author:** ![agmue](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/agmue/32/750067_2.png) [@agmue](https://forum.arduino.cc/u/agmue)\
**Post date:** [October 10, 2020, 5:28pm UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/8 "2020-10-10T17:28:14Z")

</div>

> spunky1a:  
> Die Leitungen der Sensoren sind max. 1-2m lang.

Je nach Umgebung und Busgeschwindigkeit kann das für I2C schon problematisch werden. Mit 48 Sensoren baust Du eine Antenne. Daher ergänzend zu #4: Eine Tüte [Nanos](https://de.aliexpress.com/item/4000109427548.html) und eine Tüte [CAN-Bus](https://www.komputer.de/zen/index.php?main_page=product_info&cPath=56_67&products_id=439).

---

<div class="post-metadata">

**Author:** ![wno158](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/wno158/32/1014607_2.png) [@wno158](https://forum.arduino.cc/u/wno158)\
**Post date:** [October 10, 2020, 6:12pm UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/9 "2020-10-10T18:12:26Z")

</div>

Hmm- ich hol mir mal eine Tüte Popcorn.

Je nachdem wie weit jeweils die 48 Schläuche auseinander liegen, würde ich - verzeiht bitte - dann statt Arduino doch 48 Controller mit eingebautem CAN verwenden 🙂

Da lohnt sich ein eigenes HW-Design schon.

Gruß Walter

---

<div class="post-metadata">

**Author:** ![spunky1a](https://avatars.discourse-cdn.com/v4/letter/s/96bed5/32.png) [@spunky1a](https://forum.arduino.cc/u/spunky1a)\
**Post date:** [October 10, 2020, 8:40pm UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/10 "2020-10-10T20:40:19Z")

</div>

die Schläuche kommen aus einem Verteiler und liegen max. 50 cm auseinander. Ich wollte einen ESP32 verwenden, da kann ich die Daten per Web, Bluetooth oder seriell auslesen.

Hatte auch schon an einen Controller pro Sensor gedacht und dann per CAN die Daten zusammenzufassen. Welchen Controller könnte man da nehmen?

---

<div class="post-metadata">

**Author:** ![agmue](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/agmue/32/750067_2.png) [@agmue](https://forum.arduino.cc/u/agmue)\
**Post date:** [October 10, 2020, 9:20pm UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/11 "2020-10-10T21:20:11Z")

</div>

> wno158:  
> Hmm- ich hol mir mal eine Tüte Popcorn.

Bring' bitte eine für mich mit 😃

> spunky1a:  
> Welchen Controller könnte man da nehmen?

Bin gerade über [CANBed - Arduino CAN-BUS Development Kit (ATmega32U4 with MCP2515 and MCP2551)](https://www.seeedstudio.com/CANBed-Arduino-CAN-BUS-Development-Kit-Atmega32U4-with-MCP2515-and-MCP2551-p-4365.html) gestolpert. Nicht gerade ein Schnäppchen, spart aber vermutlich Entwicklungszeit.

---

<div class="post-metadata">

**Author:** ![wno158](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/wno158/32/1014607_2.png) [@wno158](https://forum.arduino.cc/u/wno158)\
**Post date:** [October 10, 2020, 9:30pm UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/12 "2020-10-10T21:30:41Z")

</div>

@spunky: Oh je - die Frage habe ich befürchtet.  
Da es gefühlt Tausende davon gibt, mag ich keine dedizierte Empfehlung geben.  
Der muss ja nicht viel können:  
I2C für den Sensor und CAN zum weiterverteilen z.B. an den ESP, der hat auch CAN.  
Bei 50cm kommst Du vielleicht auch mit weniger als 48 Controllern aus, wenn Du von einem aus sternförmig ein paar von den Schläuchen erreichen kannst.

Eine Liste von CAN-fähigen Chips gibt es bei den Kollegen [mikrocontroller](https://www.mikrocontroller.net/articles/CAN):

Der erste Atmel AVR dort ist der AT90CAN32. Im [Datenblatt](http://ww1.microchip.com/downloads/en/DeviceDoc/doc7679.pdf) (PDF) findet sich auch ein "Byte-oriented Two-wire Serial Interface" (Kapitel 18) - weil I2C ein Philips-Ding ist.

Noch - aus (physikalischer) Neugier - eine Verständnisfrage:  
Wie genau soll der BMP180 in den Schläuchen angebracht werden? Musst Du da ein Löchlein reinschneiden?  
Es gibt ja für den Arduino auch IR-LEDs und -Sensoren; dann sollte das Schüttgut aber nicht allzu durchsichtig sein 🙂

Gruß Walter

@agmue: Mach' ich!

---

<div class="post-metadata">

**Author:** ![agmue](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/agmue/32/750067_2.png) [@agmue](https://forum.arduino.cc/u/agmue)\
**Post date:** [October 10, 2020, 9:47pm UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/13 "2020-10-10T21:47:54Z")

</div>

> wno158:  
> @agmue: Mach' ich!

Ich freu' mich 😃

> wno158:  
> Eine Liste von CAN-fähigen Chips gibt es bei den Kollegen [mikrocontroller](https://www.mikrocontroller.net/articles/CAN):

Da sticht mir der STM32 ins Auge, der soll auch günstig sein. Kenne ich aber nicht aus eigener Erfahrung und wichtig ist, welche Bibliotheken darauf laufen. ATmega328P ist Standard und daher kommst Du damit möglicherweise schneller zu einem Ergebnis.

ESP32 und UNO am CAN-Bus habe ich schon probiert, das funktioniert.

---

<div class="post-metadata">

**Author:** ![spunky1a](https://avatars.discourse-cdn.com/v4/letter/s/96bed5/32.png) [@spunky1a](https://forum.arduino.cc/u/spunky1a)\
**Post date:** [October 15, 2020, 6:08am UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/14 "2020-10-15T06:08:58Z")

</div>

ich habe mal 5 BMP180 an den TCA angeschlossen, bekomme aber keine vernünftigen Werte ausgelesen (siehe Bild, 3. Zeile Druck, 4. Zeile Temp), woran kann das liegen?

![5xbmp180.jpg](https://europe1.discourse-cdn.com/arduino/original/4X/b/3/c/b3ce36eb7f28851c854a14bb474925bca40c376b.jpeg)

ich benutze den folgenden Code:

```cpp
#include <Adafruit_BMP085.h>
#include <Wire.h>

Adafruit_BMP085 bmp180;
int tcanr;

void setup()
{

  Wire.begin();
  Serial.begin(115200);

  for (tcanr = 0; tcanr < 8; tcanr++) {
    TCA9548A(0, tcanr);
    bmp180.begin();
  }

}

void loop()
{

  for (tcanr = 0; tcanr < 8; tcanr++) {

    TCA9548A(0, tcanr);

    Serial.println(tcanr);

    Serial.print("Temperature = ");
    Serial.print(bmp180.readTemperature());
    Serial.println(" °C");

    Serial.print("Pressure = ");
    Serial.print(bmp180.readPressure());
    Serial.println(" Pa");

    Serial.println();
    delay(1000);
  }

}

uint8_t TCA9548A(uint8_t addr, uint8_t bus)      // switch bus
{
  uint8_t result = 0; // 0 = success
  Wire.beginTransmission(0x70 + addr);  // TCA9548A address is 0x70 .. 0x77
  Wire.write(1 << bus);          // send byte to select bus
  return Wire.endTransmission();
}

```

Teste ich jeden Sensor einzeln, werden korrekte Werde ausgelesen:

```cpp
#include <Wire.h>
#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp180;

long druck1, temp1;

void setup()
{
Serial.begin(115200);
Wire.begin ();
if (!bmp180.begin(0x77))
{
Serial.println("Could not find BMP180 or BMP085 sensor at 0x77");
while (1) {}
}
}

void loop()
{
temp1 = bmp180.readTemperature();
Serial.print("Temperatur = ");
Serial.print(temp1);
Serial.println("°C");

druck1 = bmp180.readPressure() - 0;
Serial.print("Luftdruck = ");
Serial.print(druck1);
Serial.println("Pa");

Serial.println();
delay(1000);
}

```

![5xbmp180.jpg](https://europe1.discourse-cdn.com/arduino/original/4X/b/3/c/b3ce36eb7f28851c854a14bb474925bca40c376b.jpeg)

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [October 15, 2020, 6:25am UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/15 "2020-10-15T06:25:57Z")

</div>

(deleted)

---

<div class="post-metadata">

**Author:** ![spunky1a](https://avatars.discourse-cdn.com/v4/letter/s/96bed5/32.png) [@spunky1a](https://forum.arduino.cc/u/spunky1a)\
**Post date:** [October 15, 2020, 7:08am UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/16 "2020-10-15T07:08:56Z")

</div>

ok, habe verstanden, ich muss nach jeder Adressänderung den Sensor neu initialisieren, jetzt geht es, danke. 🙂

```cpp
    TCA9548A(0, tcanr);
    bmp180.begin();

```

---

<div class="post-metadata">

**Author:** ![spunky1a](https://avatars.discourse-cdn.com/v4/letter/s/96bed5/32.png) [@spunky1a](https://forum.arduino.cc/u/spunky1a)\
**Post date:** [October 17, 2020, 10:02pm UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/17 "2020-10-17T22:02:57Z")

</div>

die Abfrage aller 48 Sensoren dauert 1,65 Sekunden, das ist doch ziemlich unpraktisch, lässt sich das irgendwie beschleunigen? Vermutlich nicht... 😕

---

<div class="post-metadata">

**Author:** ![agmue](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/agmue/32/750067_2.png) [@agmue](https://forum.arduino.cc/u/agmue)\
**Post date:** [October 17, 2020, 11:01pm UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/18 "2020-10-17T23:01:01Z")

</div>

> spunky1a:  
> ... lässt sich das irgendwie beschleunigen?

Welche Datenrate auf dem I2C-Bus verwendest Du?

Abhängig vom Modus ändert sich auch die Bereitstellungszeit für die Daten. Mittels begin(BMP085\_STANDARD) oder so kann man das einstellen.

Zur Berechnung des Drucks wird auch immer die Temperatur gemessen, was zusätzliche Zeit benötigt. Die Temperatur kann man seltener lesen, was aber wohl von der Bibliothek nicht unterstützt wird.

Ob es merklich was bringt, kann ich nicht versprechen, aber Möglichkeiten zum Probieren gibt es 😃

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [May 6, 2021, 1:55pm UTC](https://forum.arduino.cc/t/zwei-oder-mehr-tca9548a-multiplexer-an-einen-i2c/677813/19 "2021-05-06T13:55:20Z")

</div>

Closed on May 6, 2021, 1:55pm UTC


