Fundamentos · 13 min de lectura

¿Qué es I2C? SDA, SCL, resistencias pull-up y escáner Arduino

Qué es I2C y cómo funciona: SDA y SCL, direcciones de 7 bits, cálculo de pull-up, código escáner I2C, conflictos de dirección y pines de Uno, ESP32 y Pico.

I2C (Inter-Integrated Circuit) es un protocolo de comunicación serie que permite a un microcontrolador hablar con decenas de sensores, pantallas y módulos usando solo dos cables de señal (SDA y SCL). Se pronuncia «I-cuadrado-C» y en algunas hojas de datos aparece como IIC o TWI (Two Wire Interface). La pantalla LCD I2C, la pantalla OLED, el acelerómetro MPU6050, el sensor de presión BMP280 y el módulo de reloj DS1307 que usas en tus proyectos con Arduino funcionan con este protocolo; puedes conectarlos todos en paralelo a los mismos dos cables y llegar a cada uno con su propia dirección.

En esta guía aprenderás cómo funciona I2C a nivel eléctrico, qué significan las direcciones, por qué las resistencias pull-up son imprescindibles y cómo calcular su valor. Después verás paso a paso una tabla de pines para Arduino Uno, ESP32 y Raspberry Pi Pico, un código escáner I2C que encuentra todos los dispositivos del bus, un ejemplo para leer registros sin librería y soluciones a problemas habituales como los conflictos de dirección.

Módulo adaptador LCD I2C con chip PCF8574
Adaptador LCD I2C: soldado en la parte trasera de la LCD, el chip PCF8574 reduce una LCD de 16 pines a solo cuatro cables (GND, VCC, SDA, SCL) y suele responder en la dirección 0x27 o 0x3F.

¿Qué es I2C y cómo funciona?

I2C fue desarrollado en 1982 por Philips (hoy NXP) para que los chips de una misma placa se comunicaran con pocos cables. En el bus hay dos papeles: el controlador (antes llamado maestro), que inicia cada transferencia y genera el reloj, y los dispositivos destino (antes esclavos), que le responden. En los proyectos con Arduino el controlador casi siempre es el Arduino, el ESP32 o la Pico, mientras que los sensores y las pantallas son los destinos.

  • SDA (Serial Data): La línea por la que viajan los datos en ambos sentidos. El controlador envía direcciones y comandos, y el sensor devuelve sus medidas por la misma línea.
  • SCL (Serial Clock): La línea de reloj. En cada pulso de reloj se lee un bit de SDA, y el reloj lo genera el controlador.
  • GND (tierra común): La referencia de las señales. Incluso los módulos con alimentación separada deben compartir la misma GND.

Las líneas son de drenador abierto (open-drain): ningún dispositivo pone una línea a nivel alto, solo puede tirar de ella hacia nivel bajo. Lo que mantiene la línea a 1 son las resistencias pull-up que conectan SDA y SCL a la tensión de alimentación. Por eso no hay cortocircuito aunque dos dispositivos intenten hablar a la vez; si cualquiera baja la línea, todos ven un 0. Un mensaje I2C sigue este orden:

  1. START: Con SCL en alto, el controlador baja SDA de 1 a 0 y todos los dispositivos del bus empiezan a escuchar.
  2. Dirección y bit de sentido: Se envía la dirección de 7 bits seguida de un bit de lectura (1) o escritura (0).
  3. ACK: El dispositivo dueño de esa dirección baja SDA durante el 9.º pulso de reloj para decir «aquí estoy». Si nadie lo hace, se llama NACK.
  4. Bytes de datos: Cada byte se envía como 8 bits y el receptor responde a cada uno con un ACK. En la mayoría de sensores el primer byte es el número del registro que se va a leer o escribir.
  5. STOP: Con SCL en alto, SDA sube de 0 a 1 y el bus queda libre. En las lecturas se usa un START repetido (repeated start) en lugar de STOP para cambiar de sentido sin soltar el bus.

Comparar I2C con los otros dos protocolos más comunes del mundo Arduino deja claro cuándo elegirlo:

CaracterísticaI2CSPIUART (serie)
Cables de señal2 (SDA, SCL)3 compartidos (MOSI, MISO, SCK) + un CS por dispositivo2 (TX, RX)
Número de dispositivosMás de 100 direcciones en un busTantos como pines CS libresNormalmente 2 dispositivos
Velocidad típica100 kHz, 400 kHz, 1 MHz10 MHz o más9600 – 115200 baudios
Selección de dispositivoPor direcciónPor pin CSNinguna, punto a punto
Uso típicoSensores, relojes, pantallas pequeñas, EEPROMTarjetas SD, pantallas TFT, RFIDGPS, Bluetooth, conexión con el ordenador

Velocidades de I2C y límites técnicos

ModoVelocidad máximaTiempo de subida máximo¿Dónde se usa?
Modo estándar (Sm)100 kHz1000 nsPor defecto, cables largos
Modo rápido (Fm)400 kHz300 nsOLED, MPU6050, BMP280
Modo rápido plus (Fm+)1 MHz120 nsPico y algunos sensores nuevos
Modo de alta velocidad (Hs)3,4 MHz80 ns (400 pF), necesita drivers especialesRaro en proyectos maker

La librería Wire de Arduino arranca por defecto a 100 kHz; la mayoría de sensores también admite 400 kHz y puedes pasar a esa velocidad con Wire.setClock(400000). Una velocidad mayor hace que las pantallas se refresquen con más fluidez, pero vuelve el bus más sensible a la longitud de los cables y al valor de las pull-up. Según el estándar, la capacidad total del bus (cables más pines de los dispositivos) no debe superar 400 pF. Los cables dupont y planos normales añaden de 50 a 100 pF por metro y cada pin de dispositivo hasta 10 pF; por eso I2C se diseñó para trabajar dentro de una misma placa o con cables de unas decenas de centímetros. Más allá de 1 metro hay que bajar la velocidad, usar pull-up más fuertes o añadir extensores de bus como el P82B715.

Direcciones I2C: 7 bits, 8 bits y direcciones reservadas

Cada dispositivo del bus tiene una dirección de 7 bits, lo que en teoría da 128 direcciones. Como los rangos 0x00–0x07 y 0x78–0x7F están reservados para usos especiales, las direcciones utilizables son las 112 que van de 0x08 a 0x77. Normalmente el fabricante del chip fija la dirección, pero en muchos módulos puedes cambiar sus últimos bits con puentes de soldadura o pines llamados A0, A1, A2 o AD0.

Aquí viene lo confuso: algunas hojas de datos y las serigrafías de la parte trasera de los módulos dan la dirección en 8 bits, incluido el bit de sentido. Por ejemplo, detrás de una placa OLED pone «0x78», pero la dirección en el código es 0x3C; si un módulo LCD indica 0x4E, en el código es 0x27. La regla es sencilla: divide el valor de 8 bits entre 2 (desplázalo un bit a la derecha) y obtendrás la dirección de 7 bits. Las librerías de Arduino, ESP32 y MicroPython esperan siempre direcciones de 7 bits.

MóduloChipDirección por defecto¿Se puede cambiar?
Módulo LCD I2C (16x2, 20x4)PCF8574 / PCF8574A0x27 / 0x3FCon los puentes A0–A2: 0x20–0x27 o 0x38–0x3F
OLED de 0,96 pulgadasSSD13060x3C0x3D con una resistencia trasera
Acelerómetro y giroscopioMPU60500x680x69 si AD0 = 1
Reloj de tiempo realDS1307 / DS32310x68No
Presión y temperaturaBMP280 / BME2800x76 o 0x77Según el pin SDO
Intensidad de luzBH17500x230x5C si ADDR = 1
ADC de 16 bitsADS11150x480x48–0x4B con el pin ADDR
Driver de servos y PWM de 16 canalesPCA96850x40Decenas de direcciones desde 0x40 con los puentes A0–A5
Memoria EEPROMAT24C32 / AT24C2560x500x50–0x57 con A0–A2
Multiplexor I2CTCA9548A0x700x70–0x77 con A0–A2
Al escanear un módulo Tiny RTC (DS1307) aparece la dirección 0x50 junto a 0x68; no es un error, es la memoria EEPROM AT24C32 del módulo. En los módulos ZS-042 con DS3231, esa misma memoria responde en 0x57.

Resistencias pull-up: por qué hacen falta y cómo elegir su valor

Como los dispositivos del bus I2C solo pueden bajar las líneas, el nivel alto lo aportan las resistencias pull-up. Si la resistencia es demasiado grande, la capacidad del bus ralentiza el paso de 0 a 1, los flancos de la señal se redondean y a alta velocidad se leen bits erróneos. Si es demasiado pequeña, aumenta la corriente que un dispositivo debe absorber al bajar la línea; el estándar solo exige que un dispositivo pueda absorber al menos 3 mA a 0,4 V, así que la pull-up debe mantener la corriente por debajo de ese valor.

Estas fórmulas dan los dos límites: la resistencia mínima es R(mín) = (VCC − 0,4 V) / 3 mA y la máxima R(máx) = t(subida) / (0,8473 × C(bus)). Para 5 V sale R(mín) = 4,6 V / 0,003 A ≈ 1,53 kΩ, y para 3,3 V ≈ 0,97 kΩ. En un bus corto con 100 pF de capacidad, R(máx) ≈ 11,8 kΩ a 100 kHz y ≈ 3,5 kΩ a 400 kHz. Por eso en la práctica los valores más usados son 4,7 kΩ para 100 kHz y 2,2 kΩ para 400 kHz y buses con muchos dispositivos. Puedes usar la herramienta Código de colores de resistencias para leer las bandas y la herramienta Constante de tiempo RC para ver el retardo que crean la resistencia y la capacidad.

SituaciónPull-up recomendadaNota
Un módulo, cables cortos, 100 kHz4,7 kΩ – 10 kΩLa mayoría de módulos ya las llevan
Varios módulos, 400 kHz2,2 kΩ – 4,7 kΩLas resistencias de los módulos quedan en paralelo
Cables de más de 50 cm2,2 kΩ y 100 kHzNo trences SDA con SCL; trenza cada una con GND
Bus de 3,3 V (ESP32, Pico)2,2 kΩ – 4,7 kΩConecta las resistencias a 3,3 V, no a 5 V
La mayoría de módulos ya llevan resistencias pull-up de 4,7 kΩ o 10 kΩ, y las resistencias de todos los módulos del mismo bus quedan en paralelo. Si tres módulos tienen 4,7 kΩ cada uno, el total es de unos 1,57 kΩ; a 5 V eso queda justo por debajo del límite de 3 mA. Si vas a juntar cuatro o cinco módulos, puede que tengas que desoldar las pull-up de algunos o cortar su puente de soldadura.

En el Arduino Uno, al llamar a Wire.begin() también se activan las resistencias pull-up internas de 20–50 kΩ del ATmega328P. Con un solo módulo y 10–20 cm de cable suelen bastar, pero no son fiables; las resistencias externas siempre son mejor opción. Si usas una placa de sensor sin pull-up, no olvides añadir una resistencia de 4,7 kΩ desde SDA y otra desde SCL hasta VCC.

Pines I2C: Arduino Uno, Mega, ESP32, ESP8266 y Pico

PlacaSDASCLNota
Arduino Uno / NanoA4A5En el Uno R3, los pines SDA y SCL junto a AREF son el mismo bus que A4/A5
Arduino Mega 25602021En el Mega, A4 y A5 no son I2C
Arduino Leonardo / MicroD2D3Son pines digitales
ESP32 (DevKit)GPIO 21GPIO 22Con Wire.begin(SDA, SCL) se pueden elegir otros pines; el segundo bus es Wire1
ESP8266 NodeMCUD2 (GPIO 4)D1 (GPIO 5)I2C por software, pines configurables
Raspberry Pi PicoGP4 (I2C0)GP5 (I2C0)I2C0 e I2C1 disponibles en muchos pares de pines
El Arduino Uno trabaja a 5 V, mientras que el ESP32, el ESP8266 y la Pico trabajan a 3,3 V. Si un módulo conectado a una placa de 3,3 V se alimenta con 5 V y sus pull-up van a 5 V, las líneas SDA y SCL suben a 5 V y pueden dañar pines que no toleran 5 V. Alimenta el módulo con 3,3 V o usa un convertidor de nivel bidireccional con transistores BSS138 entre las dos tensiones.

Paso a paso: encontrar direcciones con el escáner I2C

Cuando consigues un módulo nuevo, lo primero es averiguar las direcciones de los dispositivos del bus. Un escáner I2C envía un mensaje vacío a cada dirección de 0x08 a 0x77 y muestra las que responden con ACK. Así compruebas a la vez que el módulo está bien conectado y qué dirección debes poner en tu código.

  1. Conecta GND del módulo a GND del Arduino y VCC a 5V (a 3.3V en módulos que solo admiten 3,3 V).
  2. Conecta SDA a A4 y SCL a A5. Si tienes varios módulos, une todos sus SDA y todos sus SCL en la protoboard.
  3. Sube el código de abajo y abre el monitor serie a 115200 baudios.
  4. Apunta las direcciones que aparecen. Si no sale nada, revisa los cables, la GND común y las resistencias pull-up.
  5. Desconecta y vuelve a conectar los módulos uno a uno para confirmar qué dirección corresponde a cada dispositivo; el escáner repite la búsqueda cada 5 segundos.
Arduino (C++)
1#include <Wire.h>
2
3void printHex(byte addr) {
4  Serial.print(F("0x"));
5  if (addr < 16) Serial.print('0');    // tek haneliye sıfır ekle / pad single digit
6  Serial.print(addr, HEX);
7}
8
9void setup() {
10  Serial.begin(115200);
11  Wire.begin();                         // Uno: A4 = SDA, A5 = SCL
12#if defined(ARDUINO_ARCH_AVR)
13  Wire.setWireTimeout(3000, true);      // AVR (Uno, Nano, Mega): hat kilitlenirse 3 ms sonra kurtar / recover a stuck bus after 3 ms
14#endif
15  Serial.println(F("I2C tarayici / I2C scanner"));
16}
17
18void loop() {
19  byte found = 0;
20  for (byte addr = 0x08; addr <= 0x77; addr++) {   // geçerli 7 bit adresler / valid 7-bit addresses
21    Wire.beginTransmission(addr);
22    byte err = Wire.endTransmission();             // 0 = cihaz ACK verdi / device acknowledged
23    if (err == 0) {
24      Serial.print(F("Bulundu / found: "));
25      printHex(addr);
26      Serial.println();
27      found++;
28    } else if (err == 4 || err == 5) {
29      Serial.print(F("Hat hatasi / bus error at "));
30      printHex(addr);
31      Serial.println();
32    }
33  }
34  if (found == 0) {
35    Serial.println(F("Cihaz yok: kablolari ve pull-up'lari kontrol et / no devices: check wiring and pull-ups"));
36  } else {
37    Serial.print(found);
38    Serial.println(F(" cihaz bulundu / device(s) found"));
39  }
40  Serial.println();
41  delay(5000);                          // 5 sn sonra yeniden tara / rescan after 5 s
42}
Resultado de endTransmission()SignificadoQué hacer
0El dispositivo reconoció su dirección (ACK)Usa esta dirección en tu código
1Datos demasiado largos para el búferNo aparece en el escáner; en el Uno no escribas más de 32 bytes de golpe
2NACK en la direcciónNo hay dispositivo en esa dirección, normal al escanear
3NACK en los datosEl dispositivo rechazó el comando; revisa el número de registro
4Otro error de busCortocircuito, faltan pull-up o hay ruido
5Tiempo de espera agotadoEl bus se bloqueó; revisa cables y alimentación

La línea setWireTimeout del código es importante: cuando SDA o SCL están en cortocircuito, o un dispositivo se queda colgado manteniendo la línea en bajo, la librería Wire del Uno con la configuración por defecto puede esperar para siempre y congelar tu programa. Con el tiempo de espera activado, la librería se rinde a los 3 ms, reinicia el hardware I2C y el escáner informa del problema con un código de error. La línea está dentro de un #if para que solo se compile en placas AVR (Uno, Nano, Mega); las librerías Wire de ESP32 y ESP8266 ya traen su propia protección por tiempo de espera, así que el mismo código compila y funciona sin cambios en las tres plataformas.

I2C sin librería: leer y escribir registros

Las librerías facilitan el trabajo, pero por dentro todas hacen lo mismo: envían al dispositivo el número de registro y luego leen o escriben bytes en ese registro. Hacerlo tú mismo una vez te permite leer la hoja de datos de un sensor nuevo y usarlo incluso sin librería. El ejemplo siguiente despierta el sensor MPU6050 del modo reposo, lee su registro de identidad (WHO_AM_I) y después calcula la temperatura y la aceleración en el eje Z a partir de los valores en bruto.

Módulo acelerómetro y giroscopio MPU-6050
Módulo MPU-6050: se conecta al bus I2C con sus pines VCC, GND, SCL y SDA, y el pin AD0 elige entre las direcciones 0x68 y 0x69.
Arduino (C++)
1#include <Wire.h>
2
3const byte MPU_ADDR = 0x68;             // AD0 GND'de; AD0 = 3.3V ise 0x69 / AD0 low; 0x69 if AD0 high
4
5void writeReg(byte reg, byte value) {
6  Wire.beginTransmission(MPU_ADDR);
7  Wire.write(reg);                      // önce yazmaç adresi / register address first
8  Wire.write(value);                    // sonra veri / then the data
9  Wire.endTransmission();               // STOP gönder / send STOP
10}
11
12int16_t readWord(byte reg) {
13  Wire.beginTransmission(MPU_ADDR);
14  Wire.write(reg);
15  Wire.endTransmission(false);          // STOP yok, tekrarlı START / no STOP, repeated START
16  Wire.requestFrom(MPU_ADDR, (byte)2);  // 2 bayt iste / request 2 bytes
17  uint8_t hi = Wire.read();
18  uint8_t lo = Wire.read();
19  return (int16_t)(((uint16_t)hi << 8) | lo);
20}
21
22void setup() {
23  Serial.begin(115200);
24  Wire.begin();
25  Wire.setClock(400000);                // hızlı mod 400 kHz / fast mode 400 kHz
26  writeReg(0x6B, 0x00);                 // PWR_MGMT_1: uykudan uyandır / wake up from sleep
27  Wire.beginTransmission(MPU_ADDR);
28  Wire.write(0x75);                     // WHO_AM_I yazmacı / WHO_AM_I register
29  Wire.endTransmission(false);
30  Wire.requestFrom(MPU_ADDR, (byte)1);
31  Serial.print(F("WHO_AM_I = 0x"));
32  Serial.println(Wire.read(), HEX);     // 68 beklenir / expect 68
33}
34
35void loop() {
36  int16_t raw = readWord(0x41);         // TEMP_OUT_H ve TEMP_OUT_L / TEMP_OUT_H and TEMP_OUT_L
37  float tempC = raw / 340.0 + 36.53;    // veri sayfasındaki formül / datasheet formula
38  int16_t az = readWord(0x3F);          // Z ekseni ivmesi / Z-axis acceleration
39  Serial.print(F("Sicaklik / temp: "));
40  Serial.print(tempC, 1);
41  Serial.print(F(" C   AccZ: "));
42  Serial.println(az / 16384.0, 2);      // +-2g aralığında 16384 = 1 g / 16384 = 1 g at +-2g
43  delay(500);
44}

Fíjate en la línea endTransmission(false) de la función de lectura: cambia de sentido con un START repetido en lugar de un STOP, así ningún otro dispositivo puede colarse y el sensor no olvida qué registro se le pidió. Si WHO_AM_I devuelve 0x68, la comunicación es perfecta. En módulos clónicos baratos el valor puede ser 0x70 u otro número; eso indica que el chip es un modelo compatible pero distinto, como el MPU6500, y es la razón por la que algunas librerías dicen «sensor no encontrado». La fórmula de temperatura (valor en bruto / 340 + 36,53) sale directamente de la hoja de datos del MPU6050; para la aceleración en el rango de ±2 g, un valor en bruto de 16384 equivale a 1 g, así que un sensor plano sobre la mesa marca unos 1,00 en el eje Z.

Varios dispositivos en el mismo bus y conflictos de dirección

La gran ventaja de I2C es que puedes conectar dispositivos en paralelo a los mismos dos cables siempre que sus direcciones sean distintas. Por ejemplo, una LCD (0x27), una OLED (0x3C), un BMP280 (0x76) y un reloj DS3231 (0x68) comparten sin problemas los pines A4 y A5; cada librería habla con su propia dirección mientras los demás dispositivos escuchan en silencio. El problema llega cuando dos dispositivos tienen la misma dirección: ambos responden con ACK, sus datos chocan y normalmente ninguno funciona. Estas son las soluciones:

  • Cambia el pin de dirección: Si conectas el pin AD0 del MPU6050 a 3,3 V, su dirección pasa a 0x69 y desaparece el conflicto con el DS3231 (0x68).
  • Usa los puentes de soldadura: Los puentes A0–A2 de los módulos LCD ofrecen 8 direcciones y el pin ADDR del ADS1115 ofrece 4.
  • Abre un segundo bus I2C: Lleva el dispositivo en conflicto a otros pines con Wire1 en el ESP32 o con I2C1 en la Pico.
  • Añade un multiplexor I2C: El TCA9548A abre ocho subbuses independientes desde una sola dirección (0x70); podrías conectar incluso ocho OLED con la misma dirección.
  • Dispositivos con dirección fija: En algunos chips, como el DS1307 o el HTU21D, la dirección no se puede cambiar; con ellos solo sirve un bus aparte o un multiplexor.

I2C con ESP32: los pines que quieras y dos buses separados

En el ESP32, el hardware I2C se puede asignar a los pines con mucha flexibilidad. Los pines por defecto son GPIO 21 (SDA) y GPIO 22 (SCL), pero con Wire.begin(SDA, SCL) puedes elegir casi cualquier par de GPIO. El ESP32 clásico y el ESP32-S3 tienen dos controladores I2C, así que puedes usar dos sensores con la misma dirección en dos buses separados; el ESP32-C3 solo tiene un controlador. Los GPIO 34–39 son solo de entrada y no sirven para I2C. Para ver el mapa completo de pines de la placa consulta la herramienta Pinout, y para una introducción general el artículo ¿Qué es el ESP32?.

Arduino (C++)
1#include <Wire.h>
2
3// Klasik ESP32'de iki I2C denetleyicisi vardır: Wire ve Wire1 / the classic ESP32 has two I2C controllers: Wire and Wire1
4
5void scan(TwoWire &bus, const char *name) {
6  Serial.printf("%s:\n", name);
7  for (uint8_t addr = 0x08; addr <= 0x77; addr++) {
8    bus.beginTransmission(addr);
9    if (bus.endTransmission() == 0) {
10      Serial.printf("  bulundu / found 0x%02X\n", addr);
11    }
12  }
13}
14
15void setup() {
16  Serial.begin(115200);
17  Wire.begin(21, 22);                   // SDA, SCL: varsayılan pinler / default pins
18  Wire1.begin(32, 33, 400000);          // SDA, SCL, hız: başka iki GPIO / SDA, SCL, speed: any two other GPIOs
19  scan(Wire, "Wire  (SDA 21, SCL 22)");
20  scan(Wire1, "Wire1 (SDA 32, SCL 33)");
21}
22
23void loop() {
24}

I2C con la Raspberry Pi Pico (MicroPython)

El chip RP2040 de la Pico tiene dos controladores llamados I2C0 e I2C1, y cada uno puede asignarse a varios pares de pines. Para I2C0 puedes usar GP0/GP1, GP4/GP5, GP8/GP9, GP12/GP13, GP16/GP17 y GP20/GP21; para I2C1, GP2/GP3, GP6/GP7, GP10/GP11, GP14/GP15, GP18/GP19 y GP26/GP27. En cada par, el pin par es SDA y el impar es SCL. En MicroPython el escáner es una sola línea: i2c.scan() devuelve la lista de direcciones que responden con ACK. Como la Pico funciona a 3,3 V, alimentar los módulos desde el pin 3V3(OUT) es lo más seguro; aunque el RP2040 admite también el modo rápido plus de 1 MHz, quedarse en 400 kHz en una protoboard da menos sorpresas. Para tus primeros pasos con la Pico, lee ¿Qué es la Raspberry Pi Pico?.

MicroPython
1from machine import Pin, I2C
2
3i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)   # I2C0: GP4 = SDA, GP5 = SCL
4devices = i2c.scan()                                 # ACK veren adresler / addresses that ACK
5
6if devices:
7    for addr in devices:
8        print("Bulundu / found:", hex(addr))
9else:
10    print("Cihaz yok / no devices")
11
12# MPU6050 varsa WHO_AM_I yazmacını oku / if an MPU6050 is present, read WHO_AM_I
13if 0x68 in devices:
14    i2c.writeto_mem(0x68, 0x6B, b"\x00")             # uykudan uyandır / wake up
15    who = i2c.readfrom_mem(0x68, 0x75, 1)[0]
16    print("WHO_AM_I:", hex(who))                     # 0x68 beklenir / expect 0x68

Ideas de proyectos con I2C

  • Miniestación meteorológica: Mide presión y temperatura con un BMP280 y muéstralas en una pantalla OLED; los dos módulos comparten los mismos dos cables.
  • Reloj digital: Lee la hora de un módulo DS3231 y muéstrala en una pantalla LCD I2C.
  • Indicador de inclinación: Calcula el ángulo con un MPU6050 y dibuja el resultado en la OLED como un nivel de burbuja.
  • Nodo de sensores Wi-Fi: Consulta desde el móvil un sensor conectado a los pines D1 y D2 de un ESP8266 NodeMCU.
  • Brazo robótico con 16 servos: Controla 16 servos con solo dos pines gracias al driver PCA9685.
  • Registrador de datos: Guarda una medida por minuto en una EEPROM AT24C256 para que los datos sobrevivan a un corte de luz.

Errores frecuentes y cómo solucionarlos

SíntomaCausa probableSolución
El escáner no encuentra ningún dispositivoSDA y SCL intercambiados, sin GND común o el módulo sin alimentaciónRevisa los cables; en el Uno, A4 = SDA y A5 = SCL
El escáner se cuelga o da error en todas las direccionesBus en cortocircuito o faltan pull-upAñade setWireTimeout; mide la tensión de alimentación en SDA y SCL en reposo
El código compila pero la pantalla sigue en blancoDirección equivocada en el código (0x27 en lugar de 0x3F)Pon la dirección que encontró el escáner
Detrás pone 0x78 y el código no funcionaSe usó la dirección de 8 bitsDivide entre 2: 0x78 → 0x3C
Dos sensores no funcionan juntosConflicto de direcciónCambia el pin de dirección, usa un segundo bus o un TCA9548A
Bloqueos aleatorios, fallos cuando arranca un motorCables largos, ruido o alimentación débilAcorta los cables, baja a 100 kHz, añade condensadores de 100 nF a los módulos
Un pin del ESP32 o de la Pico se dañóPull-up a 5 V conectadas a un pin de 3,3 VAlimenta el módulo con 3,3 V o usa un convertidor de nivel
El multímetro es tu mejor aliado con los problemas de I2C: con la alimentación encendida y sin comunicación, deberías medir la tensión de alimentación (5 V o 3,3 V) tanto en SDA como en SCL. Si ves 0 V, algún dispositivo ha cortocircuitado la línea o se ha quedado colgado. Con la placa sin alimentación también puedes estimar el valor total de pull-up del bus midiendo la resistencia entre SDA y VCC.

I2C es la forma más práctica de añadir pantallas, relojes, sensores y memoria a tu proyecto con solo dos cables; en cuanto entiendas las direcciones, las resistencias pull-up y el código escáner, resolverás la mayoría de problemas en pocos minutos. En la aplicación BlueGrays encontrarás proyectos que usan I2C, como la pantalla LCD I2C, el juego Pong en una pantalla OLED, un reloj digital con DS1307 y una pantalla del tiempo con ESP32, con esquemas de circuito y código paso a paso.

Preguntas frecuentes

¿Cuál es la diferencia entre I2C y SPI?

I2C usa direcciones para conectar más de cien dispositivos a los mismos dos cables, pero suele estar limitado a 100–400 kHz. SPI necesita tres cables compartidos y un pin de selección (CS) para cada dispositivo; a cambio, alcanza 10 MHz o más. I2C se prefiere para sensores y pantallas pequeñas, y SPI para tarjetas SD y pantallas TFT a color.

¿Cuántos dispositivos se pueden conectar a un bus I2C?

Con direcciones de 7 bits hay 112 direcciones utilizables. En la práctica el límite lo marcan más la capacidad del bus (400 pF como máximo) y las resistencias pull-up en paralelo que el número de direcciones; en una protoboard funcionan sin problema entre 5 y 10 dispositivos. Para más, usa un multiplexor TCA9548A o un segundo bus I2C.

¿Qué valor deben tener las resistencias pull-up de I2C?

Los valores más habituales son 4,7 kΩ para 100 kHz y cables cortos, y 2,2 kΩ para 400 kHz o buses con muchos dispositivos. No bajes de 1,5 kΩ en un bus de 5 V ni de 1 kΩ en uno de 3,3 V. Ten en cuenta también que las resistencias de tus módulos quedan en paralelo.

¿Cuáles son los pines I2C del Arduino Uno?

En el Arduino Uno y el Nano, SDA es el pin A4 y SCL el pin A5. El Uno R3 tiene otros dos pines marcados SDA y SCL junto a AREF, pero en la placa están unidos a A4 y A5 y no forman un bus distinto. En el Mega, los pines I2C son el 20 (SDA) y el 21 (SCL).

¿Cuál es la longitud máxima de un cable I2C?

I2C se diseñó para distancias cortas dentro de una placa; a 100 kHz y con pull-up adecuadas suele funcionar hasta 1 metro aproximadamente. Para distancias mayores hay que bajar la velocidad, usar cable de par trenzado o pasar a drivers de bus como el P82B715. Para varios metros, RS-485 o una conexión inalámbrica son mejor opción.

¿Qué hago si el escáner I2C no encuentra mi dispositivo?

Comprueba primero que SDA y SCL están en los pines correctos, que la GND común está conectada y que el módulo tiene alimentación. Después verifica las pull-up midiendo la tensión de alimentación en SDA y SCL en reposo. Si sigue sin aparecer, prueba el módulo solo, con cables cortos y a 100 kHz, y en el ESP32 asegúrate de pasar los pines correctos a Wire.begin.

Ver todos los proyectos
Uso de la pantalla LCD con I2C
#32Principiante
Premium

Uso de la pantalla LCD con I2C

Gracias al módulo I2C, el proyecto que imprime mensajes controlando la pantalla LCD con sólo 2 cables (SDA, SCL). Enseña cómo guardar pines con protocolo I2C.

4.8(53)
69
Pantalla LCD I2C para ESP32 (16x2)
#119Intermedio
Premium

Pantalla LCD I2C para ESP32 (16x2)

En este proyecto, mostramos texto conectando una pantalla LCD de 16x2 caracteres al ESP32 a través del protocolo I2C. Gracias al I2C, podemos controlar la pantalla con solo 2 pines de datos (SDA y SCL); así se elimina el desperdicio de pines que supone la conexión paralela clásica, que requiere más de 6 pines. El código imprime un mensaje fijo en la primera línea y un contador que aumenta cada segundo en la segunda línea. Además, al inicio ejecutamos el escáner I2C para mostrar la dirección de l

4.9(22)
39
Reloj digital con ESP32 y RTC DS1307 (I2C + LCD)
#120Intermedio
Premium

Reloj digital con ESP32 y RTC DS1307 (I2C + LCD)

En este proyecto, mostramos la hora y la fecha en una pantalla LCD I2C de 16x2 mediante el módulo de reloj en tiempo real (RTC) DS1307. El DS1307 es un RTC con batería de respaldo que conserva la hora incluso si el ESP32 se apaga. Ambos módulos comparten la misma línea I2C (SDA/SCL), por lo que aprendemos a controlar varios dispositivos con solo dos cables de señal. Con este proyecto conocerás el protocolo I2C, el funcionamiento de los módulos RTC y la visualización dinámica en pantallas LCD.

4.6(26)
40
Calculadora Arduino I2C
#94Intermedio
Premium

Calculadora Arduino I2C

Se trata de un proyecto de calculadora basado en Arduino que realiza operaciones de suma, resta, multiplicación y división utilizando un teclado de membrana 4x4 y una pantalla LCD 16x2 I2C. Gracias a I2C, la conexión de la pantalla se realiza con sólo 2 cables, reduciendo así el desorden de cables y manteniendo más pines abiertos para su uso. También dispone de entrada de números decimales y soporte de números negativos.

5.0(31)
43
Juego Pong - SSD1306
#86Intermedio
Premium

Juego Pong - SSD1306

El clásico juego Pong construido con Arduino y una pantalla OLED SSD1306, equipado con un oponente autónomo de inteligencia artificial (CPU) que sigue instantáneamente los movimientos de la bola y rea

4.5(47)
65
ESP32 HTTPClient + API del tiempo (con pantalla OLED SSD1306)
#134Avanzado
Premium

ESP32 HTTPClient + API del tiempo (con pantalla OLED SSD1306)

En este proyecto, utilizamos el ESP32 para realizar una llamada a la API REST de la información meteorológica (wttr.in) a través de Internet, utilizando `HTTPClient.h`. A diferencia de la versión anterior con pantalla LCD I2C, aquí utilizamos una pantalla OLED SSD1306 (128×64), lo que permite utilizar fuentes grandes, iconos vectoriales y una presentación visual muy rica en una sola pantalla. Para indicar el tiempo, se dibujan en tiempo de ejecución 7 iconos vectoriales diferentes (soleado, parc

4.3(10)
18
Reloj y calendario de matriz de puntos (MAX7219, DS1307)
#84Intermedio
Premium

Reloj y calendario de matriz de puntos (MAX7219, DS1307)

Es un proyecto que muestra información de reloj y calendario en tiempo real en la pantalla LED MAX7219 8x32 de matriz de puntos con el módulo DS1307 RTC. En la pantalla del reloj, dos puntos parpadean

5.0(37)
58
Registrador de Temperatura ESP32 (DHT22 + DS1307 RTC + microSD + OLED)
#144Avanzado
Premium

Registrador de Temperatura ESP32 (DHT22 + DS1307 RTC + microSD + OLED)

¡Construye un registrador de temperatura con marca de tiempo con ESP32! Lee temperatura/humedad del DHT22 cada 10 segundos, obtén la hora real del DS1307 RTC y registra en tarjeta microSD como CSV. El OLED muestra en vivo la temperatura (fuente grande), porcentaje de humedad, marca de tiempo y contador de registros. El archivo `/temp_log.csv` en la tarjeta SD se abre en Excel, Google Sheets o Python pandas para análisis — perfecto para monitoreo de invernadero, seguimiento de temperatura del hog

4.7(7)
12

Aprende el protocolo I2C, que te permite conectar decenas de sensores y pantallas con solo dos cables: direcciones, resistencias pull-up, un código escáner I2C y soluciones a los fallos más comunes, con ejemplos.

¿Qué es I2C? SDA, SCL, resistencias pull-up y escáner Arduino | BlueGrays