Arduino i LCD - Kurs Arduino cz. 6
Połączenie Arduino z wyświetlaczem LCD jest doskonałym sposobem prezentowania informacji tekstowej i wzbogacania projektu o funkcjonalność menu. W jaki sposób więc płyta wysyła tekst do wyświetlacza?
W środowisku Arduino, jak również w innych językach programowania, tekst jest rozumiany jako ciąg znaków. Na przykład jeżeli zestawisz pięć znaków: t, e, k, s, t, otrzymasz słowo tekst. W ten sposób każdy tekst jest reprezentowany w kodzie programu jako tabela znaków. Istnieją dwa podstawowe sposoby tworzenia tekstów w kodzie programu (lub mówiąc bardziej ogólnie, tworzenia ciągów znaków). Pierwszy polega na zastosowaniu zmiennej typu String, a drugi — tabeli typu char zakończonej zerem. Jeżeli jest to dla Ciebie jasne, to świetnie! Jeżeli jednak nie, nie martw się, w rzeczywistości sprawa jest znacznie prostsza, niż na pozór wygląda. Przyjrzyjmy się dokładniej temu zamieszaniu i sprawdźmy, o co w nim chodzi.
Jak wspomnieliśmy wcześniej, tekst w kodzie programu jest w rzeczywistości tabelą znaków. Aby móc go przetwarzać, utworzona została klasa String, umożliwiająca manipulowanie tą tabelą znaków na różne skomplikowane sposoby. Możesz porównywać ze sobą dwie zmienne typu String i sprawdzać, czy są takie same, wyszukiwać fragment tekstu w zmiennej, dołączać znaki na jej końcu, a nawet łączyć ze sobą wiele tekstów. Tabela 7.1 zawiera podsumowanie różnych funkcji wykorzystujących zmienną typu String. Jak widzisz, klasa String jest wyjątkowo pomocna i może być wykorzystana do przygotowania tekstu do przedstawienia na wyświetlaczu.
Funkcje klasy String w Arduino
Funkcja | Opis |
charAt() | Zwraca określony znak z tekstu. |
compareTo(String drugi_tekst) | Sprawdza, czy dwa teksty są takie same albo czy jeden następuje przed lub po drugim w porządku alfabetycznym. |
concat(String drugi_tekst) | Łączy dwa teksty w jeden nowy. |
endsWith(String drugi_tekst) | Sprawdza, czy tekst kończy się znakiem zawartym w innym tekście. |
equals(String drugi_tekst) | Sprawdza, czy dwa teksty są takie same, z uwzględnieniem wielkości liter. |
equalsIgnoreCase(String drugi_tekst) | Sprawdza, czy dwa teksty są takie same, bez uwzględnienia wielkości liter. |
getBytes(char [ ], int dlugosc) | Kopiuje znaki tekstu do wskazanego bufora. |
indexOf(val) indexOf(val, int indeks) |
Wyszukuje znak lub tekst w innym tekście, licząc od początku (zmienna val może być typu String lub char). |
lastIndexOf(val) lastIndexOf(val, int indeks) |
Wyszukuje znak lub tekst w innym tekście, licząc od jego końca (zmienna val może być typu String lub char). |
length() | Zwraca długość tekstu jako liczbę znaków. |
replace(String pierwszy_tekst, String drugi_tekst) |
Zamienia wszystkie wystąpienia znaku lub ciągu znaków w tekście innym tekstem. |
setCharAt(int indeks, char c) | Ustawia lub zmienia określony znak w tekście. |
startsWith(String s) | Zwraca wartość logiczną (true lub false) informującą, czy tekst zaczyna się którymś ze znaków zawartych w drugim tekście. |
substring(int start) substring(int początek, int koniec) |
Zwraca fragment tekstu. |
toCharArray(char [ ], int dlugosc) | Kopiuje znaki tekstu do wskazanej tabeli. |
toLowerCase() | Zwraca kopię oryginalnego tekstu złożoną tylko z małych liter. |
toUpperCase() | Zwraca kopię oryginalnego tekstu złożoną tylko z wielkich liter. |
Trim() | Zwraca kopię oryginalnego tekstu bez początkowych i końcowych spacji. |
Deklarowanie zmiennej typu String jest proste. Oto kilka przykładów:
String s = String(13);
W obu wierszach tworzona jest zmienna s typu String, przy czym w pierwszym ze stałego ciągu znaków, a w drugim z liczby całkowitej (w domyślnym układzie dziesiętnym). Funkcje tekstowe przedstawione w tabeli 7.1 oferują wiele funkcjonalności. Na przykład aby połączyć dwa następujące teksty:
String drugi = " świecie";
wystarczy po prostu wywołać funkcję:
Otrzymamy tekst „Witaj, świecie”. Ale jak to zazwyczaj bywa, ceną nowych funkcjonalności klasy String jest zajęta większa pamięć. A ponieważ pamięć jest w Arduino jest cenna, trzeba czasem zrezygnować z typu String i bezpośrednio użyć bardziej oszczędnego
typu char.
UWAGA: Zapewne zauważyłeś, że w powyższych opisach tekst (typ String) jest pisany z wielkiej litery S, natomiast ciąg znaków (typ string) z małej litery s.
Jak pokazuje tabela 7.2, jest wiele sposobów przedstawiania ciągów znaków w postaci tabeli znaków. Ciągi zazwyczaj kończą się znakiem zerowym (kodem ASCII 0), dzięki któremu funkcje Arduino, takie jak Serial.print(), mogą dokładnie określić, gdzie
jest koniec ciągu. Dlatego też tabele druga[6] i trzecia[6] w tabeli 7.2 mają długość sześciu znaków, mimo że sam tekst składa się tylko z pięciu. Kompilator Arduino automatycznie umieszcza dodatkowy znak zerowy na końcu ciągu. I ostatnia ważna uwaga:
stałe tekstowe są zawsze deklarowane wewnątrz podwójnych cudzysłowów, natomiast pojedyncze znaki wewnątrz pojedynczych. Tabela 7.2 przedstawia kilka przykładów.
Tabela 7.2. Przykłady możliwych inicjalizacji tabeli typu char
Deklaracja | Opis |
char pierwsza[10]; | Deklaracja niezainicjowanej tabeli |
char druga[6] = { 't', 'e', 'k', 's', 't' }; | char druga[6] = { 't', 'e', 'k', 's', 't' }; Deklaracja tabeli z dodatkowym znakiem, dzięki czemu kompilator może automatycznie dodać znak zerowy |
char trzecia[6] = { 't', 'e', 'k', 's', 't', '' }; | Przykład podobny do poprzedniego, z jawnie dodanym znakiem zerowym |
char czwarta[ ] = "tekst"; | Kompilator automatycznie dobiera wielkość ciągu znaków z uwzględnieniem znaku zerowego |
char piata[6] = "tekst"; | Jawna inicjalizacja wielkości i zawartości stałej tekstowej |
char szosta[10] = "tekst"; | Inicjalizacja tabeli z dodatkowym miejscem dla dłuższego ciągu |
Mamy nadzieję, że w ten sposób odczarowaliśmy różnice pomiędzy typem String a tabelą znaków typu char, z których będziesz korzystać podczas używania Arduino z wyświetlaczami LCD. Teraz przyjrzymy się, jak podłączyć pierwszy wyświetlacz. Dlatego bez zbędnej zwłoki przedstawiamy Hitachi HD44780.
Równoległy wyświetlacz znakowy Hitachi HD44780
Hitachi HD44780 jest jednym z najpopularniejszych sterowników wyświetlaczy LCD, przeznaczonym do zastosowań w kompaktowych systemach i mikrokontrolerach. Układ obsługuje wiele typów wyświetlaczy o różnych kształtach i wielkościach. W tym przykładzie zastosujemy go do sterowania wyświetlaczem LCD o wymiarach 16×2 (2 wiersze po 16 znaków).
Wszechobecność sterownika Hitachi HD44780 (i innych podobnych układów) jest bardzo dobrą wiadomością, ponieważ zazwyczaj można go kupić za niewielką cenę lub odzyskać ze starego urządzenia. Niektóre z nich są bardzo ciekawe, na przykład oferują jedno- lub wielokolorowe (RGB) podświetlenie.
Wyświetlacz z podświetleniem posiada wbudowane diody LED, które można zapalić i uzyskać jasny blask. Nie tylko daje to doskonały efekt w słabo oświetlonym otoczeniu, ale również dostarcza wizualnych wrażeń. Na przykład wyświetlacz Hitachi HD44780, wyposażony w kolorowe podświetlenie RGB, może pokazywać informację na różnym tle, sygnalizując w ten sposób status Arduino. Można włączyć czerwone tło, aby powiadomić użytkownika, że dzieje się coś złego, albo zielone, jeżeli wszystko jest w porządku.
Wyświetlacz 4-bitowy czy 8-bitowy?
Wyświetlacze wykorzystujące układ Hitachi HD44780 są dostępne w wielu różnych konfiguracjach, które można połączyć z Arduino na dwa sposoby: w trybie 4-bitowym lub 8-bitowym. Kompromisem pomiędzy oboma trybami jest liczba wykorzystanych pinów Arduino i prędkość obsługi wyświetlacza.
Jest to wyświetlacz równoległy, dlatego najprostszym sposobem komunikacji z nim jest wysyłanie pełnych bajtów (8 bitów) danych na raz (w komunikatach 1-bajtowych). Ten sposób wymaga użycia co najmniej 10 pinów Arduino. Natomiast w trybie 4-bitowym
potrzebnych jest tylko 6 pinów, przy czym bajt jest dzielony na dwie 4-bitowe połówki. Dzięki temu oszczędza się piny, ale transmisja zabiera więcej czasu (wysyłane są dwa komunikaty, a nie jeden). Tryb 4-bitowy jest wciąż równoległy w tym sensie, że przesyłane są 4 bity jednocześnie, ponieważ bajt jest dzielony na dwa komunikaty przesyłane jeden po drugim.
Biblioteka i funkcje
Na szczęście obsługa wyświetlaczy opartych na układzie Hitachi HD44780 (lub podobnym) jest błahostką. Jak wspomnieliśmy w rozdziale 4., jedną ze standardowych bibliotek instalowanych razem ze środowiskiem Arduino IDE jest LiquidCrystal. Biblioteka
jest kompatybilna z konfiguracją zarówno 4-bitową, jak i 8-bitową, i oferuje wiele użytecznych funkcji do sterowania wyświetlaczem.
Tabela 7.3 zawiera szczegółowe informacje o funkcjach zawartych w bibliotece LiquidCrystal.
Schemat układu
Teraz, kiedy znamy dokładnie sposób komunikacji z wyświetlaczem Hitachi HD44780 zarówno od strony sprzętowej, jak i programowej, możemy przystąpić do połączenia wszystkich komponentów. W tym przykładzie będą potrzebne:
- płyta Arduino (na przykład Arduino Uno lub Mega);
- wyświetlacz oparty na układzie Hitachi HD44780;
- potencjometr lub trymer (R1) 10 kΩ;
- rezystor (R2, wymagany tylko wtedy, gdy wyświetlacz posiada podświetlenie.
Wartość rezystora zależy od rodzaju podświetlenia, patrz uwagi poniżej).
Funkcje dostępne w bibliotece LiquidCrystal
Funkcja | Opis |
begin(int kolumna, int wiersz) | Ustawia rozmiar wyświetlacza. |
clear() | Resetuje wyświetlacz i kasuje jego zawartość. |
home() | Ustawia kursor w lewym górnym rogu wyświetlacza. |
setCursor(int kolumna, int wiersz) | Ustawia kursor w zadanym miejscu. |
write(byte wartosc) | Wpisuje znak w bieżącym położeniu kursora. |
print(dane) | Wpisuje tekst typu char, byte, int, long lub String. |
cursor() | Wpisuje znak podkreślenia w bieżącym położeniu kursora. |
noCursor() | Ukrywa znak kursora. |
blink() | Włącza miganie znaku kursora. |
noBlink() | Wyłącza miganie znaku kursora. |
display() | Włącza wyświetlacz i odtwarza tekst, jeżeli wyświetlacz został wyłączony za pomocą funkcji noDisplay(). |
noDisplay() | Wyłącza wyświetlacz i zapisuje bieżący tekst. |
scrollDisplayLeft() | Przesuwa tekst o jeden znak w lewo. |
scrollDisplayRight() | Przesuwa tekst o jeden znak w prawo. |
autoscroll() | Automatycznie przesuwa tekst, umieszczając poprzedni znak z lewej lub prawej strony. |
noAutoscroll() | Wyłącza automatyczne przesuwanie tekstu. |
leftToRight() | Ustawia kierunek wyświetlanego tekstu. |
rightToLeft() | Ustawia kierunek wyświetlanego tekstu. |
createChar(int liczba, byte[] dane_znaku) |
Definiuje własny znak użytkownika o wymiarach 5×8 pikseli. |
Rysunek 7.1 przedstawia sposób podłączenia wyświetlacza LCD do Arduino.
UWAGA: Na rysunku 7.1 pin podświetlenia LED+ (jeżeli jest) jest dołączony do pinu 5 V Arduino przez rezystor 68 Ω ograniczający prąd. Wartość odpowiedniego rezystora może być różna i powinna być wyliczona na podstawie specyfikacji podświetlenia. Dostępnych jest wiele instrukcji i kalkulatorów online ułatwiających określenie wartości rezystora odpowiedniego dla Twojego wyświetlacza. Dobrym punktem wyjścia jest artykuł LED Current Limiting Resistors (rezystory ograniczające prąd wyświetlaczy LCD) na stronie firmy SparkFun Electronics pod adresem http://www.sparkfun.com/tutorials/219.
Łączenie komponentów w trybie 4-bitowym
Aby oszczędzić cenne piny I/O dla czujników i innych urządzeń, możesz połączyć wszystkie komponenty w trybie 4-bitowym. Biblioteka LiquidCrystal sama zatroszczy się o komunikację w tym trybie, a więc z programistycznego punktu widzenia nie będzie
żadnej różnicy. Połączone komponenty będą wyglądały jak na rysunku 7.2.
Rysunek 7.1. Połączenie wyświetlacza opartego na układzie Hitachi HD44780 z Arduino
Rysunek 7.2. Podłączenie zasilania i regulacji kontrastu wyświetlacza równoległego Hitachi HD44780
W miarę możliwości w pierwszej kolejności powinieneś sprawdzić dokumentację do swojego wyświetlacza. Będzie przydatna do określenia układu pinów, jeżeli na płycie od strony elementów nie ma ich oznaczeń. Jeżeli na płycie nie ma oznaczeń ani etykiety
z numerem modelu, a wyświetlacz kupiłeś w sklepie internetowym, wejdź na stronę sprzedawcy, ponieważ często znajdują się tam odnośniki do dokumentacji. Jeżeli wyświetlacz wyjąłeś ze starej drukarki lub innego urządzenia i nie możesz znaleźć żadnej informacji na temat układu pinów, wtedy musisz być ostrożny. Większość 16-pinowych układów kompatybilnych z Hitachi 77480 ma ten sam układ pinów, ale błąd w połączeniach może skutkować uszkodzeniem wyświetlacza i samego Arduino.
Zgodnie z diagramem na rysunku 7.1 najpierw podłącz piny Vss i GND. Kolejny pin, Vcc, służy do zasilania wyświetlacza, więc podłącz go do pinu +5 V Arduino (lub 3,3 V, w zależności od wyświetlacza). Następnie podłącz pin V0 wyświetlacza do suwaka (środkowego pinu) potencjometru liniowego 10 kΩ. Podłącz lewy pin do zasilania +5 V, a prawy do masy (GND). Potencjometr zostanie użyty do ustawienia kontrastu wyświetlacza. ale możesz użyć trymera, jeżeli chcesz ustawić kontrast raz na zawsze i o tym
zapomnieć.
UWAGA: Szyny masy i zasilania zostały utworzone z pionowych kolumn oznaczonych znakami + i -.
Po podłączeniu zasilania i regulacji kontrastu możesz zająć się liniami komunikacyjnymi. Połącz pin Register Select (RS) wyświetlacza z pinem cyfrowym nr 12 Arduino. Pin RS będzie użyty do określenia miejsca w pamięci wyświetlacza, w którym Arduino będzie zapisywać znak. Następnie podłącz pin Enable (E) do pinu nr 11 Arduino. Pin Read/Write (RW) może być podłączony bezpośrednio do pinu GND lub pinu cyfrowego nr 10 Arduino (opcjonalnie). Podłączenie pinu RW do pinu nr 10 zamiast do masy umożliwia
uzyskanie dodatkowej funkcjonalności wysyłania informacji z wyświetlacza z powrotem do Arduino. Jeżeli nie chcesz odczytywać informacji z wyświetlacza (w większości przypadków nie ma takiej potrzeby), oszczędź jeden pin cyfrowy i podłącz pin RW bezpośrednio do masy.
Ponieważ używasz trybu 4-bitowego, nie musisz podłączać czterech następnych pinów wyświetlacza (DB0 – DB3). Dotarłeś więc do pinów DB4 – DB7: DB4 połącz z pinem cyfrowym nr 5 Arduino, DB6 z pinem cyfrowym nr 3, a DB7 z pinem cyfrowym nr 2. Jeżeli Twój wyświetlacz jest wyposażony w podświetlenie, pora podłączyć pin LED+ do pinu +5 V Arduino szeregowo poprzez rezystor (patrz uwaga w części 7.2.3), a pin LED- do GND Arduino. Gotowe! Teraz możesz przetestować swój pierwszy szkic i skomunikować się z wyświetlaczem LCD. Jeżeli chcesz jeszcze raz sprawdzić połączenia, skorzystaj z tabeli 7.4.
Szkic sterujący wyświetlaczem Hitachi HD44780
Teraz, kiedy wszystkie komponenty są ze sobą połączone, pokażmy jakiś tekst na wyświetlaczu. Otwórz środowisko Arduino IDE i skopiuj do pustego szkicu kod z listingu 7.1 (albo po prostu uruchom załączony do książki szkic).
Tabela 7.4. Wymagane połączenia pomiędzy wyświetlaczem Hitachi HD44780 a Arduino
Pin Arduino | Pin wyświetlacza |
GND | Vss |
+5V | Vcc |
Pin 2 (suwak) potencjometru liniowego 10 kΩ | V0 |
D12 | Register Select (RS) |
D11 | Enable (E) |
GND lub D10 (opcjonalnie) | Read/Write (RW) |
D5 | DB4 (bit 4) |
D4 | DB5 (bit 5) |
D3 | DB6 (bit 6) |
D2 | DB6 (bit 7) |
+5V podłączony szeregowo przez rezystor (na przykład 68 Ω) | LED+ |
GND | LED- |
Listing 7.1. Prezentacja tekstu na wyświetlaczu LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Utworzenie instancji klasy LiquidCrystal
void setup() {
lcd.begin(16, 2); // Konfiguracja wielkości wyświetlacza
lcd.print("Arduino w akcji"); // Prezentacja tekstu
lcd.setCursor(0,1); // Przejście do nowego wiersza
lcd.print("rządzi!"); // Prezentacja tekstu
}
void loop() {
}
Najpierw musisz dołączyć plik nagłówkowy biblioteki LiquidCrystal, aby poinformować Arduino, że chcesz korzystać z tej biblioteki. Następnie utwórz instancję klasy LiquidCrystal o nazwie lcd i przekaż jako parametry numery pinów Arduino, do których podłączony jest wyświetlacz . Liczba przekazanych argumentów powoduje automatyczną konfigurację obiektu lcd do pracy w trybie 4- lub 8-bitowym.
W funkcji setup skonfiguruj wielkość wyświetlacza , a następnie wpisz jakiś tekst . Ponieważ tekst, który chcesz wyświetlić, jest dłuższy niż pojedynczy wiersz, najpierw wpisz jego jedną część, potem przejdź do drugiego wiersza za pomocą metody setCursor , a następnie wpisz drugą część tekstu .
Załadowanie i test szkicu
Podłącz do Arduino przewód USB i sprawdź, czy szkic kompiluje się bez błędów. Upewnij się, że w poleceniu menu Narzędzia wybrana jest właściwa płyta i port szeregowy. Następnie kliknij ikonę Załaduj. Chwilę po załadowaniu szkicu na wyświetlaczu
powinien pojawić się napis „Arduino w akcji rządzi!” (patrz rysunek 7.3, na którym widać tekst z oryginalnego wydania książki — „Arduino in Action Rocks!”).
Rysunek 7.3. Gotowe podłączenie wyświetlacza równoległego Hitachi HD44780
Świetnie! Jeżeli jednak nic nie widać na wyświetlaczu albo tekst jest niewyraźny, przesuń potencjometr dołączony do pinu V0 i ustaw kontrast właściwy wyświetlacza. Pokazanie tekstu na wyświetlaczu pierwszy raz jest zawsze bardzo ekscytujące, szczególnie wtedy, gdy przekazuje przydatną informację.
Arduino w akcji Autorzy: Martin Evans, Joshua Noble, Jordan Hochenbaum Wydawnictwo: Helion