Close

TinyLab: LCD displej

Arduino Kit TinyLab: LCD displej

V seriálu článků o Arduino kitu TinyLab se tu postupně věnujeme jednotlivým periferiím, které jsou na desce dostupné. V dnešním dílu si ukážeme, jak se dá pracovat s LCD displejem na desce.


Znakové vs. grafické LCD displeje

LCD displeje dělíme podle různých kritérií. Jedním z dělení je rozdělení na znakové displeje a grafické displeje. První uvedené jsou schopné zobrazit pouze znaky. Jejich hlavním parametrem je to, kolik se na displej vejde znaků. To je většinou udáváno ve tvaru MxN, kdy M značí počet znaků na řádku a N počet řádků. Na TinyLab nalezneme displej 16×2. U grafických displejů je možné ovládat každý pixel displeje jednotlivě a je na nich tak možné kreslit různé obrazce, zobrazovat grafy i psát text. Více o LCD displejích se můžete dočíst ve článku Arduino a displeje II.

Připojení displejů

Druhou vlastností, která nás při tvorbě projektů zajímá, je způsob, kterým displej s Arduinem komunikuje. Pokud nevyužijeme převodník, je možné většinu znakových displejů řídit pomocí osmi datových a třech řídicích pinů. To nám ale, u desek jako Arduino UNO, už moc volných pinů nezbude. Z toho důvodu se vyrábějí různé převodníky, které je možné k displeji připojit, popřípadě je displej obsahuje, a díky nim je možné ho ovládat pomocí menšího počtu pinů. Většinou se jedná o převodníky, které komunikují po I2C, SPI, nebo sériové lince. Když se podíváme do blokového schématu TinyLab, zjistíme, že na desce najdeme displej s I2C rozhraním (to je více popsané zde). Také se dozvíme, že toto rozhraní využívá piny D2 a D3. Proto přepneme spínače u těchto pinů do polohy ON.

Jednoduchý program

Knihovnu pro ovládání displeje jsme stáhli ve článku TinyLab:Nezbytný základ. Pojďme se podívat na jednoduchý program, který slouží k ovládání displeje.

#include <Wire.h> // knihovna pro I2C komunikaci
#include <LiquidTWI2.h> // knihovna pro ovládání displeje

LiquidTWI2 lcd(0x20); // vytvoření objektu pro práci s displejem

void setup() {
  lcd.setMCPType(LTI_TYPE_MCP23008); // nastavení typu řídicí jednotky displeje
  lcd.begin(16, 2); // displej má dva řádky po 16 znacích
  lcd.setBacklight(HIGH); // zapneme podsvícení

  lcd.setCursor(0, 0); // nastavení kurzoru na první znak prvního řádku
  lcd.print("TinyLab navod");
  lcd.setCursor(0, 1); // nastavení kurzoru na první znak druhého řádku
  lcd.print("od Arduino.cz");
} 

void loop() {}

Nejdříve vložíme potřebné knihovny a vytvoříme objekt pro ovládání displeje. V blokovém schématu je napsáno, že displej má adresu 0x20. Na sběrnici I2C totiž může být připojeno více zařízení najednou (na TinyLab to je displej, modul hodin reálného času a paměť EEPROM). A aby bylo vždy jasné, se kterým zařízením komunikujeme, používá se adresování. Pokud si říkáte, proč je před dvacítkou ještě 0x, jedná se o zápis čísla v šestnáctkové soustavě (více viz zde).

Dále zvolíme typ převodníku – to aby Arduino posílalo správné příkazy. Dále sdělíme, že pracujeme s displejem 16×2 a zapneme podsvícení. Nakonec vypíšeme text na displej. Funkce lcd.setCursor slouží k nastavení pozice kurzoru, tedy místa, kam se začne vypisovat text.

V Arduino IDE v menu Nástroje/Vývojová deska zvolíme Arduino Leonardo a v menu Port zvolíme port, kde je deska připojená. Po nahrání programu by se měl rozsvítit displej a na něm zobrazit vypsaný text. Pokud se na displeji nic nezobrazuje, nebo se zobrazují tmavé obdélníky, je možná špatně nastavený kontrast. Ten je možné upravit pomocí malého potenciometru, který je umístěný u levého spodního rohu displeje. Pomocí malého křížového šroubováku tímto displejem opatrně otáčejte, dokud se na displeji nezobrazí text.

Arduino kit TinyLab - LCD: Výsledný text

Výsledný text

Výpis hodnoty na displej

Nyní si ukážeme, jak se dá na displej vypsat hodnota, například z potenciometru. Ten je připojen k pinu A0, takže nesmíme zapomenout zapnout spínač u tohoto pinu. Čtení hodnot z potenciometru jsme se věnovali v tomto článku.

#include <Wire.h>
#include <LiquidTWI2.h>

LiquidTWI2 lcd(0x20);

void setup() {
  lcd.setMCPType(LTI_TYPE_MCP23008);
  lcd.begin(16, 2);
  lcd.setBacklight(HIGH);

  lcd.setCursor(0, 0);
  lcd.print("Mereni:");
} 

void loop() {
  int hodnota = analogRead(A0);

  lcd.setCursor(0, 1);
  lcd.print(hodnota);

  delay(200);
}

Všimněte si zajímavé věci. Natočte potenciometr tak, aby se na displeji zobrazila hodnota 1023 a poté otočte potenciometr úplně na druhou stranu. Asi byste čekali, že se a displeji objeví nula, ale místo toho na něm stále zůstávají čtyři číslice. Napadá vás, čím to je a jak to napravit?

Problém je v tom, že si displej pamatuje poslední hodnotu každé pozice pro znak. A protože například hodnoty do 999 využívají jen maximálně tři číslice, zůstane čtvrtá číslice nepřepsaná. Můžeme to vyřešit snadno tak, že na druhý řádek před zapsáním hodnot vypíšeme čtyři mezery. Tím se pozice pro znaky smažou a my na ně potom můžeme zapsat nové hodnoty. Výsledný kód tedy bude vypadat takto:

#include <Wire.h>
#include <LiquidTWI2.h>

LiquidTWI2 lcd(0x20);

void setup() {
  lcd.setMCPType(LTI_TYPE_MCP23008);
  lcd.begin(16, 2);
  lcd.setBacklight(HIGH);

  lcd.setCursor(0, 0);
  lcd.print("Mereni:");
} 

void loop() {
  int hodnota = analogRead(A0);

  lcd.setCursor(0, 1);
  lcd.print("    ");
  lcd.setCursor(0, 1);
  lcd.print(hodnota);

  delay(200);
}

Co dál?

V tomto návodu jsme si představili vše potřené pro ovládání LCD displeje na desce TinyLab. Co by se dalo dělat dál? Tak třeba vypisovat hodnoty přijaté z XBee, zobrazovat počet stisků nějakého tlačítka, nebo třeba naprogramovat jednoduché menu, ve kterém se bude možné pohybovat pomocí tlačítek, nastavovat v něm hodnoty apod.

Zbyšek Voda

Napsat komentář