Ak ste si prečítali prvú časť článku už viete čo to o LCD displejoch. Druhá časť článku bude praktická, ukážeme si ako zapojiť LCD displej k Arduinu a napíšeme zopár jednoduchých sketchov.

Príklad č. 1 - základné zapojenie

Takéto zapojenie LCD displeja môžeme nazvať aj ako základné. Použijeme 4 bitový mód, tzn. dáta nám budú "prúdiť" po štyroch vodičoch od vývodov DB4DB7. RS vývod zapojíme na vývod D12 na Arduinu. Vývod EN zase na vývod D11, celkovo nám teda LCD displej zaberie 6 vývodov na Arduine, takže ešte máme dostatok voľných na zapojenie ďalších súčiastok, ak budeme potrebovať. Ešte nás môže zaujímať trimer R1, ktorým vieme nastaviť kontrast LCD displeja, jeho hodnota býva 10kOhm.

Krátky rozpis toho, čo budeme potrebovať:

  • 1x Arduino UNO R3 alebo jeho kompatibilný klon
  • 1x alfanumerický LCD displej 16x2
  • 1x trimer 10kOhm
  • Kontaktné pole a prepojovacie káble

Zapojenie na kontaktnom poli

Schéma zapojenia

Zdrojový kód

Zdrojový kód v súbore ino Priklad1.ino
#include <LiquidCrystal.h>

#define LCD_RS_PIN 12
#define LCD_EN_PIN 11
#define LCD_D4_PIN 5
#define LCD_D5_PIN 4
#define LCD_D6_PIN 3
#define LCD_D7_PIN 2

LiquidCrystal lcd(
  LCD_RS_PIN, 
  LCD_EN_PIN, 
  LCD_D4_PIN, 
  LCD_D5_PIN, 
  LCD_D6_PIN, 
  LCD_D7_PIN
);

void setup()
{
  lcd.begin(16, 2);
  lcd.print("Be Cool !");
}

void loop()
{
}

Popis zdrojového kódu

Týchto pár riadkov nám stačí na to aby sme na displeji zobrazili nejaký text. Popíšeme si teda v krátkosti niektoré riadky kódu.

Na riadku 1 je vložená knižnica LiquidCrystal, ktorá nám zabezpečuje elegantné používanie displeja. Nemusíme riešiť rôzne nízkoúrovňové príkazy a inštrukcie - toto všetko robí za nás táto knižnica. Vlastne celý tento článok bude o nej, popíšeme si jej funkcie, aby sme ju vedeli správne používať.

V riadkoch 3 až 8 máme zadefinované konštanty alebo zástupné znaky vývodou použitých na komunikáciu s LCD displejom. Použili sme na to direktívu define.

Na riadkoch 10 až 17 máme inicializovanú knižnicu LiquidCrystal. Vytvorili sme vlastne inštanciu jedinej (rovnomennej) triedy, ktorá sa nachádza v knižnici. Do konštruktora sme vložili čísla vývodov vo forme zástupných znakov.

V setup metóde voláme na objekte lcd, metódu begin s dvoma číselnými parametrami 16 a 2. Metóda begin nám nastaví stĺpce (prvý parameter = 16) a riadky (druhý parameter = 2) displeja, ktorý sme pripojili k Arduinu. V ďalšom riadku voláme metódu print s parametrom "Be Cool !". Zavolaním tejto metódy sa nám vypíšu znaky na displeji.

Príklad č. 2 - metóda setCursor a clear

V tomto príklade si ukážeme ako správne použiť metódu setCursor triedy LiquidCrystal. Vložte nasledujúci kód do vývojového prostredia pre Arduino a výsledok by mal byť rovnaký ako môžete vidieť vo videu vpravo.

Zdrojový kód

Zdrojový kód v súbore ino Priklad2.ino
#include <LiquidCrystal.h>

#define LCD_RS_PIN 12
#define LCD_EN_PIN 11
#define LCD_D4_PIN 5
#define LCD_D5_PIN 4
#define LCD_D6_PIN 3
#define LCD_D7_PIN 2

LiquidCrystal lcd(
  LCD_RS_PIN, 
  LCD_EN_PIN, 
  LCD_D4_PIN, 
  LCD_D5_PIN, 
  LCD_D6_PIN, 
  LCD_D7_PIN
);

void setup()
{
  lcd.begin(16, 2);
}

void loop()
{
  int row = random(0, 2); //min 0, max 1
  int column = random(0, 16);//min 0, max 15
  lcd.setCursor(column, row);
  lcd.print("Be Cool !");
  delay(1000);
  lcd.clear();
}

Popis zdrojového kódu

Zdrojový kód sa nám zmenil od predošlého tým, že sme odstránili jeden riadok z metódy setup. Do loop metódy sme ich zase zopár pridali.

Na riadkoch 26 a 27 voláme metódu random(min, max), ktorá má dva vstupné parametre typu int. Táto metóda vracia náhodné číslo v intervale podľa týchto vstupných parametrov. V našom prípade máme nastavené:

  int row = random(0, 2); //min 0, max 1

Čiže premenná row bude nadobúdať hodnoty 0 a 1 (nie 0 až 2). V druhom prípade to budú celé čísla 015 pre premennú column.

V nasledujúcom riadku voláme metódu lcd.setCursor(col, row) do ktorej vkladáme vygenerované hodnoty premenných column a row ako vstupné parametre.

lcd.setCursor(column, row);

Nastavíme, tak pozíciu kurzora, kde začneme vypisovať text "Be Cool !" (viď riadok 29). Text sa zobrazí na dobu 1 sekundy, pretože máme nastavené oneskorenie metódou delay. Po uplynutí tohto času sa displej "vyčistí" volaním metódy lcd.clear(). Celý cyklus sa následne opakuje. Výsledkom je, že text "Be Cool !" mení svoju pozíciu na displeji každú sekundu :).

Príklad č. 3 - čo tak si vytvoriť špeciálny znak

Zapojenie nám opäť ostáva rovnaké. Upravíme len program. Pozrite si video, aby ste vedeli aký má byť správny výsledok po skompilovaní a nahratí nasledujúceho kódu.

Nástroj na vytváranie špeciálnych znakov

Na vytvorenie špeciálne znaku môžeme využiť nástroj na stránke http://www.quinapalus.com/hd44780udg.html. Budeme postupovať nasledovne:

  1. Vyberieme veľkosť znaku 5x8.
  2. V ďalšom kroku máme na výber, buď si vyberieme z niektorých preddefinovaných znakov alebo si "naklikáme" znak aký chceme. Je to jednoduché stačí kliknúť na štvorec, ktorý sa zmení na čierny - tzn. na displeji sa nám vysvieti (na bielo alebo čierno - záleží na od typu displeja.
  3. V poslednom kroku skopírujeme čísla v riadku "In hex".

V tomto príklade som zvolil výber z preddefinovaných znakov viď obrázok vpravo.

Zdrojový kód

Zdrojový kód v súbore ino Priklad3.ino
#include <LiquidCrystal.h>

#define LCD_RS_PIN 12
#define LCD_EN_PIN 11
#define LCD_D4_PIN 5
#define LCD_D5_PIN 4
#define LCD_D6_PIN 3
#define LCD_D7_PIN 2

byte triangleRight[8] = {
  0x8,0xc,0xa,0x9,0xa,0xc,0x8,0x0
};
byte triangleLeft[8] = {
  0x2,0x6,0xa,0x12,0xa,0x6,0x2,0x0
};

LiquidCrystal lcd(
  LCD_RS_PIN, 
  LCD_EN_PIN, 
  LCD_D4_PIN, 
  LCD_D5_PIN, 
  LCD_D6_PIN, 
  LCD_D7_PIN
);

void setup()
{
  lcd.createChar(0, triangleRight);
  lcd.createChar(1, triangleLeft);
  lcd.begin(16, 2);
  
  lcd.write(byte(0));
  lcd.print("Be Cool !");
  lcd.write(byte(1));
}

void loop()
{
  lcd.noDisplay();
  delay(500);
  lcd.display();
  delay(500);
}

Popis zdrojového kódu

Ako je vidieť vľavo v kóde pridali sme dve polia bytov (viď riadky 10 až 15). Každé jedno pole je teda náš špeciálny znak = je to vlastne definícia alebo nastavenie, ktoré "štvorčeky" budú svietiť a ktoré nie.

byte triangleRight[8] = {
  0x8,0xc,0xa,0x9,0xa,0xc,0x8,0x0
};

Každý jeden prvok v poli predstavuje jeden riadok vo vzore alebo mriežke. Máme veľkosť mriežky 5 x 8 bodov, tzn. 8 riadkov = 8 prvkov v poli bytov, každý prvok môže nadobúdať hodnoty 0 až 2^5 - 1 alebo 0x1f v hex tvare (alebo 31 v desiatkovej sústave).

V setup metóde voláme dvakrát metódu lcd.createChar(uint8_t, uint8_t[]) na riadkoch 28 a 29. Zavolaním tejto metódy zapíšeme našu definíciu znaku do pamäte CGRAM. Táto metóda má dva parametre, prvý parameter je typu uint8_t (môžeme ho nazvať aj byte) a predstavuje adresu nášho znaku v pamäti CGRAM. Pri prvom volaní máme adresu rovnú 0, pri druhom 1 (jej max. hodnota môže byť 7, viď časť 1.). Druhý parameter je typu uint8_t[], teda pole bytov, toto pole je vlastne definícia znaku, ktorú sme si vopred pripravili.

Na riadkoch 32 a 34 voláme metódu lcd.write(uint8_t). Táto metóda nám vypíše znak, ktorého adresu vložíme ako vstupný parameter. Táto adresa môže nadobúdať hodnoty viď ASCII tabuľka v časti 1. Čiže ak do nej vložíme adresu s hodnotou 0 alebo 1 vypíše sa znak, ktorý sme si predtým uložili do pamäte CGRAM (pod touto adresou).

V loop metóde máme použité metódy lcd.display() a lcd.noDisplay(). Metóda noDisplay vypne displej ale nevymaže text, ktorý sa na ňom zobrazuje. A ako už asi tušíte metóda display zapne displej späť a text uvidíme rovnako ako predtým. Medzi volaním týchto metód máme nastavené oneskorenie čo nám spôsoby blikanie textu na displeji.

Koniec

Je tu koniec druhej (a zatiaľ poslednej) časti článku. Naučili sme sa pripojiť LCD displej k Arduinu a vieme ho aj používať. LCD displej ovládame pomocou knižnice LiquidCrystal, ktorá obsahuje všetky potrebné funkcie na to aby sa nám s takýmto displejom pracovalo skvele :). Čo ďalej ? Vyskúšajte si tieto príklady a ak budete mať nejaké problémy alebo otázky na túto tému kľudne napíšte do komentára, rád vám poradím.