Display LCD cu interfata I2C

    Pentru a afisa anumite informatii din Arduino putem folosi un display LCD de tipul 16x02 (16 carcatere pe 2 randuri), 20x04 (20 caractere pe 4 randuri), 16x04 (16 caractere pe 2 randuri) si altele. La acest display vom conecta un modul adaptor facut cu circuitul integrat PCF8574T. Iar cu ajutorul acestui modul conectarea displayului la Arduino se realizeaza prin intermediul interfetei I2C, deci vom folosi doar 2 fire pentru conexiune (plus cele 2 fire pentru alimentare).
    Acest modul este cel din poza de mai jos:

    Pentru a putea folosi displayul impreuna cu acest modul I2C vom avea nevoie de o librarie externa. Aceasta librarie se numeste Arduino-LiquidCrystal-library si poate fi descarcata de aici:  https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library.


    Dupa ce descarcam aceasta librarie va trebui sa o instalam in Arduino IDE. Pentru a face acest lucru merge la meniul Schita > Incarcare biblioteca > Adauga biblioteca .zip. Se va deschide o fereastra in care vom cauta si de unde vom selecta libraria descarcata mai devreme. Daca libraria a fost instalata cu succes vom observa un mesaj in Arduino IDE.
    Inainte de a scrie cod pentru aceasta librarie va trebui sa verificam care este adresa I2C a modului atasat la displayul folosit. Pentru a face acest lucru va trebui sa incarcam un sketch existent deja in Arduino IDE. Pentru acest lucru mergem la Fisier > Exemple > Wire > i2c_scanner. Se va deschide o fereastra nou cu sketchul selectat, vom compila si incarca acest sketch in Arduino apoi vom deschide terminalul serial unde vom vedea adresa I2C a modulului. Rezultatul trebuie sa fie precum in poza de mai jos:

    Dupa ce cunoastem adresa I2C a modulului putem incepe sa scriem codul sursa necesar pentru a afisa diferite informatii pe display. Iar pentru inceput vom scrie urmatoarele linii de cod:
    Prima linie de cod este cea in care vom include libraria Wire:

#include <Wire.h> 

    In cea de-a doua linie de cod vom include libraria instalata de noi mai devreme:

#include <LiquidCrystal_I2C.h>

    In urmatoarea linie de cod vom initializa clasa librariei instalate unde vom adauga si 3 parametri: adresa I2C, numarul de carcatere de pe rand, numarul de randuri.

LiquidCrystal_I2C lcd(0x27, 16, 2);

Mai departe vom adauga cod in functia setup(). Prima linie pe care o vom scrie este linia de cod cu care vom initializa displayul:

lcd.begin();

    In a doua linie de cod vom seta pozitia cursorului unde avem 2 parametri: primul parametru inseamna pozitia cursorului pe rand (0 este primul caracter) iar al doilea parametru seteaza randul pe care se va afisa (0 este primul rand):

lcd.setCursor(0, 0);

    In a treia linie de cod vom afisa un mesaj pe display:

lcd.print("Hello world");

    In ultima linie de cod vom adauga o intarziere de 2 secunde inainte de a trece la executarea functiei loop():

delay(2000);

    Codul complet care va fi scris in interiorul functiei setup() este cel de mai jos:

void setup() {
	lcd.begin();
	lcd.setCursor(0, 0);
	lcd.print("Hello world");
	delay(2000);
}

    Daca rulam programul vom observa ca acesta va afisa un mesaj pe primul rand. Binenteles ca daca dorim putem afisa la pornirte un mesaj pe 2 randuri, tot ceea ce trebuie sa facem este sa mai adaugam, inca 2 linii de cod: prima linie de cod va seta cursorul pe randul 2 iar a doua linie de cod va afisa mesajul dorit.
    Dar sa continuam cu programul.

    In functia loop() vom adauga cod pentru fiecare functie pe care dorim sa o folosim cu acest display. Pentru a face acest lucru mai intai trebuie sa stergem displayul pentru a afisa noi informatii pe el. Iar acest lucru il vom face cu functia lcd.clear(). Dupa functia lcd.clear() nu este nevoie sa mai folosim si functia lcd.setCursor(0, 0) deoarece cursorul va fi pus in mod prestabilit in acea pozitie!

lcd.clear();

    Vom incepe sa testam cateva din functiile disponibile in aceasta librarie. Primele 2 functii pe care le vom testa sunt functiile cursor() si noCursor(). Asa cum observam si in nume cu prima functie vom afisa un cursor iar cu a doua functie nu se va afisa nimic. Pentru a testa aceste functii vom folosi codul de mai jos:

lcd.print("funct. cursor()");
lcd.setCursor(0, 1);
lcd.cursor();
lcd.print("test");
delay(2000);
lcd.noCursor();
delay(2000);

    Urmatoarele functii sunt functiile blink() si noBlink(). Aceste functii sunt similare cu cele de mai sus cu diferenta ca prima functie afisa doar o linie jos in locul cursorului pe cand aceasta functie afiseaza un dreptunghi. Pentru a testa aceasta functie vom folosi urmatorul cod:

lcd.clear();
lcd.print("funct. blink()");
lcd.setCursor(0, 1);
lcd.blink();
lcd.print("test");
delay(2000);
lcd.noBlink();
delay(2000);

    O alta functie interesanta este cea de noBacklight() (cu care vom opri iluminarea de fundal) si backlight() (se porneste iluminarea de fundal). Pentru a testa aceasta functie vom folosi urmatorul cod:

lcd.clear();
lcd.print("funct. backlight");
delay(2000);
lcd.noBacklight();
delay(2000);
lcd.backlight();
delay(2000);

    Codul sursa final al functie loop() este cel de mai jos:

void loop() {
  lcd.clear();
  lcd.print("funct. cursor()");
  lcd.setCursor(0, 1);
  lcd.cursor();
  lcd.print("test");
  delay(2000);
  lcd.noCursor();
  delay(2000);
  lcd.clear();
  lcd.print("funct. blink()");
  lcd.setCursor(0, 1);
  lcd.blink();
  lcd.print("test");
  delay(2000);
  lcd.noBlink();
  delay(2000);
  lcd.clear();
  lcd.print("funct. backlight");
  delay(2000);
  lcd.noBacklight();
  delay(2000);
  lcd.backlight();
  delay(2000);
}


    Sketchul cu aceste exemple este cel de mai jos:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
  lcd.begin();
  lcd.setCursor(0, 0);
  lcd.print("Hello world");
  delay(2000);
}

void loop() {
  lcd.clear();
  lcd.print("funct. cursor()");
  lcd.setCursor(0, 1);
  lcd.cursor();
  lcd.print("test");
  delay(2000);
  lcd.noCursor();
  delay(2000);
  lcd.clear();
  lcd.print("funct. blink()");
  lcd.setCursor(0, 1);
  lcd.blink();
  lcd.print("test");
  delay(2000);
  lcd.noBlink();
  delay(2000);
  lcd.clear();
  lcd.print("funct. backlight");
  delay(2000);
  lcd.noBacklight();
  delay(2000);
  lcd.backlight();
  delay(2000);
}

 

Crearea si afisare de caractere personalizate pe display.

    Pentru a crea un carcater personalizat va trebui sa declaram la inceput un array in care vom stoca iconita propriuzisa. Acest array va fi declarat inainte de functia setup() si are urmatoarea forma:

byte smyle[] = {
  B00000,
  B00000,
  B01010,
  B00000,
  B00000,
  B10001,
  B01110,
  B00000
};

    De asemenea in functia setup() va trebui sa creem caracterul pentru a-l putea folosi cu displayul nostru. Pentru acest lucru va trebui sa adaugam urmatoarea linie de cod, linie care contine 2 parametri: primul parametru este numarul caracterului iar al doilea parametru este numele acestui, nume declarat mai sus.

lcd.createChar(0, smyle);

    Codul complet al functie setup() este mai jos (cu cateva modificari):

void setup() {
  lcd.begin();
  lcd.createChar(0, smyle);
  lcd.setCursor(0, 0);
  lcd.print("Caractere pe");
  lcd.setCursor(4, 1);
  lcd.print("display LCD");
  delay(2000);
}

     Afisarea caracterului o putem face in functia loop() cu urmatorul cod:

 lcd.write(byte(0));

    Codul complet al functiei loop() este cel de mai jos:

void loop() {
  lcd.clear();
  lcd.print("Afisare caracter");
  lcd.setCursor(0,1);
  lcd.write(byte(0));
  delay(1000);
}


    Sketchul in forma finala pentru a testa afisarea caracterului este mai jos:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
byte smyle[] = {
  B00000,
  B00000,
  B01010,
  B00000,
  B00000,
  B10001,
  B01110,
  B00000
};

void setup() {
  lcd.begin();
  lcd.createChar(0, smyle);
  lcd.setCursor(0, 0);
  lcd.print("Caractere pe");
  lcd.setCursor(4, 1);
  lcd.print("display LCD");
  delay(2000);
}

void loop() {
  lcd.clear();
  lcd.print("Afisare caracter");
  lcd.setCursor(0,1);
  lcd.write(byte(0));
  delay(1000);
}

    Afisarea caracterelor se poate face si in interiorul functiei setup() daca dorim acest lucru!

 

Functia scroll

    O alta functie interesanta pe care o putem folosi este cea de scroll a unui text. Putem afisa un sir cu o lungime de maxim 40 de carcatere. Directia textului poate fi setata spre stanga sau spre dreapta, in functie de ce functie folosirm. Pentru a face acest lucru in functia setup() vom scrie acest cod:

void setup() {
  lcd.begin();
  lcd.setCursor(0, 0);
  lcd.print("Testare sir mai lung de caractere pe dis");
  delay(500);
}

    In functia loop() vom scrie functia pentru scroll care este de forma:

lcd.scrollDisplayLeft();

sau

lcd.scrollDisplayRight();

in functie de ce directie dorim pentru text.


    Sketchul in forma finala este acesta:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  lcd.begin();
  lcd.setCursor(0, 0);
  lcd.print("Testare sir mai lung de caractere pe dis");
  delay(500);
}

void loop() {
  lcd.scrollDisplayLeft();
  delay(500);
}

Un filmulet cu cele 3 exemple se poate vedea aici:

Nu sunt comentarii in “Display LCD cu interfata I2C”

Lasa un comentariu

Raspuns lui Some User

Autentificare