19/05/2000
El protocolo I2C es fundamental en proyectos con Arduino y la librería Wire.h facilita su uso. Este artículo te guiará a través de su funcionamiento, ventajas, problemas comunes y ejemplos prácticos para que puedas integrarlo en tus proyectos con total confianza.
¿Qué es la comunicación I2C y cómo funciona?
I2C (Inter-Integrated Circuit) o TWI (Two Wire Interface) es un protocolo serial de comunicación maestro-esclavo, desarrollado por Phillips Semiconductors. Se caracteriza por su eficiencia al usar solo dos cables: SDA (datos) y SCL (reloj), permitiendo conectar múltiples sensores y actuadores a un único microcontrolador.
En la arquitectura maestro-esclavo, un dispositivo maestro (usualmente tu Arduino) inicia y controla la comunicación, mientras que los dispositivos esclavos (sensores, actuadores) responden a sus solicitudes. Es similar a un salón de clases donde el profesor (maestro) interactúa con los estudiantes (esclavos).
Cada mensaje I2C consta de: condición de inicio, trama de dirección (identifica al esclavo), trama(s) de datos y condición de parada. Las resistencias pull-up en SDA y SCL son cruciales para el funcionamiento correcto del bus.
Ventajas de I2C sobre otros protocolos:
I2C se destaca por:

- Bajo consumo de pines: Solo necesita dos pines para controlar varios dispositivos.
- Alta velocidad: Puede alcanzar velocidades de hasta 5 Mbps (mucho más rápido que el Serial).
- Multi-maestro: Permite que varios microcontroladores compartan el mismo bus I2C.
En la siguiente tabla comparativa se muestran las diferencias entre I2C, Serial y SPI:
| Protocolo | Pines | Velocidad | Multi-Maestro |
|---|---|---|---|
| I2C | 2 | Hasta 5 Mbps | Sí |
| Serial | 2 | <300 Kbps | No |
| SPI | 4 o más | Variable, alta | No |
¿Dónde se usa I2C?
La comunicación I2C se utiliza ampliamente en una gran variedad de dispositivos, incluyendo:
- Sensores de temperatura ( TMP102 , MCP9808 )
- Memorias EEPROM
- Pantallas OLED
- Lectores RFID
- Acelerómetros
- Giroscopios
- Muchos más...
Librería Wire para I2C en Arduino
La librería Wire.h es la herramienta esencial para programar la comunicación I2C en Arduino. Viene preinstalada en el Arduino IDE y simplifica la interacción con el bus. Algunas funciones clave son:
- Wire.begin(): Inicializa la librería y configura Arduino como maestro o esclavo.
- Wire.beginTransmission(address): Inicia una transmisión al esclavo con la dirección
address. - Wire.write(data): Envía datos al esclavo.
- Wire.endTransmission(): Finaliza la transmisión.
- Wire.requestFrom(address, quantity): Solicita una cantidad
quantityde bytes al esclavo con la direcciónaddress. - Wire.read(): Lee un byte recibido.
- Wire.available(): Indica la cantidad de bytes disponibles para leer.
- Wire.setClock(frequency): Establece la velocidad del reloj (frecuencia).
- Wire.onReceive(handler) (para esclavos): Define una función
handlerque se ejecutará al recibir datos. - Wire.onRequest(handler) (para esclavos): Define una función
handlerque se ejecutará cuando se soliciten datos.
Ejemplo: Comunicación entre dos Arduinos con I2C
Este ejemplo muestra cómo hacer una comunicación bidireccional entre dos Arduinos usando la librería Wire.h. Un Arduino actúa como maestro y el otro como esclavo. El maestro solicita datos (ej. el tiempo en milisegundos) del esclavo.

Código Maestro:
#include <Wire.h>void setup() { Wire.begin(); // Inicializa como maestro Serial.begin(9600);}void loop() { Wire.beginTransmission(23); // Dirección del esclavo Wire.write('); // Envía un carácter de inicio Wire.endTransmission(); Wire.requestFrom(23, 1); byte len = Wire.read(); Wire.requestFrom(23, len); while (Wire.available()) { Serial.print((char)Wire.read()); } delay(500);}Código Esclavo:
#include <Wire.h>String message;bool S = false;void setup() { Wire.begin(23); // Inicializa como esclavo con la dirección 23 Wire.onRequest(eventoSolicitud); Wire.onReceive(eventoRecepcion);}void loop() { delay(100);}void eventoRecepcion() { if (Wire.read() == ') { S = true; message = String(millis()); }}void eventoSolicitud() { if (S) { Wire.write(message.length()); S = false; } else { Wire.write(message.c_str()); }}Problemas comunes en la comunicación I2C
- Falta de resistencias pull-up: Asegúrate de tener resistencias pull-up (2kΩ - 10kΩ) en SDA y SCL.
- Cables demasiado largos: Utiliza cables cortos para minimizar interferencias.
- Incompatibilidad de voltaje: Todos los dispositivos deben operar al mismo voltaje (3V o 5V).
- Direcciones I2C duplicadas: Cada dispositivo en el bus debe tener una dirección I2C única.
La librería Wire.h y el protocolo I2C son herramientas poderosas para expandir las capacidades de tus proyectos Arduino. Con este tutorial, ahora puedes integrar eficientemente múltiples sensores y actuadores, aprovechando las ventajas de la comunicación I2C. Recuerda tener en cuenta los problemas comunes para asegurar un funcionamiento sin problemas.
Si quieres conocer otros artículos parecidos a Librería wire.h: comunicación i2c con arduino - información puedes visitar la categoría Libros y Librerías.
