LCD 1602



LCD display

Niekedy je vhodné vidieť výpis premenných nielen cez Serial Monitor na PC. Vhodnou možnosťou je použiť LCD display, napr. 1602, kde číslo 1602 znamená, že display má 16 znakov v 2 riadkoch.

LCD

Hore hájom chodník

Arduino LCD shield

Jedna z možností je použiť Arduino LCD shield, ktorého rozmery sú kompatibilné s Arduino doskami Uno a Mega. Výhodou je, že nemusíme nič prepájať vodičmi. Shield má integrovaných 5 tlačidiel (Select, Left, Right, Up, Down), ktoré môžeme využiť a tiež má vyvedené tlačidlo Reset. Nevýhodou shieldu je, že nám zapapre veľa pinov (najmä na doske Uno).

LCD shield využíva softvérovú knižnicu LiquidCrystal.h. Knižnica LiquidCrystal Library poskytuje príkazy (funkcie) pre ovládanie a výpis na LCD shielde.

Ak program používa softvérovú knižnicu, je potrebné na začiatku túto knižnicu zahrnúť do kódu programu príkazom #include úplne na začiatku programu. V prípade knižnice LiquidCrystal bude na prvom riadku príkaz #include

Po nasadení LCD shieldu na Arduino dosku a spustení vývojového prostredia môžeme načítať vzorové programy pre knižnicu LiquidCrystal.h z hlavného menu cez File - Examples - LiquidCrystal - ....

Aby vzorové programy fungovali, je bezpodmienečne nutné zmeniť hodnoty pinov v príkaze pre inicializáciu knižnice. Vzorové programy predpokladajú pripojenie na piny 12, 11, 5, 4, 3, 2 (viď nižšie, LCD 1602 - paralelne) avšak LCD shield používa piny 8, 9, 4, 5, 6, 7. Preto je potrebné pôvodný príkaz inicializácie konžnice LiquidCrystal lcd(12, 11, 5, 4, 3, 2); vymeniť za korektný pre LCD shield LiquidCrystal lcd(8, 9, 4, 5, 6, 7); (a to v každom zo vzorových programov - Autoscroll, Blink, Cursor, CustomCharacter, Display, HelloWorld, Scroll, SerialDisplay, setCursor, TextDirection).

// inicializácie knižnice pre LCD 1602 paralelne
// vo vzorovych programoch vyvojoveho prostredia Arduino
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// inicializácie knižnice pre Arduino LCD shield
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

Nasledujúci príklad počíta čas od posledného resetu dosky Arduino Mega a vypisuje, ktoré tlačidlo na LCD shielde bolo stlačené. Pre výpis času je použitý príkaz millis(), ktorý vracia počet milisekúnd od posledného reštartu, prípadne zapnutia dosky Arduino. Podelením číslom 1000 dostaneme čas v sekundách. Všetky príkazy (funkcie) dostupné z knižnice LiquidCrystal sú uvedené na referenčnej stránke LiquidCrystal Library.

LCD shield


/*
  Arduino LCD shield
  pouziva kniznicu LiquidCrystal
  vypis casu a stlaceneho tlacidla
 */

#include <LiquidCrystal.h>           // zahrnutie kniznice do programu

LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // inicializacia kniznice pre Arduino LCD shield

int analog_hodnota;                  // tlacidla su pripojene na analogovy pin A0

void setup() {

  lcd.begin(16, 2);                  // nastavenie poctu znakov a poctu riadkov
  
  lcd.setCursor(0,0);                // presun kurzoru na zaciatok horneho riadka
  lcd.print("LCD Shield");           // vypis textoveho retazca na LCD
  lcd.setCursor(0,1);                // presun kurzoru na zaciatok dolneho riadka
  lcd.print("Tlacidlo");
}

void loop() {

  lcd.setCursor(12,0);               // presun kurzoru na 12-ty znak horneho riadka
  lcd.print(millis()/1000);          // vypis casu na LCD

  analog_hodnota = analogRead (A0);  // nacitanie hodnoty tlacidla na pine A0

  lcd.setCursor(10,1);               // presun kurzoru na 10-ty znak spodneho riadka
  
  if (analog_hodnota < 60) {         // test stlaceneho tlacidla a jeho vypis na LCD
    lcd.print("Right ");
  }
  else if (analog_hodnota < 200) {
    lcd.print("Up    ");
  }
  else if (analog_hodnota < 400) {
    lcd.print("Down  ");
  }
  else if (analog_hodnota < 600) {
    lcd.print("Left  ");
  }
  else if (analog_hodnota < 800) {
    lcd.print("Select");
  }
  else lcd.print ("      ");         // nic nebolo stlacene
}

Hore hájom chodník

LCD 1602 - paralelne

Na nasledujúcej schéme je štandardné 4-bitové paralelné zapojenie LCD displaya tak, aby vyhovovalo pre vzorové programy vývojového prostredia Arduino (pripojenie na piny 12, 11, 5, 4, 3, 2). Potenciometrom nastavujeme kontrast (prípadne sa dá potenciometer vynechať a LCD pin V0 - tretí zľava pripojiť na GND).

LCD paralelne

Po pripojení LCD na Arduino dosku a spustení vývojového prostredia môžeme načítať vzorové programy pre knižnicu LiquidCrystal.h z hlavného menu cez File - Examples - LiquidCrystal - .... Netreba už robiť žiadne zmeny pinov v kóde programov.

Hore hájom chodník

LCD 1602 - i2c

Predchádzajúce parelelné zapojenie LCD vyžaduje veľa prepojovacích vodičov (6 dátových plus napájacie) a tiež nám zapapre zbytočne veľa digitálnych pinov. Riešením je pripojenie LCD pomocou iba dvoch vodičov (TWI) na zbernicu i2c. K LCD displayu pripojíme i2c modul ( I2C/TWI LCD1602 Module v cene asi 1USD) a LCD pripojíme k Arduino doske pomocou dvoch dátových vodičov (SDA, SCL) a napájacích vodičov.

LCD i2c

LCD i2c Nano

LCD i2c Uno

LCD i2c Mega

Každý mikrokontrolér má na doske Arduina vyvedené piny SDA a SCL. Ich výhodou je aj skutočnosť, ža na ne môžeme zapojiť aj viacej zariadení, ktoré podporujú komunikáciu prostredníctvom i2c zbernice a odlišujú sa svojou adresou. Ak sme si zatiaľ tieto piny nezapaprali (podobne ako sa snažíme vyhýbať aj komunikačným pinom TXD a RXD), tak teraz je čas ich použiť. Pre prácu s LCD na i2c zbernici je potrebné nainštalovať novú knižnicu LiquidCrystal_I2C.

Inštaláciu knižnice vykonáme z hlavného menu cez Sketch - Import Library - Add Library... Knižnicu LiquidCrystal_I2C možno spolu so vzorovým príkladom nájsť na stránke http://www.dfrobot.com/wiki/ prípadne priamo stiahnuť stadeto: LiquidCrystal_I2C1602V1.zip

Adresa i2c modulu je 0x27 (niektoré moduly majú adresu 0x20 a adresa sa dá aj zmeniť prespájkovaním pinov A0, A1, A2 na module, ale robiť to nebudeme). Dobrým pomocníkom pri i2c zariadeniach je program i2c_scanner, ktorý vypíše prostredníctvom Serial Monitor adresy zariadení pripojených k i2c zbernici. Zdrojový kód programu i2c_scanner je tuto: i2c_scanner.ino

i2c_scanner

Po pripojení LCD cez i2c modul na Arduino dosku, inštalácií knižnice LiquidCrystal_I2C a reštarte vývojového prostredia môžeme načítať vzorové programy pre knižnicu LiquidCrystal_I2C.h z hlavného menu cez File - Examples - LiquidCrystal_I2C1602V1 - ....

Nasledujúci príklad ilustruje bežiaci text.

/*
  LCD i2c
  beziaci text
 */

#include <Wire.h> 	               // zahrnutie kniznic do programu 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);      // inicializacia kniznice (adresa, znaky, riadky)

int i=200;                             // premenna zdrzania pri posune textu

void setup()
{
  lcd.init();                          // inicializacia LCD
  lcd.backlight();                     // zapnutie podsvietenia
  lcd.print("Toto je text, ktory bezi zprava dolava."); // vypis retazca textu
}

void loop()
{
  lcd.scrollDisplayLeft();             // posun textu o jeden znak vlavo
  delay(i--);                          // cakanie
  if (i<0) {i=200;}                    // znovu od pomaleho pohybu
}

Na záver si urobíme generátor prvočísel, podobne ako sme kedysi vypisovali prvočísla cez Serial Monitor.

LCD i2c prvočísla

/*
  LCD i2c
  generator prvocisel (kazde 2 sekundy vypise dalsie v poradi)
 */


#include <Wire.h> 	               // zahrnutie kniznic do programu
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);      // inicializacia kniznice (adresa, znaky, riadky)


unsigned long i,                       // premenna cyklu
              cislo=2,                 // cislo, ktore testujeme, ci je prvocislo
              n=1;                     // poradie vypisovaneho prvocisla

boolean prime=1;                       // 0-false, 1-true


void setup()
{
  lcd.init();                          // inicializacia LCD
  lcd.backlight();                     // zapnutie podsvietenia
  lcd.home();                          // nastavenie kurzora vlavo hore
}


void loop()
{
  
  for (i=2; i<cislo; i++) {
    prime=1;                           // predpokladajme ze je prvocislo
    if (!(cislo % i)) {                // zvysok po deleni je nula, nie je to prvocislo
        prime=0;
	break;                         // nech vyskoci z cyklu a zbytocne uz nerata
    }
  }
  
  if (prime) {                         // vypis prvocisla
    lcd.home();
    lcd.print(n);
    lcd.print(". prvocislo");
    lcd.setCursor(0, 1);
    lcd.print(cislo);
     
    delay(2000);                       // pre spomalenie vypisu na LCD
    n++;
  }

  cislo++;
}

Schémy zapojení boli vytvorené v programe Eagle 6.1.0. Obrázky schematického znázornenia obvodov na kontaktnom poli boli vytvorené v programe Fritzing 0.9.0. Html kód príkladov je generovaný pomocou http://tohtml.com/cpp/.

Hore hájom chodník

PaedDr. Karol Pauchly, ZŠ s MŠ Chlebnice, november 2014