Wemos D1: podłączenie wyświetlacza LCD

Do projektu stojaka na kartridże użyłem Wemos D1 (zobacz: stojak na kartridże: wersja IOT). Wemos sterował wyświetlaczem LCD 16×4 poprzez interfejs i2c. W tym tekście pokazuję jak taki wyświetlacz podłączyć i oprogramować.

Wemos D1 mini

Wemos D1 Mini to ESP8266 otoczony kilkoma dodatkami. Najważniejszy z nich to port USB, który umożliwia łatwe programowanie układu z poziomu Arduino IDE. Na płytce znajduje się też stabilizator napięcia, który pozwala na zasilenie układu z 5v (max 5.5v). Dzięki tym dodatkom użycie ESP8266 staje się bardzo łatwe. Wystarczy kabel USB i środowisko Arduino z dodatkowymi bibliotekami do obsługi ESP.

Całą procedurę instalacji oraz krótką instrukcję użytkowania znajdziecie w osobnym poście: Wemos D1 mini: ESP8266 trochę inaczej.

Wyświetlacz

Mój wyświetlacz to alfanumeryczny LCD o 16 kolumnach i 4 rzędach. Wyświetla białe litery na niebieskim, podświetlanym tle.

Co jednak ciekawe, mimo że wyposażony z HD44780, do jego sterowania wystarczą dwa przewody! Spójrzcie na tył wyświetlacza:

Do wyjść wyświetlacza przylutowano sterownik oparty na układzie PCF8574AT. Dzięki takiemu zabiegowi, całością steruje się przez interfejs I2C.

Wystarczy podłączyć linie SDA i SCL, zasilanie 5v oraz masę.

Poziomy napięć

Wemos (a właściwie ESP8266) posługuje się logiką 3.3v. Z kolei wyświetlacz działa na logice 5v. Konieczne jest więc użycie dodatkowego konwertera, który dopasuje poziomy napięć.

W niektórych poradnikach, wyświetlacze 5v na i2c podłączane są bezpośrednio do ESP8266 (lub płytki Wemos). Być może piny ESP to wytrzymają, ja wolałem nie ryzykować.

W tym celu użyłem taniego konwertera. Kosztuje grosze, a zabezpieczy Wemos’a przed niepożądanymi skutkami zbyt wysokiego napięcia na pinach i2c.

W sprzedaży są bardzo różne konwertery. Upewnijcie się, że używacie takich, które umożliwiają komunikację dwukierunkową.

Użyty przeze mnie model konwertera dostarcza 4 kanały. Poszczególne piny oznaczają:

  • GND: masa, podłącz obydwie,
  • LV: niskie napięcie, podłącz 3.3v z Wemos,
  • HV: wysokie napięcie: podłącz 5v z Wemos,

W tym momencie piny LVx konwertera przyjmują 3.3v z Wemos, a piny konwertera oznaczone HVx – działają na 5v pasujących wyświetlaczowi.

Podłączenie

Podłącz:

  • 5v do pinu 5v Wemos, pinu HV konwertera i zasilania wyświetlacza,
  • 3.3v do pinu 3v3 Wemos i LV konwertera,
  • masę do pinu G Wemos, pinów GND konwertera i masy wyświetlacza,
  • D1 Wemos do LV1 konwertera (SCL),
  • D2 Wemos do LV2 konwertera (SDA),
  • HV1 konwertera do SCL wyświetlacza,
  • HV2 konwertera do SDA wyświetlacza.

Tyle wystarczy, żeby uruchomić wyświetlacz.

Oprogramowanie

Bibliotekę Arduino-LiquidCrystal_I2C do obsługi wyświetlacza znajdziecie tutaj: Github fdebrabander. Wystarczy ją ściągnąć i rozpakować do folderu z waszymi bibliotekami dla Arduino.

Biblioteka ta zadziałała mi już za pierwszym razem z jednym wyjątkiem: implementacja metody setCursor nie jest poprawna dla wyświetlaczy o 16 kolumnach (czyli taki, jaki mam ja). Jeżeli wywołacie tą funkcję dla takiego wyświetlacza, kursor (od którego wyświetlają się znaki) ustawi się w nieprawidłowej pozycji. Powodem tego jest tablica przesunięć rzędów zadeklarowana na sztywno w pliku LiquidCrystal_I2C.cpp:

W ten sposób zadeklarowana tablica row_offsets[] zadziała jedynie (jak sądzę, nie miałem okazji sprawdzić) dla wyświetlacza z 20 kolumnami. Należy ją zmienić na:

Teraz będzie działała dla wyświetlacza o 16 kolumnach (ale nie dla takiego o 20 kolumnach:)).

To oczywiście niezbyt łady hack. Zachęcam Was do poprawienia jej zgodnie ze sztuką!

Podstawowe metody:

 Wywołanie  Opis
LiquidCrystal_I2C lcd(0x38, LCD_COLUMNS, LCD_ROWS); Tworzy obiekt wyświetlacza lcd. 0x38 to adres urządzenia wyświetlacza – tu PCF8574AT (może być też np. 0x20 dla PCF8574T). Druga i trzecia liczba to ilość kolumn i wierszy, u mnie:
#define LCD_COLUMNS 16
#define LCD_ROWS 4
lcd.begin() Inicjalizacja biblioteki – dodajcie do setup()
lcd.backlight() Włączenie podświetlenia
lcd.noBacklight() Wyłączenie podświetlenia
lcd.setCursor(col, row) Przesuń kursor do pozyczji col (kolumna) i rząd (row), np. lcd.setCursor(0,0) – ustawi kursor w górnym-lewym rogu ekranu.
lcd.print(„Witaj”) Wyświetl napis „Witaj” na LCD w miejscu, gdzie ustawiony jest kursor.
lcd.clear() Wyczyść wyświetlacz.

Biblioteka ta zawiera też wiele metod, które nie są zaimplementowane. Jeżeli macie inne biblioteki, które Wam zadziałały – podzielcie się informacjami o nich w komentarzach:)

Krótki kod

Zacznijcie od dodania biblioteki Wire (dostarczona z pakietem instalującym obsługę Wemos dla Arduino IDE). Podobnie dodajcie  Arduino-LiquidCristal_I2C.

Dla mojej wygody dodałem definicje ilości kolumn, wierszy i pinów, do których podłączony jest wyświetlacz. Stworzyłem odpowiedni obiekt lcd:

Pozostaje zainicjować komunikację po I2C (biblioteka Wire), lcd – i coś wyświetlić:

Resztę zabawy zostawiam już Wam:)

Podsumowanie

Jak sami widzicie – uruchomienie wyświetlacza okazało się naprawdę proste. Wybrana przeze mnie biblioteka nie jest może najlepsza,  ale za to zadziałała od pierwszego razu – czego nie mogę powiedzieć o kilku innych, które próbowałem. Trzeba ją trochę poprawić dla wyświetlaczy o 16 kolumnach (metoda setCursor).

Dyskusyjne może być użycie dodatkowego konwertera napięć. Niektóre źródła mówią, że piny ESP i2c wytrzymują 5v. Wydaje mi się jednak, że dodanie tego elementu kosztuje tak niewiele, że nie ma co ryzykować.

No, to czas wmontować wyświetlacz do stojaka na kartridże🙂

Dodaj komentarz