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.
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
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.
/* 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 }
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).
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.
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.
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
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 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/.
PaedDr. Karol Pauchly, ZŠ s MŠ Chlebnice, november 2014