LCD displej – další fígle

V předchozí kapitolce jsem nakousl téma LCD displejů a jejich využití. Řekli jsme si o znakových displejích, jejich typech (rozměry 16 znaků na 2 řádky a 20 znaků na 4 řádky) a zmínili se i o rozdílném přenosu dat – klasicky/I2C sběrnice. Ukázali jsme si i několik základních programů pro obě verze zapojení. Pro další zjednodušení budou všechna zapojení v této lekci dále pouze s pomocí I2C sběrnice/zapojení/programu. Tento typ displeje je pohodlnější pro ovládání a je také novějším typem v nabídce, takže doufám, že nebudu muset tuto lekci tak brzy předělávat. Všechny tři projekty v této kapitolce jsou při drobných úpravách snadno předělatelné na klasickou verzi displeje.

LCD displej – rolující text

lcd-16x2-i2c
lcd-16×2-i2c – základní zapojení

Pro tento projekt nebudete potřebovat více součástek, než je na zapojení na obrázku. Tato ukázka slouží pouze jako demonstrace a je na vás, jak ji využijete při náročnějších projektech. Zde naleznete video s výsledným efektem.

Knihovna LiquidCrystal_I2C.h nabízí mnohem více různých funkcí než prosté zobrazení textu. Podrobněji je naleznete třeba zde v popisku příkazů knihovny LiquidCrystal_I2C.h. Naleznete zde metody pro blikající texty (metoda Blink) a další zajímavé vychytávky. Jednou z nich je metoda scrollDisplayLeft(), nebo scrollDisplayRight() (podle toho zda potřebujete rolovat text zprava doleva, nebo naopak). Příklad použítí této metody naleznete v následujícím programu.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.init();
//inicializace displeje
lcd.backlight(); //aktivace podsvícení
lcd.setCursor(16, 0); //umístění začátku zobrazovaného textu (mimo displej)
lcd.print(„navstivte ondranauci.cz“); //zobrazovaný text
}
void loop() {
lcd.scrollDisplayLeft();
//rolování displeje zleva doprava
delay(500); //interval pro posun textu o jedno místo
}
Kód programu pro zobrazení rolujícího textu na displeji

LCD displej – víceřádkový text se svislým posunem

Následující projekt je jednak ukázkou jak může arduino s displejem reagovat na stisk tlačítka a také rovnou této možnosti využijeme k zobrazování textu, který obsahuje více řádků, než kolik má LCD displej fyzicky k dispozici. Jistě si sami dokážete domyslet na co by se dal podobný projekt využít.

Oproti předchozímu projektu doplníme celý obvod o dvě tlačítka fungující pro svislý posun textu – klasické up a down. Obě tlačítka připojíme na piny 2 a 3.

zapojení lcd 16×2 i2c se dvěma tlačítky

Celou sestavu pak doplníme následujícím programem. V sekci loop, jak při prostudování následujícího kódu zjistíte, se nachází dva podmínkové stromy. V prvém z nich se mění hodnota proměnné line (zobrazení zvolených dvou řádků) v závislosti na stisku tlačítka uživatelem. Hodnota line má stanovené i meze na začátku a konci (hodnota line nesmí být menší než 0 a větší než 3). Jinými slovy při použití následujícího programu zobrazíte pouze čtyři varianty zobrazení (0-3). Výsledek tohoto projektu naleznete zde.

Další podmínkový strom pak již jen definuje co vlastně při každé variantě proměnné line bude zobrazeno.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
// inicializace displeje
int line = 0; //číslo displeje
int button1 = 0; //tlačítko down
int button2 = 0; //tlačítko up
void setup()
{
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
}
void loop()
{

/* čtení pinů s tlačítky */
button1=digitalRead(2);
button2=digitalRead(3);

/*Podmínka ošetřující posuv menu směrem dolů*/
if (button1==0)
{
line=line+1;
if (line>3)
//pokud je hodnota line vyšší než 3
{
line=3;
}
}
else
{
button1=0;
}

/*Podmínka ošetřující posuv menu směrem nahoru*/
if (button2==0)
{
line=line-1;
if (line<0)
//pokud hodnota line klesne pod 0
{
line=0;
}
}
else
{
button2=0;
}


lcd.init();
// inicializace lcd
lcd.backlight(); // aktivace podsvícení
if (line==0) //displej 0
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print(„prvni radek“);
lcd.setCursor(1,1);
lcd.print(„druhy radek“);
}
else if (line==1)
//displej 1
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print(„druhy radek“);
lcd.setCursor(1,1);
lcd.print(„treti radek“);
}
else if (line==2)
//displej 2
{
lcd.setCursor(1,0);
lcd.print(„treti radek“);
lcd.setCursor(1,1);
lcd.print(„ctvrty radek“);
}
else if (line==3)
//displej 3
{
lcd.setCursor(1,0);
lcd.print(„ctvrty radek“);
lcd.setCursor(1,1);
lcd.print(„paty radek“);
}
Kód programu pro zobrazení pěti řádků textu na dvouřádkovém displeji

LCD displej – zobrazení vlastních znaků

Pro tento velmi zajímavý projekt použijeme stejné zapojení, jako v případě prvního projektu z této lekce, tedy arduino a displej bez tlačítek. V tomto odstavečku si ukážeme postup, který nám umožňuje vytvářet si vlastní znaky na displeji. Toto může být zajímavé, pokud chceme to co na displeji ukazujeme ozvláštnit třeba piktogramy, nebo prostě tehdy, když chceme do toho co zobrazujeme nějakým způsobem trošku zamíchat grafiku (v rámci možností ovšem, které nám lcd displej poskytuje).

Vlastní znaky můžeme vytvářet pomocí následujícího postupu. Znaky, které takto vytvoříme platí samozřejmě pouze pro arduino ve kterém je vložený následující program. Nejsou součástí knihovny LiquidCrystal_i2c.h.

Použití pole při definování vlastního znaku pro LCD

Každý symbol, který je zobrazený na znakovém displeji je vlastně maticí/tabulkou 5×8 bodů na displeji. V první části programu proto deklarujeme pole s osmi buňkami (to jsou ty řádky začínající písmenem B a oddělené čárkami). Každá nula v tomto poli je neaktivní pixel ve znaku a každá jednička naopak pixel který svítí.

V části setup pak definujeme dva nové znaky funkcí lcd.createChar(). V této funkci je třeba do závorky vložit dva parametry. Prvý z nich je číslo znaku a druhý jméno pole, kde je definován rastr pro zobrazení. V části loop pak můžete tyto znaky funkcí lcd.write() + číslo požadovaného znaku mezi závorkami zobrazit.

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

/*–Symbol smajlik——————*/
byte smajlik[8] = {
B00000,
B10001,
B00000,
B00000,
B10001,
B01110,
B00000,
B00000
};

/*–Symbol srdce——————*/
byte srdce[8] = {
B01010,
B11111,
B11111,
B01110,
B01110,
B00100,
B00100,
B00000
};

void setup()
{
lcd.init();
//inicializace displeje
lcd.backlight(); //aktivace podsvícení displeje
lcd.createChar(0, smajlik); //vytvoření znaku s pořadovým číslem 0, použito je pole smajlik
lcd.createChar(1, srdce); //vytvoření znaku s pořadovým číslem 1, použito je pole srdce
}
void loop()
{
lcd.setCursor(8,0);
//umístění kurzoru na pozici
lcd.write(0); //rozsvícení znaku 0
delay(1000);
lcd.setCursor(8,0);
//umístění kurzoru na pozici
lcd.write(1); //rozsvícení znaku 1
delay(1000);
}
Kód programu pro zobrazení vlastních znaků

Úkoly:

1, Vytvořte program, ve kterém na displeji bude rolovat váš vlastní text

2, Vytvořte víceřádkový text na displeji, ve kterém bude možné „pohybovat se“ stiskem tlačítka

3. Vytvořte si na displeji své vlastní znaky, zkuste znaky navzájem kombinovat a skládat velké znaky z několika menších znaků

Programy z článku ke stažení

Program lcd-hello-3 demonstrující rolující text

Program lcd-hello-4 předvádějící možnost posunu více řádků na jednom displeji

Program lcd-hello-5 – demonstrace použití vlastního znaku

1 komentář u „LCD displej – další fígle

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *