Wyświetlacze LCD oparte na sterowniku HD44780, takie jak popularny LCD 1602 (2 wiersze po 16 znaków), to jedne z najczęściej używanych modułów w projektach z Arduino. Umożliwiają wyświetlanie tekstu, liczb oraz prostych ikon tworzonych w pamięci CGRAM, co sprawdza się w robotyce, elektronice hobbystycznej i systemach sterowania.

W tym przewodniku pokażemy dwa sposoby podłączenia (klasyczny i przez konwerter I2C), gotowe schematy oraz kod z bibliotekami LiquidCrystal i LiquidCrystal_I2C, a także praktyczne wskazówki i najczęstsze pułapki.

Dlaczego warto używać wyświetlacza LCD w projektach z Arduino?

Wyświetlacze LCD są tanie, energooszczędne i łatwe w obsłudze. W robotyce służą do pokazywania statusu silników, temperatury czujników czy komunikatów błędów. W przeciwieństwie do diod LED pozwalają na wyświetlanie pełnych komunikatów tekstowych. Sterownik HD44780 obsługuje wyświetlacze znakowe o rozmiarach 16×2, 20×4 i pokrewnych (nie jest to sterownik do pełnych wyświetlaczy graficznych). Kluczową zaletą jest tryb 4‑bitowy, który redukuje liczbę linii danych z 8 do 4.

Najważniejsze korzyści wyglądają następująco:

  • niskie zużycie prądu – ok. 2–5 mA bez podświetlenia;
  • pełne komunikaty tekstowe – większa czytelność niż przy samych diodach LED;
  • szeroka kompatybilność – Arduino Uno, Nano, Mega i wiele innych płytek;
  • podświetlenie LED – sterowanie liniami A/K lub tranzystorem PWM dla regulacji jasności.

Co będzie potrzebne do podłączenia?

Oto podstawowy zestaw komponentów dla obu metod podłączenia:

  • wyświetlacz LCD 1602 (HD44780) – wersja z podświetleniem lub bez, zależnie od potrzeb;
  • Arduino – np. Uno lub Nano, z wyprowadzeniami w rastrze 2,54 mm;
  • płytka stykowa i przewody połączeniowe – najlepiej zestaw męsko–żeńskie do szybkiego prototypowania;
  • listwy goldpin – do wlutowania w LCD/konwerter, jeśli nie są fabryczne;
  • konwerter I2C – np. PCF8574, zalecany dla oszczędności pinów mikrokontrolera;
  • potencjometr 10 kΩ – do regulacji kontrastu na pinie VO (często wbudowany na module I2C);
  • rezystor 220 Ω – opcjonalnie do ograniczania prądu podświetlenia LED.

Uwaga – przed zakupem sprawdź specyfikację zasilania: niektóre moduły pracują z 5 V, a inne z 3,3 V. Na Arduino Uno stosuj 5 V, o ile dokumentacja wyświetlacza nie wskazuje inaczej.

Metoda 1 – tradycyjne podłączenie (tryb 4‑bitowy)

Ta metoda wymaga 6 linii sygnałowych + 2 zasilających (VCC, GND): DB4–DB7, RS, E oraz linii VO do regulacji kontrastu.

Schemat podłączenia

Numery i funkcje pinów HD44780 oraz przykładowe przypisanie do Arduino prezentują się tak:

Pin LCD Funkcja Podłączenie do Arduino (przykład)
1 VSS (GND) GND
2 VDD (VCC) 5 V
3 VO (kontrast) Środkowy pin potencjometru (końce: 5 V i GND)
4 RS Pin 10 (cyfrowy)
5 RW GND (tylko zapis)
6 E Pin 9
11–14 DB4–DB7 Piny 8, 7, 6, 5
15 A (podświetlenie +) 5 V przez rezystor 220 Ω
16 K (podświetlenie –) GND

Wskazówka – buduj układ na płytce stykowej, aby łatwo korygować połączenia. Reguluj kontrast potencjometrem: zbyt ciemne pełne prostokąty oznaczają zbyt wysoki kontrast lub brak inicjalizacji.

Biblioteka i kod przykładowy

Zainstaluj bibliotekę LiquidCrystal (wbudowana w Arduino IDE). Przykładowy kod wygląda tak:

#include <LiquidCrystal.h>

// Inicjalizacja: RS, E, DB4, DB5, DB6, DB7
LiquidCrystal lcd(10, 9, 8, 7, 6, 5);

void setup() {
lcd.begin(16, 2); // 16 kolumn, 2 wiersze
lcd.print("Witaj Arduino!");
lcd.setCursor(0, 1); // kolumna 0, wiersz 1
lcd.print("LCD dziala!");
}

void loop() {
// Pusta – statyczny tekst
}

Aby dynamicznie odświeżać treści, używaj: lcd.clear(), lcd.setCursor(kol, wie), lcd.print(tekst).

Metoda 2 – podłączenie z konwerterem I2C (zalecane)

Dlaczego I2C? Redukuje okablowanie do 4 przewodów – VCC, GND, SDA i SCL – co ułatwia prowadzenie wiązek w robotach i pozostawia wolne piny na czujniki.

Schemat podłączenia

Połączenia między konwerterem I2C a Arduino Uno wyglądają następująco:

Pin konwertera Podłączenie do Arduino Uno
VCC 5 V (lub 3,3 V zgodnie ze specyfikacją modułu)
GND GND
SDA A4
SCL A5

Wyświetlacz łączysz z konwerterem taśmą 1:1 (16 pinów jak wyżej). Po uruchomieniu zasilania sprawdź adres I2C (najczęściej 0x27 lub 0x3F) skanerem I2C z Arduino IDE. Wiele płytek I2C ma już wbudowane rezystory podciągające na SDA/SCL.

Biblioteka i kod przykładowy

Zainstaluj bibliotekę LiquidCrystal_I2C (autor: Frank de Brabander). Następnie wgraj poniższy kod:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // Adres, kolumny, wiersze

void setup() {
lcd.init();
lcd.backlight(); // Włącz podświetlenie
lcd.setCursor(0, 0);
lcd.print("Robotyka PL!");
lcd.setCursor(0, 1);
lcd.print("I2C LCD OK");
}

void loop() {
lcd.setCursor(12, 1);
lcd.print(millis() / 1000); // Sekundnik
delay(1000);
}

I2C znacząco upraszcza okablowanie i pozwala łatwo łączyć wiele modułów na wspólnej magistrali.

Zaawansowana obsługa tekstowa

Wyświetlanie znaków specjalnych i polskich liter

Kontroler HD44780 ma 8 komórek CGRAM na własne znaki (np. ikony, strzałki). Możesz je zdefiniować tak:

byte smiley[8] = {
0b00000,
0b01010,
0b00000,
0b00000,
0b10001,
0b01110,
0b00000,
0b00000
};
lcd.createChar(0, smiley);
lcd.write(byte(0)); // Wyświetl uśmiech

Polskie znaki diakrytyczne nie są w pełni dostępne w standardowych tabelach ROM HD44780 – możesz tworzyć najważniejsze litery w CGRAM (maks. 8 na raz) lub użyć bibliotek z mapowaniem znaków, które zamieniają niedostępne znaki na przybliżone odpowiedniki.

Dynamiczne przykłady

Oto trzy praktyczne scenariusze użycia w projektach:

  • sekundnik – użyj lcd.print(millis() / 1000); do prezentacji upływu czasu;
  • czujnik temperatury – z DHT11/DHT22 przygotuj bufor, np. sprintf(buf, "T: %.1fC", temp); lcd.print(buf);;
  • menu robota – dla długich pozycji skorzystaj z lcd.scrollDisplayLeft() lub lcd.scrollDisplayRight().

Częste problemy i rozwiązania

Jeśli coś nie działa, sprawdź poniższe wskazówki:

  • czarny ekran – wyreguluj kontrast potencjometrem i upewnij się, że zasilanie to 5 V/3,3 V zgodnie z modułem;
  • brak podświetlenia – sprawdź polaryzację A/K oraz rezystor 220 Ω (jeśli wymagany przez moduł);
  • nie działa I2C – zeskanuj magistralę (adres 0x27/0x3F), skontroluj połączenia SDA/SCL i obecność rezystorów podciągających;
  • zniekształcony tekst – zweryfikuj poprawność adresu I2C i wersji biblioteki, zrestartuj zasilanie po zmianach;
  • za mało pinów – wybierz interfejs I2C, aby ograniczyć liczbę przewodów w Arduino Uno.

Wskazówka dla robotyki – w projektach z enkoderami czy joystickiem użyj LCD do budowy prostego menu nawigacyjnego. Najpierw przetestuj funkcje na płytce stykowej, a dopiero potem lutuj docelowe połączenia.