Arduino LCD Shield je rozšiřovací modul pro desky formátu Arduino UNO. Tento shield obsahuje LCD displej o velikosti 16x2 znaky a 5 ovládacích tlačítek. Šesté tlačítko pak slouží pro reset Arduina.
LCD displej je zapojený přes paralelní sběrnici, díky čemuž zabírá šest digitálních pinů pro komunikaci a jeden pin pro řízení osvětlení. Jeho řídící obvod je rozšířený typ HD44780. Tlačítka jsou zapojena naopak úsporným způsobem, díky čemuž zabírají pouze jeden analogový pin. Posledním ovládacím prvkem na modulu je trimr, který slouží k nastavení kontrastu displeje.
Pro úspěšné zapojení LCD shieldu ho stačí zapojit do desky Arduino UNO či jiné kompatibilní.
Pokud byste ale chtěli využít společně s tímto shieldem ještě nějaký jiný, tak počítejte s tím, že tento shield zabírá piny digitální piny D4-D10 a analogový pin A0. Zapojení tlačítek spočívá ve využití odporového děliče, jak si můžete všimnout na obrázku níže. Bohužel ale díky tomu nelze smysluplně detekovat stisk více jak jednoho tlačítka najednou.
Ukázkový kód využívá v Arduino IDE vestavěnou knihovnu LiquidCrystal, takže byste s jeho nahráním neměli mít problémy.
Ukázkový kód obsahuje na svém začátku připojení zmíněné knihovny a inicializaci připojeného displeje společně s vytvořením definice pinu pro řízení osvětlení.
Podprogram setup v prvním kroku zahájí komunikaci s připojeným displejem a poté nastaví řídící pin osvětlení jako výstupní.
V prvním kroku nekonečné smyčky loop načteme údaje z analogového pinu do proměnné a poté zapneme osvětlení displeje. V dalších krocích vidíte princip práce s displejem, kdy vždy nejprve nastavíme kurzor na danou souřadnici, kde první číslo odpovídá pozici znaku a druhé zvolenému řádku. Je ale nutné myslet na to, že číslování začíná od nuly v obou případech, proto tedy první znak na prvním řádku odpovídá souřadnici (0,0) a poslední znak na druhém řádku souřadnici (15, 1). My tedy nejprve nastavíme kurzor na začátek prvního řádku a zde vytiskneme text „Stisknuto:“. Můžete si všimnout, že v kódu mám vyplněné také mezery do konce řádku. Toto chování jsem použil proto, abych v dalším příkazu mohl na konec řádku vytisknout načtenou analogovou hodnotu. A protože nemažu celý displej, tak by mi při změně na menší číslo zůstávaly znaky na displeji.
Po vytištění uvedeného čísla se přesuneme na druhý řádek a zde vytiskneme text, který získáme zavoláním funkce nactiTlacitka.
Tato funkce se nachází pod smyčkou loop a z načtené hodnoty analog pomocí podmínek if dekódujeme, jaké tlačítko bylo stisknuto. Můžete si všimnout, že všechny podmínky nejsou na přesně danou hodnotu, ale na určitý rozsah. Použité rezistory na shieldu totiž nejsou nijak teplotně kompenzované, a proto by se mohlo stát, že by nebyla detekce tlačítek spolehlivá. A také se může stát, že Váš shield může mít lehce odlišné hodnoty pro daná tlačítka. Vám pak stačí pouze zkontrolovat analogovou hodnotu na displeji a podle ní upravit příslušné podmínky v programu.
Poté, co zjistíme z načtené hodnoty, jaké tlačítko je stisknuté, tak do výstupní textové proměnné uložíme příslušný popis. A opět si můžete všimnout, že u podmínky pro žádné stisknuté tlačítko bude vytištěno několik mezer pro vymazání obsahu daného řádku displeje.
Po vytištění textu na druhý řádek si pro efekt řízení podsvícení nastavíme nejdříve delší pauzu, po které vypneme osvětlení displeje a před koncem smyčky vyčkáme kratší čas.
// Arduino LCD 16x2 Shield // připojení knihovny #include <LiquidCrystal.h> // inicializace LCD displeje LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // nastavení čísla propojovacího pinu // pro osvětlení LCD displeje #define lcdSvit 10 void setup() { // zahájení komunikace s displejem, // 16 znaků, 2 řádky lcd.begin(16, 2); // nastavení pinu pro řízení osvětlení jako výstupu pinMode(lcdSvit, OUTPUT); } void loop() { // načtení údajů z analogového pinu A0 do proměnné int analogData = analogRead(0); // zapnutí osvětlení displeje digitalWrite(lcdSvit, HIGH); // nastavení výpisu na první znak, první řádek lcd.setCursor(0, 0); // vytištění textu na displej lcd.print("Stisknuto: "); // nastavení výpisu na třináctý znak, první řádek lcd.setCursor(12, 0); // vytištění textu na displej lcd.print(analogData); // nastavení výpisu na třetí znak, druhý řádek lcd.setCursor(2, 1); // vytištění textu na displej pomocí zavolání funkce // s předáním aktuálně změřené hodnoty na vstupu lcd.print(nactiTlacitka(analogData)); // pauza pro přečtení údajů na displeji delay(1000); // vypnutí osvětlení displeje digitalWrite(lcdSvit, LOW); // pauza před koncem smyčky delay(100); } String nactiTlacitka(int analog) { // proměnná pro uložení textu pro výpis String text; // postupná kontrola pomocí podmínek if, // pro každé tlačítko je uveden rozsah hodnot, // ve kterých je detekováno a poté nastaven text na výstup if (analog < 50) text = "Vpravo(RIGHT)"; if ((analog > 700) && (analog < 1024)) text = " "; if ( (analog > 95) && (analog < 150) ) text = "Nahoru(UP)"; if ( (analog > 250) && (analog < 350) ) text = "Dolu(DOWN)"; if ( (analog > 400) && (analog < 500) ) text = "Vlevo(LEFT)"; if ( (analog > 600) && (analog < 750) ) text = "Vyber(SELECT)"; // vrácení textu jako výstup funkce return text; }
Po nahrání ukázkového kódu do Arduino desky s připojeným LCD shieldem můžeme pozorovat například tento výsledek:
Arduino LCD Shield je zajímavým modulem, který bych doporučil hlavně začátečníkům, kdy si mohou vyzkoušet jak řízení malého displeje, tak i práci s tlačítky s jiným přístupem, než je běžné. Jak si můžete všimnout na shieldu, tak pokud byste chtěli zapojit ještě něco jiného na zbylé piny, tak můžete buď použít nějaký propojovací shield jako mezičlen anebo využít pájecí pokovené otvory u volných pinů. Tento shield pak může sloužit nejen pro testování a hraní, ale také pro hotová zařízení. Díky displeji a 5 funkčním tlačítkům s ním pak můžeme vytvořit ovládací panel pro různé projekty.
Seznam použitých komponent:
https://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html
https://dratek.cz/arduino/899-arduino-lcd-shield-1420670167.html