LCD a través d'I2C

LCD a través d’I2C

Les LCD (pantalles de cristall líquid) són genials com a visualitzadors en els nostres projectes amb Arduino, però calen molts pins de connexió amb la placa i de vegades no en tenim prous o ens liem amb tants cables [veure entrada relacionada].
Per solucionar aquest problema podem connectar-les a través d’un mòdul I2C.

LCD-I2C_022

I2C és un bus de comunicació que transmet la informació a través de només dues línies: una per les dades (SDA) i l’altre pel senyal del rellotge (SDL). A més, li cal alimentació a través dels pins GND i VCC. Amb només 4 cables tenim la connexió solucionada!
Això sí, els pins del mòdul han d’estar connectats als de la LCD. Jo ho he fet a través d’una protoboard, però també es poden soldar per la part de sota de la pantalla:

LCD_I2C_03


Connexió a Arduino

Els pins als quals està associat el bus I2C depenen del model de placa:
SDA (dades): Arduino UNO*, Nano: al pin analògic A4 – Mega: al pin digital 20.
SCL (rellotge): Arduino UNO*, Nano: al pin analògic A5 – Mega: al pin digital 21.
VCC i GND (alimentació): als pins corresponents de la placa.

La regulació del contrast de la pantalla es realitza amb el potènciòmetre del mòdul I2C.

* Certs models de plaques Arduino UNO, a més de l’A4 i l’A5 tenen dos pins específics per la comunicació I2C. Es troben a l’extrem esquerre de la fila de pins digitals i estan indicats a la part de sota de la placa: SCL a l’esquerra i SDA a la dreta:

LCD-I2C

Pautes de programació

Llibreries
Per utilitzar el bus I2C cal incloure als programes la llibreria Wire, inclosa en l’IDE.
També ens cal la llibreria LiquidCrystal_I2C, no inclosa en l’IDE. Podem instal·lar-la des del gestor de llibreries de l’IDE (Programa / Incluir libreria / Gestionar librerias), o descarregar-la des de la web d’Arduino.

Adreça del dispositiu
Amb un únic bus I2C es pot accedir fins a 112 dispositius diferents, especificant la seva adreça, que és única per a cada un. L’adreça per defecte de les pantalles LCD que utilitzem sol ser 0x27, però com que la seva procedència sol ser dubtosa, és millor comprovar-la executant l’sketch i2c_scanner.
Aquest sketch escombra totes les possibles adreces del bus i si troba un dispositiu, mostra el resultat pel monitor sèrie:

Primer programa: Hola Món

L’execució d’aquest programa ha de mostrar el text “LCD-I2C OK!” en la fila superior de la LCD de manera parpellejant:

#include <Wire.h>               // llibreria per la comunicació I2C
#include <LiquidCrystal_I2C.h>  // llibreria per al control de la LCD amb I2C
 
// Configuració de la nostra LCD:
// nom: lcd (el que vulguem)
// adreça del dispositiu: 0x27
// núm de columnes (16) i de files (2) de la LCD
LiquidCrystal_I2C lcd (0x27, 16, 2);
 
void setup()
{
  lcd.init();       // inicialització de la LCD, a la que hem anomenant lcd
  lcd.backlight();  // encén la llum de fons de la LCD
}
 
void loop() 
{
  lcd.setCursor(0, 0);       // posició del cursor: 1a columna, 1a fila
  lcd.print("LCD-I2C OK!");  // text a mostrar
  delay (2000);              // mostra el text durant 2 segons
  lcd.clear();               // esborra la pantalla ...
  delay (1000);              // durant 1 segon abans de tornar a mostrar altre cop el text
}

Scroll

Amb les funcions nom.scrollDisplayLeft(); i nom.scrollDisplayRight(); podem moure un text per la pantalla cap a l’esquerra o cap a la dreta.
Per indicar el nombre de posicions que volem moure el text necessitem un bucle for. 

* Per simplificar, com que la primera part del programa és la mateixa que abans, només es mostra el loop.

void loop() 
{
  lcd.setCursor(0,0);        // posició inicial del cursor
  lcd.print("LCD-I2C OK!");  // text a mostrar (11 caracters)
  delay(2000);

  // mou el text cap a l'esquerra fins que desapareixi (repeteix 11 vegades ...)
  for (int x=0; x<11; x++)  
  {  
    lcd.scrollDisplayLeft();      
    delay(150);  // aquest delay defineix la velocitat de l'scroll
  }
  delay(1000);

  // scroll 27 posicions cap a la dreta (11 del text + 16 de la pantalla)
  for (int x=0; x<27; x++)  
  { 
    lcd.scrollDisplayRight();
    delay(150);
  }
  delay(1000);
  
  lcd.clear();  // esborra la pantalla abans de tornar a començar
}