Este post es la continuación del post anterior donde te enseñaba como manejar una pantalla lcd 1602 mediante conexionado paralelo, pues bien en este post vamos a manejar la pantalla mediante un adaptador de I2C para ahorrarnos bastantes pines de conexión y de camino haremos una pequeña incursión en el mundo del bus de comunicaciones I2C, en otro post trataré este más a fondo ya que es bastante extenso y requiere de un tratamiento aparte.

¿Qué es I2C?

I2C es un bus de comunicación entre dispositivos electrónicos como pueden ser circuitos integrados o entre microcontroladores y sensores.

I2C son las siglas de Inter Integrated Circuit el 2 proviene de las dos I´s de Inter Integrated, (circuito inter integrado), que fue presentado por Philiphs en 1982, para la comunicación interna de sus circuitos.

I2C es usado por un montón de dispositivos, tales como acelerómetros, pantallas lcd, RTC (reloj en tiempo real) y multitud de sensores.

Descripción básica del funcionamiento de un bus I2C

El bus I2C está compuesto de 2 cables, uno para datos denominado SDA (Serial Data) y otro para la señal de reloj ya que es una comunicación serie síncrona denominada SCK.

Bus i2c
Bus I2C

Cada dispositivo en el bus tiene una dirección única para poder comunicarse con el.

Este tipo de bus I2C funciona con la filosofía de maestro-sclavo (master-slave), el maestro es el que inicia la comunicación con los esclavos enviando o recibiendo datos, los esclavos por su parte no pueden iniciar la comunicación.

Es decir los esclavos tienen que esperar a ser preguntados por el maestro, puede haber varios maestros pero no pueden ejercer como tales a la misma vez.

El bus I2C es síncrono es decir necesita de una señal de reloj que es común a todos los elementos del bus I2C y que es proporcionada por el maestro, de esta manera todos los dispositivos que conforman el sistema trabajan al unísono.

Este tipo de bus I2C necesita de un par de resistencias pull-up que en el caso de Arduino son aplicadas mediante software a través de la librería wire.h.

Si queremos velocidades de transmisión más rápidas para que los flancos de subida y bajada de la señal de transmisión de datos sean más rápidas necesitaremos colocar resistencias de entre 1 a 47KΩ.

CURSO ARDUINO

Si quieres convertirte en un experto en Arduino pincha en el siguiente botón

Cronograma de tiempos de la transmisión de señales en un bus I2C.

El tren de datos estaría compuesto por:

7 bits que contienen la dirección del dispositivo esclavo, para esto se pasa la línea SCL y SDA de nivel alto a bajo y enviamos los siete bits de la dirección del dispositivo con el que queremos comunicarnos, por lo que podremos conectar en principio un total de 128 dispositivos de los cuales 16 direcciones se reservan para usos especiales por lo que nos quedaran 116 direcciones.

R/W este bit indica si la operación que queremos realizar es de lectura =1 o escritura =0.

ACK Confirmación del esclavo que ha recibido el comando recibido=0 acknowledgement o no recibido=1 negative acknowledgement no hay ningún dispositivo en esa dirección, si por el contrario existe el esclavo pone a cero la línea SDA.

8 bits de datos: Se envían el dato de 8 bits hacia el esclavo si lo que queríamos era escribir o se reciben en el maestro por parte del esclavo si lo que queríamos era leer un dato.

ACK Se vuelve a emitir un bit de confirmación de recepción de datos emitido por el esclavo si se trataba de una escritura o por parte del maestro si era una lectura.

Stop: Se pasa la línea SCL de bajo a alto al igual que la línea SDA un pequeño tiempo más tarde, con esto se indica que ha finalizado la comunicación por el momento

I2c cronograma
I2c cronograma

Imágenes delantera y trasera de la pantalla lcd 1602 con adaptador I2C

pantalla lcd i2c delantera
pantalla lcd i2c delantera
pantalla lcd i2c trasera
pantalla lcd i2c trasera
  1. Gnd 0 voltios
  2. Vcc +5Vcc
  3. SDA datos la conectaremos al pin Analog 4 en Arduino Uno para otros modelos mirar en la hoja de características del modelo correspondiente
  4. SCL reloj la conectaremos al pin Analog 5 en Arduino Uno, comprobar para otros modelos
  5. Potenciómetro para ajustar el contraste
  6. Jumper para activar o desactivar retroiluminación Jumper quitado retro alimentación desactivada , Jumper puesto retro iluminación encendendida o apagada por software mediante la función backlight() o no backlight().

Programa para Arduino pantalla i2c

Programa que muestra el texto en la línea superior suscríbete a y a continuación en la inferior de derecha a izquierda www.pasionelectronica.com

Este programa es igual que el del post anterior pero con algunas modificaciones para usar el adaptador I2C.

Este programa lo puedes descargar en la zona de descargar previo registro de forma gratuita https://pasionelectronica.com/descargas-2/

/*AUTOR: JOSE ANTONIO RIVERA MORALES
 *FECHA: 16-1-2020
 *www.pasionelectronica.com
 * Este programa muestra en la linea
 * superior suscribete y a continuacion
 * www.pasionelectronica.com en la linea 
 * inferior usando una pantalla lcd1602 
 * con un adaptador I2C
 */
#include <Wire.h>//libreria que permite comunicacarnos
//con dispositivos I2C o TWI
#include <LiquidCrystal_I2C.h>//libreria I2C especifica
//para pantalla con adaptador I2C 
//Es necesario eliminar o cambiar de directorio
//la libreria liquidCristal ya que es incompatible
//tener las dos en el mismo directorio


LiquidCrystal_I2C lcd1602 (0x27, 16, 2);//dir de la pantalla 27hex
//16 columnas 2 filas

void setup(){
  Wire.begin();//comenzamos comunicacion i2c
  lcd1602.begin(16, 2);//conectamos con la pantalla

  lcd1602.clear();//la borramos xa asegurarnos que no salga nada anterior

  lcd1602.backlight();//encendemos retro-iluminacion
  
  
}

void loop(){
  lcd1602.setCursor(2,0);//posicionamos cursor tercera col primera fila
  //se empieza a contar desde cero
  
  lcd1602.print("suscribete a");//mostramos cadena suscribete
  
  delay(2000);//lo mantenemos dos segundos
  
  lcd1602.clear();//borramos la pantalla
  
  delay(1000);//esperamos para que de tiempo a borrar por seguridad
  
  lcd1602.setCursor(15,1);//posicionamos en la ultima columna segunda fila
  
  lcd1602.print("www.pasionelectronica.com");//mostramos por pantalla
  
  //bucle para desplazar a la izquierda la cadena que mostramos longitud cadena +
  //ancho de la pantalla
  for (int i=0;i<39;i++){  
  lcd1602.scrollDisplayLeft();//funcion que desplaza un lugar a la izquierda
  delay(500);//tiempo para que se desplaze a una velocidad que se lea bien
  }
  
  lcd1602.clear();//borramos pantalla
  
  delay(1000);//damos tiempo a que se borre por seguridad
  
}

Hay que bajar la librería liquidCristal_I2C e instalarla pero anteriormente debemos de mover la librería liquidCristal para que no estén en el mismo directorio library ya que dan problemas de incompatibilidad, aquí os dejo el enlace para descargarla

https://www.arduinolibraries.info/libraries/liquid-crystal-i2-c

Normalmente la dirección que trae de fábrica esta pantalla es la 27 en hexadecimal, si por algún casual no fuera os dejo un enlace a un sketch que escanea la dirección del dispositivo I2C en este caso la pantalla pero podría ser perfectamente un sensor por ejemplo https://playground.arduino.cc/Main/I2cScanner/