
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.
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:
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:
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 }