Lekce 8 - Arduino - LCD displej a jeho programování
V minulé lekci, Arduino - Membránová klávesnice a její programování, jsme se seznámili s membránovou klávesnicí a uvedli jsme si dva příklady jejího použití.
V dnešní lekci našeho Arduino tutoriálu si ukážeme, jak správně zapojit a naprogramovat další Arduino komponentu, a to LCD displej. Stejně jako u ostatních projektů si nejdříve vysvětlíme, jak LCD displej v Arduinu funguje. V pokročilejším příkladu si jej pak propojíme s dalšími komponentami a vytvoříme si projekt.
LCD displej
LCD (Liquid-crystal display) u Arduina slouží jako zobrazovací jednotka. Jeho napájení je 5 V a díky I2C redukci má pouhé čtyři piny. Bez redukce jich má mnohem více a je proto složitější ho jak zapojit, tak naprogramovat. My máme I2C redukci zapojenou přímo na displeji, pokud vám na LCD displeji chybí, doporučujeme si ji dokoupit a k displeji připojit.
Pojďme se podívat na samotnou konfiguraci LCD displeje a ukažme si nejprve základní využití LCD displeje.
Seznam součástek
Na sestavení našeho jednoduchého obvodu budeme potřebovat jen následující součástky:
- Arduino,
- LCD displej a
- propojovací kabely.
Jak už je zvykem, je náš projekt realizován v rozhraní Tinkercad. Projekt je samozřejmě možné vytvořit také s reálnými součástkami, funkčnost se nijak nemění.
Zapojení LCD displeje
Když máme součástky připraveny, můžeme se pustit do zapojení LCD displeje. Jak již bylo zmíněno, z I2C redukce nám vedou pouhé čtyři piny, těmi jsou VCC, GND, SDA a SCL. Začneme tím jednodušším, tedy VCC a GND. Náš VCC pin zapojíme do 5V pinu Arduina a GND pin do GND pinu Arduina.
Zbývá tedy SDA a SCL. Tyto piny jsou na Arduinu přímo vyznačeny stejnojmennými názvy. Pokud máte například Arduino Mega, jsou dvojice SDA a SCL pinů dvě, skrývají se také na pinech 20 a 21. Proto doporučujeme zjistit, kolik dvojic I2C pinů se nachází na vašem Arduinu, stejně jako jejich umístění. SDA pin LCD tedy zapojíme do SDA Arduina a SCL pin pak obvykle bývá hned vedle SDA pinu. Finální zapojení vypadá následovně:

Programování LCD displeje
Zapojení jsme zvládli bez problémů, je tedy načase se pustit do úplně prvního kódu LCD displeje. Jdeme na to.
Hlavička programu bude celkem jednoduchá, vzápětí si ji popíšeme:
#include <Adafruit_LiquidCrystal.h> int pocet_vypsani = 0; Adafruit_LiquidCrystal LCD(0);
Než začneme dělat cokoliv jiného, musíme do programu vložit knihovnu,
která podporuje funkce LCD displeje. Tato knihovna se jmenuje
Adafruit_LiquidCrystal
. Knihovnu přidáme příkazem
#include <Adafruit_LiquidCrystal.h>
a můžeme se posunout
dále.
Pokud projekt děláte v reálu, můžete si ji jednoduše stáhnout v manažeru knihoven.
Dále si vytvoříme proměnnou datového typu int
, do které
budeme ukládat počet vypsání na displeji. Tuto proměnnou si budeme později
zvyšovat, aby nám displej v cyklu vypisoval kontinuální řadu celých
čísel.
Nakonec si musíme ještě definovat I2C adresu displeje, použijeme příkaz
Adafruit_LiquidCrystal LCD()
. Protože projekt děláme ve
virtuálním prostředí, dáme do argumentu funkce LCD()
hodnotu
0
, jelikož virtuální LCD displej nemá svou adresu.
Jestliže projekt tvoříte v reálné podobě, do argumentu
definice adresy napíšete reálnou adresu vašeho LCD displeje. Většinou to
bývá hodnota 0x27
, ale může se pro každý displej lišit.
LCD displej poté inicializujeme ve funkci setup()
:
void setup() { LCD.begin(16, 2); LCD.print("Hello world!"); }
Použijeme příkaz LCD.begin()
, do jehož argumentu přijdou
dva parametry pro určení délky řádku a výšky sloupce. Náš displej je
velký 16x2, čemuž odpovídají zadané hodnoty. Pro nás to znamená, že
16x2 displej dokáže najednou zobrazit až 32 znaků, častá je také varianta
20x4, kde můžeme zobrazit až 80 znaků.
Někdy se můžeme setkat s také s příkazem
LCD.init()
, což je alternativa příkazu LCD.begin()
,
rozdíl mezi nimi spočívá v použité knihovně.
Abychom se ujistili, že displej opravdu funguje, vypíšeme si na displej
pomocí příkazu LCD.print()
ještě ikonickou hlášku Hello
world!.
Hlavní smyčka
Nyní se můžeme přesunout do funkce loop()
. Tam doplníme
následující kód:
void loop() { LCD.setCursor(0, 1); LCD.print(pocet_vypsani); LCD.setBacklight(1); delay(500); LCD.setBacklight(0); delay(500); pocet_vypsani++; }
Jako první hned užijeme příkazu LCD.setCursor()
, který nám
určuje, kam chceme začít vypisovat znaky. V argumentu přijímá dva
parametry, a to pozici řádku a pozici sloupce. Obrazovku displeje si tedy ti
kreativnější z nás mohou představit jako takové 2D pole.
Když máme nastavenou pozici, můžeme vypsat naší proměnnou na displej,
které jsme v hlavičce nastavili hodnotu 0
. Text je vypsán, ale
není moc dobře vidět, to proto, že ještě nemáme zapnuté podsvícení
displeje. To provedeme příkazem LCD.setBacklight()
, kterému
zadáme v argumentu hodnotu 1
pro zapnutí, nebo hodnotu
0
pro vypnutí podsvícení.
Poté přidáme krátkou prodlevu a podsvícení zase zhasneme. Počkáme další půl sekundu a nakonec inkrementujeme naší proměnnou. Cyklus se bude opakovat nadále a náš LCD displej bude vypisovat číselnou řadu.
Kombinace displeje a tlačítka
Když jsme si úspěšně zapojili náš LCD displej, co takhle si otestovat jeho kompatibilitu s nějakou další komponentou, třeba tlačítkem? Jdeme to zkusit.
Seznam součástek
Tentokrát budeme potřebovat tyto součástky:
- Arduino,
- LCD displej,
- tlačítko,
- rezistor 1 [kΩ],
- Arduino kabely a
- nepájivé pole
Zapojení LCD displeje a tlačítka
Ponecháme si naše předešlé zapojení Arduina a LCD displeje a přidáme si navíc tlačítko:

Jak můžeme vidět, zapojení zůstalo vesměs stejné, jedinou změnou je přidání tlačítka, které je zapojeno přes rezistor 1 [kΩ]. Jako pin tlačítka jsme použili digitální PWM pin 3, ale fungovat bude libovolný pin. Jdeme se tedy přesunout ke kódu.
Programování LCD displeje a tlačítka
V pokročilém příkladu budeme vycházet z kódu našeho prvního projektu, který si lehce doplníme a upravíme.
Do hlavičky přidáme definici tlačítka a protože použijeme tlačítko, nezapomeneme ošetřit zákmity. Doplníme tedy i potřebné proměnné:
#include <Adafruit_LiquidCrystal.h> #define TLACITKO 3 int pocet_vypsani, doba_stisku, limit = 25; unsigned long casomira; Adafruit_LiquidCrystal LCD(0);
Poté spolu s LCD displejem inicializujeme také tlačítko, které
nastavíme na INPUT
:
void setup() { pinMode(TLACITKO, INPUT); LCD.setBacklight(1); LCD.begin(16, 2); LCD.print("Hello world!"); }
Protože v hlavní smyčce již nebudeme displej zhasínat, nechali jsme ho rozsvítit už při inicializaci.
V hlavní smyčce voláme funkci millis()
a hodnoty ukládáme
do proměnné casomira
. Pak nastavíme pozici kurzoru a vypíšeme
aktuální hodnotu proměnné pocet_vypsani
:
void loop() { casomira = millis(); LCD.setCursor(0, 1); LCD.print(pocet_vypsani); while (!digitalRead(TLACITKO)) { doba_stisku = millis() - casomira; } if (doba_stisku >= limit) { pocet_vypsani++; doba_stisku = 0; } }
While
cyklem a následnou podmínkou ošetřujeme použití
tlačítka, jak jsme si ukazovali v lekci Pokročilá
práce s tlačítky.
Pokud bylo tlačítko stisknuto, zvýšíme naši proměnnou a nezapomeneme
vynulovat pomocnou proměnnou doba_stisku
. Takto jednoduše jsme
zařídili navýšení proměnné o 1
, kdykoli stiskneme
tlačítko.
Máme hotovo! Program můžeme spustit a otestovat.
Zájemci si mohou projekt rozšířit o další funkcionalitu, kterou jsme si ukazovali v již zmíněné lekci a implementovat si například skokové navýšení hodnoty v případě delšího stisku tlačítka.
V dalším dílu, Arduino - Sedmisegmentový displej a pole, si představíme sedmisegmentový displej, ukážeme si jeho zapojení a nakonec si ho i naprogramujeme s využitím pole.