# I2C

El protocolo I2C se desarrolló originalmente en 1982 para receptores de TV, y su característica principal son dos líneas (aparte de la alimentación 3.3V-5V y masa):

- SDA que son datos bidireccionales
- SCL que es la señal de reloj

Un dispositivo hace de **Master** y proporciona la señal de reloj. (Puede haber extraordinariamente más de un master) y los otros dispositivos, (en plural, con los mismos cables, aquí esta la ventaja) hacen de **Slave** y cada uno tiene asociado una dirección.

<p class="callout info">Ejemplos de I2C con Arduino:  
- Conexión con pantalla LCD [https://libros.catedu.es/books/programa-arduino-mediante-codigo/page/lcd](https://libros.catedu.es/books/programa-arduino-mediante-codigo/page/lcd)  
- Comunicación entre dos Arduinos [https://dronebotworkshop.com/i2c-arduino-arduino/](https://dronebotworkshop.com/i2c-arduino-arduino/)</p>

En Arduino Alvik, los pines SDA y SCL están conectados en los pines 11 y 12 y de ahí salen por los conectores QWIIC y Grove :  
[![datasheet_connectors.png](https://libros.catedu.es/uploads/images/gallery/2024-06/scaled-1680-/datasheet-connectors.png)](https://libros.catedu.es/uploads/images/gallery/2024-06/datasheet-connectors.png)

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="315" src="https://www.youtube.com/embed/u9lBFCULtME?si=lXLv4Sq-YBCfOVuW&start=1654" title="YouTube video player" width="560"></iframe>

Podemos escanear los dispositivos I2C que están conectados y averiguar la dirección que tienen asociada :

```python
from machine import I2C
from machine import Pin

i2c = I2C(0, scl=Pin(12, Pin.OUT), sda=Pin(11, Pin.OUT))

print()
print('Scan i2c bus...')
print()

devices = i2c.scan()

if len(devices) == 0:
    print("No i2c device !")
else:
    print('i2c devices found:',len(devices))
print()

for device in devices:
    print("Decimal address: ",device," | Hexa address: ",hex(device))

print()
```

Fuente : [https://docs.arduino.cc/tutorials/alvik/user-manual/#grove-connectors](https://docs.arduino.cc/tutorials/alvik/user-manual/#grove-connectors)

He conectado un OLED en el conector Grove

[![2025-05-07 13_24_53-WhatsApp.png](https://libros.catedu.es/uploads/images/gallery/2025-05/scaled-1680-/2025-05-07-13-24-53-whatsapp.png)](https://libros.catedu.es/uploads/images/gallery/2025-05/2025-05-07-13-24-53-whatsapp.png)

Y me ha salido que tenía dos dispositivos, el primero es interno del Alvik, que tiene dirección 43 y el segundo es el OLED conectado con la dirección 60 en decimal o 0x3c en hexadecimal que es la dirección por defecto en el OLED ssd1306:

[![2025-05-07 13_29_41-Arduino Lab for MicroPython.png](https://libros.catedu.es/uploads/images/gallery/2025-05/scaled-1680-/2025-05-07-13-29-41-arduino-lab-for-micropython.png)](https://libros.catedu.es/uploads/images/gallery/2025-05/2025-05-07-13-29-41-arduino-lab-for-micropython.png)

Si ejecutamos el siguiente script, vemos que necesita importar la **librería ssd1306** (se puede ver en su [repositorio](https://github.com/lexus2k/ssd1306), que es compatible con el display ssd1306 128x64 I2C y con ESP32 de Arduino).. Esta librería tiene las funciones necesarias para visualizar lo que uno quiera en el OLED. [Funciones de esta librería](https://docs.micropython.org/en/latest/esp8266/tutorial/ssd1306.html)

```python
from machine import I2C
from machine import Pin
import ssd1306

i2c = I2C(0, scl=Pin(12, Pin.OUT), sda=Pin(11, Pin.OUT))

# dirección por defecto 0x3c
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

while True:
  oled.text('HOLA CATEDU !', 10, 10)      
  oled.show()

```

Y el resultado es :

[![2025-05-07 13_35_08-WhatsApp.png](https://libros.catedu.es/uploads/images/gallery/2025-05/scaled-1680-/2025-05-07-13-35-08-whatsapp.png)](https://libros.catedu.es/uploads/images/gallery/2025-05/2025-05-07-13-35-08-whatsapp.png)

<p class="callout info">Si quieres por ejemplo esto :  
[![hello_world.jpg](https://libros.catedu.es/uploads/images/gallery/2025-05/scaled-1680-/hello-world.jpg)](https://libros.catedu.es/uploads/images/gallery/2025-05/hello-world.jpg)  
mira este [código](https://github.com/TimHanewich/MicroPython-SSD1306)</p>