6. diel - Arduino - LCD Display
V dnešnom tutoriále o Arduino sa zameriame na LCD displej. Viem, že som v minulom diele sľuboval meranie vzdialenosti, ale chcel som jej pritom zobrazovať lepšie ako posielaním na sériovú linku, takže si teraz preberieme LCD a vzdialenosť bude (snáď) v budúcom diele.
LCD display, čiže display z tekutých kryštálov, je zobrazovacie zariadenie s nízkou spotrebou a preto sa hodí do zariadenia na batérie alebo k Arduino. Takže si nejaký zoženieme, len budeme dbať na to, aby mal radič HD44780 alebo aspoň kompatibilné, pretože inak nám to fungovať nebude. Piny sú u väčšiny displayov rovnaké, je ale lepšie sa pre istotu pozrieť do datasheete k danému modelu. Vo väčšine prípadov sú však už piny opísané, takže sa zaobídeme bez neho, a v prípade iného poradí na to budeme dbať.
Display má celkom 16 pinov, nám ale bude teraz stačiť len 12. Displaye sa často predávajú bez "nožičiek" a budeme ich musieť prirobiť. Mne bohato postačili kúsky nastrihaného drôtiku, ktoré bude potrebné do dierok připájet. Takže na chvíľu vezmeme do ruky spájku a ideme spájkovať, alebo si zoženieme nejaký, ktorý už nožičky má, ale to bude ťažšie.
Zapojenie pinov
Zapojenie pinov je pomerne jednoduché:
- 1 VSS - Pripojíme jednoducho na zem
- 2 VDD - Vstup 5V
- 3 V0 - Kontrast. Niekedy lepšie na zem, niekedy 5V. U mňa bolo oboje zlé, takže som pripojil potenciometer a nastavil si kontrast aký chcem.
- 4 RS - Pripojíme k Arduino a v kóde potom zvolíme pin
- 5 RW - Zem
- 6 E (Enable) - Arduino
- 7-10 - D0-D3 - Dátové piny, ktoré používať nebudeme
- 11-14 - D4-D7 - Ďalšie dátové piny, ktoré pripojíme k Arduino
- 15 - A - Anóda podsvietenie, + 5V
- 16 - K - Katóda podsvietenie, zem
To by boli piny. Aby sme mali čo zobrazovať, tak si pripojíme nám už známe DHT11 zo 4. dielu.
Nejako to zostavíme dohromady podľa schémy a presunieme sa rovno k písania kódu.
#include <dht11.h> #include <LiquidCrystal.h> int rs_pin = 2; int e_pin = 3; int d4_pin = 4; int d5_pin = 5; int d6_pin = 6; int d7_pin = 7; LiquidCrystal LCD(rs_pin, e_pin, d4_pin, d5_pin, d6_pin, d7_pin); dht11 cidlo; int dht11pin = 12; void setup() { LCD.begin(16,2); LCD.setCursor(0,0); LCD.print("itnetwork.cz"); LCD.setCursor(0,1); LCD.print("teplota: "); } void loop() { cidlo.read(dht11pin); LCD.setCursor(9,1); LCD.print(" "); LCD.setCursor(9,1); LCD.print(cidlo.temperature); LCD.setCursor(13,1); LCD.print((char)223); LCD.print("C"); delay(500); }
A teraz k vysvetľovanie:
#include <dht11.h> #include <LiquidCrystal.h>
Importujete si knižnice k dht11 a LCD. LiquidCrystal.h by malo byť už v základoch, takže nebude potrebné nič sťahovať.
int rs_pin = 2; int e_pin = 3; int d4_pin = 4; int d5_pin = 5; int d6_pin = 6; int d7_pin = 7;
Pre pripojené LCD použijeme piny RS, E, D4-D7. Ostatné pôjdu na zem / napájanie (poprípade potenciometer). Okrem dátových pinov D4-D7 sa tu logicky nachádza aj D0-D3, ktoré ale potrebovať nebudeme.
LiquidCrystal LCD(rs_pin, e_pin, d4_pin, d5_pin, d6_pin, d7_pin);
Funkcia LiquidCrystal vytvorí objekt LCD display, v našom prípade s názvom LCD. Ako parametre berie oných 6 pinov. Nemusíme ich dávať do týchto premenných, stačí len napísať čísla, ale je dôležité dodržiavať poradie RS, E, D4, D5, D6, D7.
dht11 cidlo; int dht11pin = 12;
Túto časť snáď ani vysvetľovať nemusím, pretože pripojiť DHT11 vieme už zo 4. dielu.
LCD.begin(16,2);
Spustí display s 16 znakmi a 2 riadky. Ak máte iný, upravte podľa seba. Tento begin je trochu iný. Display sa na začiatku spustenie musí inicializovať. Schválne skúste po vypísaní texte odpojiť všetku zem a vstupných 5V do displaya a potom opätovne zapojte. Výsledkom bude buď akýsi patvary znakov alebo len samé obdĺžničky. Potom na Arduino stlačte reset a display bude zas fungovať normálne. Ak budete mať projekt, v ktorom sa display počas behu programu môže odpojiť nejakým prerušením kontaktu, odporúčam pridať begin na začiatok Loop. Majte však na pamäti, že tým dôjde k zmazaniu celého textu na display, takže v našom prípade by sa nám zobrazovalo len 22 ° C bez nápisov itnetwork.cz a teplota, ktoré máme v setupu.
LCD.setCursor(0,0);
Nastaví kurzor na prvý znak, prvý riadok - začína sa od nuly. Tento riadok je úplne zbytočný, pretože na túto pozíciu sa kurzor nastaví ihneď po spustení displaya.
LCD.print("itnetwork.cz"); LCD.setCursor(0,1); LCD.print("teplota: ");
Funkcia print napíše na display text. Potom si posunieme kurzor na druhý riadok a napíšeme ďalší text.
cidlo.read(dht11pin);
Prečítame hodnotu z DHT11.
LCD.setCursor(9,1);
Nastavíme kurzor za nápis teplota
LCD.print(" ");
Pre istotu smažemr predchádzajúce hodnotu, keby náhodou ubudlo jedno číslo, tak to posledné zostane za aktuálnym a neprepíše sa. Je síce veľmi nepravdepodobné, že dostaneme 3-miestnu teplotu, ale ak budeme napr. Čítať hodnotu z analógového pinu, tak je toto nutné.
LCD.setCursor(9,1);
Vráti kurzor za nápis teplota.
LCD.print(cidlo.temperature);
Vypíše teplotu z čidla. Ako vidíte, možno tiež vypisovať rovno hodnoty, ktoré nám vracajú funkcie bez nutnosti ukladania do meziproměnných.
LCD.setCursor(13,1); LCD.print((char)223); LCD.print("C");
Teraz nastavíme kurzor za nápis a napíšeme najskôr znak stupňov. Napísať ho len tak do úvodzoviek nemusí fungovať, preto napíšeme (char) 223, čo vyústi k vypísanie znaku s ASCI hodnotou 223, čo je práve značka stupňov. Potom len napíšeme C a je hotovo. Táto časť textu sa nemení, teda by sme jej mohli napísať rovno v setupu, ale nie je to nutnosť.
delay(500);
A nakoniec chvíľu počkáme.
Kód nahráme a v prvom rade sa pozrieme, ako sme na tom s kontrastom. Ak je display nečitateľný, skúste prepojiť z 5V na GND (alebo naopak), prípadne pripojte potenciometer a pohrajte sa s ním, pokiaľ nebude text krásne čitateľný. Tiež nezabudnite na podsvietenie, bez neho nebude nič vidieť. Keď niečo nebude fungovať, skontrolujte či máte správne napojené piny. Na stiahnutie je k dispozícii okomentovaný zdrojový kód.
Takto to bude vyzerať
To by bolo pre dnešné diel všetko, nabudúce už snáď bude ono sľubované meranie vzdialenosti, takže si začnite zháňať Ultrasonický modul HC-SR04