Dzisiaj testujemy malutki 0.91-calowy wyświetlacz OLED oparty o sterownik SSD1306 i oferujący sterowanie przez I2C. Omawiany tu moduł oferuje dość małą rozdzielczość, raptem 128x32, ale można to łatwo usprawiedliwić jego małą ceną (około 5 zł) i oczywiście małym rozmiarem. Na pewno przyda się w wielu sytuacjach gdzie zależy nam na zmniejszeniu rozmiaru naszego produktu.
Tutaj uruchomię go z Arduino. Ale najpierw nieco informacji:
Ze wstępu to chyba najbardziej mnie zaskoczyło to, że zdaniem producenta pasuje ten wyświetlacz do dodatkowego wyświetlacza telefonu komórkowego... to musi być sprzed wielu lat, ktoś widział taki telefon?
SSD1306 posiada wbudowany SRAM 128 x 64 bitów, używany do przechowywania pikseli. Kontrolujemy tu tylko stan zapalenia piksela, włączony lub nie. Oprócz tego możemy kontrolować poziom jasności całego wyświetlacza. SSD1306 posiada trzy interfejsy, które wybieramy na jego pinach: 8-bitowy 6800/8080, 3/4 liniowe SPI oraz I2C. Dodatkowo oferuje programowalny efekt przewijania horyzontalnego i wertykalnego oraz pozwala na remapowanie wierszy i kolumn.
Na szczęście nie musimy komunikacji z SSD1306 implementować od zera. Przygodę zaczynamy od wybrania biblioteki:
Wybrałem bibliotekę od lexus2k.
W Arduino IDE jest ona dostępna do zainstalowania w Libraries:
Spróbujmy uruchomić jej demko dla SSD1306:
https://github.com/lexus2k/ssd1306/tree/master/examples/demos/ssd1306_demo
Tu jest pierwsza niespodzianka. Przykład korzysta z :
Kod: C / C++
a my mamy wyświetlacz 128 na 32, więc powyższa wersje wyświetli nieczytelny tekst. Zmieniamy na:
Kod: C / C++
Całość podłączyłem pod linie I2C od Arduino, oczywiście też masę i zasilanie. Nie musiałem dawać rezystorów pull-up by to ruszyło, gdyż są one już na PCB.
Rezultat:
Działa, ale demko jest dość pokaźne, więc spróbujemy je rozbić na części i omówić.
Najpierw - załączamy nagłówek i inicjujemy wyświetlacz. Można ustawić też czcionkę:
Kod: C / C++
Potem, w pętli, można przykładowo rysować tekst o różnych stylach czcionki na wybranej przez nas pozycji:
Kod: C / C++
Analogicznie, można rysować linie między dwoma punktami definiowanymi jako pozycje X i Y:
Kod: C / C++
Rezultaty:
Nie czyszczę ekranu, więc linie tworzą się na tekście:
W celu uzyskania większego tekstu po prostu można wybrać większą czcionkę - np. ssd1306xled_font8x16:
Kod: C / C++
To teraz kształty. Spróbujmy na początek zrobić kwadrat. Mamy funkcję rysującą prostokąt, jej pierwsze dwa argumenty to koordynaty jednego rogu, a kolejne dwa to koordynaty naprzeciwległego rogu.
Kod: C / C++
Rezultat:
UWAGA: Koordynaty drugiego rogu muszą być większe niż pierwszego. Przykładowo gdy wpiszemy pierwsze Y większe niż drugie Y, to odpowiednie boki się nie pokażą:
Kod: C / C++
To dlatego, że ssd1306_drawRect korzysta z funkcji rysującej linię:
Kod: C / C++
A z kolei funkcja rysująca linię po prostu korzysta z pętli for:
Kod: C / C++
Ale to jest plus, bo wszystko jest zoptymalizowane.
To teraz prostokąt:
Kod: C / C++
Teraz możemy poszerzyć pomysł i zrobić pasek ładowania. Co stały czas rysujemy wewnątrz pierwszego prostokątu inny, rosnący prostokąt. Nie czyścimy całego ekranu. Pierwszy prostokąt (ramka) cały czas jest na ekranie.
Kod: C / C++
Rezultat:
W kodzie demonstracyjnym też jest przykład użycia ikonki. Okroiłem go dla was do minimum. Ikonkę definiujemy jako bajty, gdzie jeden bit to piksel:
Kod: C / C++
W bibliotece do obsługi tego służy klasa SPRITE. Trzeba utworzyć obiekt tej klasy za pomocą ssd1306_createSprite, podajemy tam wymiar ikony i jej dane.
Kod: C / C++
Kod animuje ją w dość ciekawy i wydajny sposób:
Kod: C / C++
Nie jest tu czyszczony cały ekran, po prostu wołane jest eraseTrace czyli czyszczenie miejsca gdzie ikonka była wcześniej a potem ikonka wyświetlana jest na nowo poprzez draw.
Jednakże eraseTrace nie jest idealne. W przypadku nachodzących na siebie ikon to nieco pomiesza. Utworzyłem demko z wieloma poruszającymi się ikonkami by to zademonstrować:
Kod: C / C++
Rezultat:
Czyli można zarówno rysować teksty, jak i kształty, a również w pewnym stopniu da się je animować. Po więcej przykładów zapraszam do dokumentacji użytej biblioteki.
Podsumowanie
SSD1306 okazał się być bardzo prosty do użycia. Pikseli jest tu trochę mało, ale przy takim rozmiarze wyświetlacza (i cenie) jest to uzasadnione. Dodatkowo plusem jest tutaj możliwość użycia tego wyświetlacza na magistrali I2C wraz z innymi urządzeniami. Może to wydawać się dziwne, ale wiele innych układów z podobnym protokołem komunikacji nie wspiera adresacji, przykładowo taki TM1637.
Również przydatne mogą tu być funkcje pozwalające na przewijanie ekranu. To zwalnia nas z potrzeby animowania tekstów ręcznie.
Bardzo spodobała mi się ta animacja pasku ładowania, na klasycznym 2x16 tego nie widziałem (a przynajmniej nie w takiej formie - bo w formie 'bloczków' tak).
Moduł ten jest jak najbardziej godny uwagi. Zapraszam do komentowania - czy ktoś użył tej "wąskiej" wersji SSD1603 w projekcie, a jeśli tak, to w jakim?
[i]PS: Pokrewny temat ale w wersji płytka z ESP8266:
Jak programować ESP8266 NodeMCU V3 z OLED 0.96 128x64 SSD1306 przez USB?
Fajne? Ranking DIY Pomogłem? Kup mi kawę.
