El problema: necesitas 4 OLEDs idénticos en el mismo Arduino
I2C es elegante hasta el momento en que necesitas dos dispositivos con la misma dirección en el mismo bus. Cada chip I2C viene con una dirección fija (o configurable entre 2 y 4 valores), y si compraste 4 OLEDs SSD1306 baratos, los 4 tienen dirección 0x3C. El bus colapsa y ninguno responde.
Otros casos comunes con el mismo problema:
- 7 sensores de temperatura distribuidos en un criadero o invernadero, todos del mismo modelo.
- Dos pantallas LCD idénticas en un proyecto de doble display.
- Múltiples sensores de luz BH1750, donde el ajuste de dirección por el pin ADDR solo da 2 opciones.
La solución es el TCA9548A, un multiplexor I2C 1 a 8 fabricado por Texas Instruments. Es básicamente un router para I2C: del lado del Arduino tienes un solo bus, y del lado de los dispositivos tienes ocho buses independientes. El Arduino le dice al TCA9548A "abre el bus 0" y solo el dispositivo conectado al bus 0 ve la conversación.
Este tutorial te enseña a usarlo paso a paso con un ejemplo concreto: un OLED 0.49" en el bus 0 más un sensor BMP180 en el bus 7 leyendo temperatura ambiente y mostrándola en el display.
Cómo funciona el TCA9548A internamente
Conceptualmente el chip se ubica entre el bus I2C del Arduino (el "master") y hasta ocho buses de salida, cada uno con sus propios dispositivos. Solo un bus de salida queda conectado a la vez, y tú eliges cuál:

El TCA9548A tiene un registro interno de 8 bits llamado "control register". Cada bit corresponde a un bus de salida:
- Bit 0 (LSB) = bus 0
- Bit 1 = bus 1
- ...
- Bit 7 (MSB) = bus 7
Para activar un bus, escribes al registro un byte donde solo ese bit está en 1. Ejemplos:
0b00000001= bus 0 activo0b00010000= bus 4 activo0b00000000= todos los buses cerrados (ninguno habla)0b11111111= todos los buses abiertos (raramente útil: genera colisiones)
Una vez seleccionado un bus, el TCA9548A actúa como transparente: todo el tráfico I2C entre Arduino y el dispositivo de ese bus pasa sin modificación. El TCA9548A solo "filtra" qué bus está conectado.
Rango de voltaje: 1,8 a 5,5 V. Bonus inesperado: el TCA9548A también funciona como level shifter I2C. Puedes tener el Arduino a 5 V en el lado primario y dispositivos de 3.3 V en los buses secundarios. Eso lo hace doblemente útil cuando mezclas hardware moderno con clásico.
Dirección I2C del propio TCA9548A
El TCA9548A en sí ocupa una dirección I2C en el bus principal. Por defecto: 0x70. Esta se puede cambiar con los pines A0, A1, A2 según esta tabla:
| A2 | A1 | A0 | Dirección |
|---|---|---|---|
| L | L | L | 0x70 |
| L | L | H | 0x71 |
| L | H | L | 0x72 |
| L | H | H | 0x73 |
| H | L | L | 0x74 |
| H | L | H | 0x75 |
| H | H | L | 0x76 |
| H | H | H | 0x77 |

Solo cambias esto si tienes otro dispositivo en el bus principal con dirección 0x70. En la mayoría de los casos, dejar A0 a A2 a GND es suficiente.
Conexiones físicas del TCA9548A al Arduino
| TCA9548A | Arduino Uno |
|---|---|
| Vin | 5V |
| GND | GND |
| A0 | GND |
| A1 | GND |
| A2 | GND |
| SDA | A4 |
| SCL | A5 |

Si tu Arduino es un Mega, las líneas SDA/SCL son los pines 20/21. En Arduino Leonardo/Pro Micro son los pines 2/3.
Verificar la conexión con un scanner I2C
Antes de continuar, vamos a confirmar que Arduino ve al TCA9548A:
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(115200);
Serial.println("\nI2C Scanner");
}
void loop() {
byte error, address;
int nDevices = 0;
Serial.println("Scanning…");
for (address = 1; address < 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address < 16) Serial.print("0");
Serial.println(address, HEX);
nDevices++;
}
}
if (nDevices == 0) Serial.println("No I2C devices found\n");
else Serial.println("done\n");
delay(5000);
}
Sube el sketch, abre el monitor serial a 115200 baudios. Deberías ver:
I2C Scanner
Scanning…
I2C device found at address 0x70
done

Si no aparece 0x70: revisa que Vin esté en 5V, GND en GND, A0/A1/A2 en GND, SDA en A4, SCL en A5. La resistencia pull up de I2C debería estar en el módulo (la mayoría de breakouts comerciales las incluyen). Si tu placa no las tiene, agrega 4.7 kΩ entre SDA y Vin, y entre SCL y Vin.
Función helper para cambiar de bus
Para no repetir las 3 líneas de I2C cada vez:
void TCA9548A(uint8_t bus) {
Wire.beginTransmission(0x70); // dirección del TCA9548A
Wire.write(1 << bus); // 1 << bus activa ese bus
Wire.endTransmission();
}
1 << bus es un truco de desplazamiento de bits que convierte el número de bus en el byte con ese bit en 1: 1 << 0 = 0b00000001, 1 << 3 = 0b00001000, etc.
Uso desde el sketch:
TCA9548A(0); // ahora hablo con el dispositivo del bus 0
// ... operaciones I2C normales ...
TCA9548A(7); // ahora hablo con el dispositivo del bus 7
// ...
No necesitas "cerrar" el bus antes de cambiar: basta con seleccionar el siguiente.
Resistencias pull up en los buses secundarios
Cada uno de los 8 buses secundarios necesita sus propias resistencias pull up (porque son buses I2C independientes). Si tu dispositivo es un breakout comercial (OLED, BMP180, etc.) ya las trae. Si es un IC desnudo, agrega 10 kΩ entre SDA y Vcc, y entre SCL y Vcc en ese bus específico. En la duda, 10 kΩ es siempre seguro.
Ejemplo 1: un OLED 0.49" SSD1306 en el bus 0
Conexiones del OLED:
| OLED | TCA9548A |
|---|---|
| GND | GND |
| Vcc | Arduino 3.3V (el OLED suele ser 3.3V) |
| CL (SCL) | SC0 |
| DA (SDA) | SD0 |
Sketch:
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
void TCA9548A(uint8_t bus) {
Wire.beginTransmission(0x70);
Wire.write(1 << bus);
Wire.endTransmission();
}
U8G2_SSD1306_64X32_1F_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
void setup() {
Wire.begin();
u8g2.begin();
}
void loop() {
TCA9548A(0); // hablo con el OLED del bus 0
for (int a = 999; a >= 0; --a) {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_inb24_mr);
u8g2.setCursor(0, 24);
u8g2.print(a);
a = a - 47;
u8g2.sendBuffer();
delay(100);
}
}
El sketch muestra un contador descendente saltando de 47 en 47. Esto es solo para validar que el OLED responde: en un proyecto real harías algo más útil.
Ejemplo 2: OLED más BMP180 (temperatura mostrada en pantalla)
Ahora conectamos un sensor BMP180 al bus 7 y mostramos su lectura en el OLED del bus 0:
| BMP180 | TCA9548A |
|---|---|
| GND | GND |
| Vcc | Arduino 3.3V |
| CL (SCL) | SC7 |
| DA (SDA) | SD7 |
Sketch completo:
#include <Arduino.h>
#include <U8g2lib.h>
#include <Adafruit_BMP085.h>
#include <Wire.h>
U8G2_SSD1306_64X32_1F_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
Adafruit_BMP085 bmp;
int temperature;
void TCA9548A(uint8_t bus) {
Wire.beginTransmission(0x70);
Wire.write(1 << bus);
Wire.endTransmission();
}
void setup() {
Wire.begin();
u8g2.begin();
TCA9548A(7); // selecciono bus 7 antes de inicializar BMP180
if (!bmp.begin()) {
Serial.println("BMP180 no encontrado");
while (1) {}
}
}
void loop() {
// 1) leer temperatura del BMP180 (bus 7)
TCA9548A(7);
temperature = int(bmp.readTemperature());
// 2) mostrar en el OLED (bus 0)
TCA9548A(0);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_inb24_mr);
u8g2.setCursor(0, 24);
u8g2.print(temperature);
u8g2.sendBuffer();
delay(100);
}
Punto clave: la inicialización del BMP180 (bmp.begin()) también debe hacerse con el bus 7 seleccionado. Si no, la librería intenta hablar con el chip y obtiene 0xFF, falla y entra en loop infinito.
Esto se ve en la línea TCA9548A(7) antes de bmp.begin() dentro de setup(). Es un error común: la gente selecciona el bus solo dentro del loop() y se pregunta por qué bmp.begin() falla.
Pin RESET del TCA9548A
El TCA9548A tiene un pin RESET que normalmente queda flotante (con pull up interno). Si tu bus se cuelga en algún experimento (por ejemplo, un sensor con cortocircuito que dejó SDA en LOW), puedes recuperar el TCA9548A bajando RESET a GND momentáneamente. Útil para integrar en proyectos donde el watchdog detecta cuelgues:
const int RESET_PIN = 8;
void resetMux() {
digitalWrite(RESET_PIN, LOW);
delay(10);
digitalWrite(RESET_PIN, HIGH);
}
Variantes y mejoras
Cuatro OLEDs en una sola pantalla virtual gigante: con 4 OLEDs 0.96" SSD1306 (128x64 px cada uno) puedes armar una pantalla 2x2 = 256x128 px. Cada OLED ocupa un bus del TCA9548A (del 0 al 3). Crea una función
drawCharGrande(x, y, char)que decida en qué OLED dibuja según las coordenadas. Útil para relojes XL o dashboards.Datalogger multisensor para clima: 6 sensores BME280 en los buses 0 a 5, midiendo temperatura/humedad/presión en 6 puntos distintos de la casa o invernadero, todos cableados al mismo Arduino. Logueas cada minuto a una microSD vía SPI. Costo total razonable y un solo Arduino central: más simple que tener 6 ESP32 con MQTT.
TCA9548A en cascada para más de 8 buses: si necesitas 16 o 24 buses, puedes poner un segundo TCA9548A en dirección
0x71(con A0 en HIGH) y manejar ambos desde el mismo Arduino. Combinado: 16 buses I2C separados, cada uno con dispositivos idénticos. Esto rara vez es necesario, pero es bueno saber que escala.
Personalización para Chile
| Componente | Producto en MechatronicStore | SKU | Precio CLP |
|---|---|---|---|
| Multiplexor I2C TCA9548A | Multiplexor I2C 1 a 8 canales TCA9548A | GN1-7 | $7.800 |
| Arduino Uno R3 | Arduino Uno R3 | X4-8 | $9.990 |
| OLED I2C 0.91" (alternativa al 0.49") | Pantalla Oled 128x32 I2C 0.91" SSD1306 | D-112 | $3.990 |
| Sensor de presión BMP180 | Sensor de Presión Barométrica BMP180 Digital GY-68 | GE1-10 | $2.490 |
| Resistencia 10 kΩ (pull up, si la necesitas) | Resistencia 1/4W 10kΩ | GK2-15 | $100 |
| Protoboard 830 puntos | Breadboard MB102 830 puntos | C-302 | $3.790 |
| Jumpers macho-macho 20cm | Cables macho-macho 40 piezas 20cm | C-411 | $1.990 |
Costo total estimado: ~$30.150 CLP.
Sobre el OLED 0.49" del tutorial original: ese tamaño exacto (64x32 px) es difícil de encontrar en Chile. La alternativa habitual es el OLED 0.91" SSD1306 (128x32 px), que es más grande y más legible. El sketch funciona casi igual cambiando solo la declaración del constructor U8g2 de U8G2_SSD1306_64X32 a U8G2_SSD1306_128X32.
Tip de calibración del BMP180: el sensor lee presión absoluta. Si quieres presión relativa al nivel del mar (la que reportan las estaciones meteorológicas), ajusta con la altitud de tu ciudad. Santiago centro = ~550 m, Valparaíso = ~10 m, Punta Arenas = ~15 m.
Recursos
- Tutorial original (inglés): TCA9548A 1 a 8 I2C Multiplexer Breakout with Arduino, por John Boxall en tronixstuff.com.
- Datasheet TCA9548A: ti.com/lit/ds/symlink/tca9548a.pdf
- Librería U8g2 para OLEDs: github.com/olikraus/u8g2
- Librería Adafruit BMP085 (compatible BMP180): github.com/adafruit/Adafruit-BMP085-Library
Versión chilena con componentes en stock local en MechatronicStore.










