logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Moduł wyświetlacza OLED 0.91 SSD1306 128x32 I2C - jak uruchomić z Arduino? Jak podłączyć?

p.kaczmarek2 30 Wrz 2024 08:33 1764 11
  • Malutki wyświetlacz OLED z tekstem
    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:
    Fragment opisu technicznego sterownika SSD1306
    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?
    Fragment specyfikacji technicznej z funkcjami wyświetlacza OLED
    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:
    Zrzut ekranu dokumentacji biblioteki ssd1306
    Wybrałem bibliotekę od lexus2k.
    W Arduino IDE jest ona dostępna do zainstalowania w Libraries:
    Zrzut ekranu menedżera bibliotek Arduino z wyszukiwaniem
    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++
    Zaloguj się, aby zobaczyć kod

    a my mamy wyświetlacz 128 na 32, więc powyższa wersje wyświetli nieczytelny tekst. Zmieniamy na:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    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.
    Płytka Arduino z podłączonym wyświetlaczem OLED poprzez kolorowe przewody.
    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++
    Zaloguj się, aby zobaczyć kod

    Potem, w pętli, można przykładowo rysować tekst o różnych stylach czcionki na wybranej przez nas pozycji:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Analogicznie, można rysować linie między dwoma punktami definiowanymi jako pozycje X i Y:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Rezultaty:
    Mały wyświetlacz OLED 0.91 cala z tekstem
    Nie czyszczę ekranu, więc linie tworzą się na tekście:
    Mały wyświetlacz OLED z tekstem i liniami na ekranie.

    W celu uzyskania większego tekstu po prostu można wybrać większą czcionkę - np. ssd1306xled_font8x16:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Malutki wyświetlacz OLED z tekstem
    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++
    Zaloguj się, aby zobaczyć kod

    Rezultat:
    Mały, niebieski kwadrat na 0.91-calowym wyświetlaczu OLED SSD1306.
    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++
    Zaloguj się, aby zobaczyć kod

    Mały wyświetlacz OLED z widocznymi oznaczeniami pinów i niebieskimi liniami.
    To dlatego, że ssd1306_drawRect korzysta z funkcji rysującej linię:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    A z kolei funkcja rysująca linię po prostu korzysta z pętli for:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ale to jest plus, bo wszystko jest zoptymalizowane.

    To teraz prostokąt:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Mały wyświetlacz OLED 0.91 cala z podłączonymi przewodami.
    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++
    Zaloguj się, aby zobaczyć kod

    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++
    Zaloguj się, aby zobaczyć kod

    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++
    Zaloguj się, aby zobaczyć kod

    Kod animuje ją w dość ciekawy i wydajny sposób:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    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++
    Zaloguj się, aby zobaczyć kod

    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ę.
    O autorze
    p.kaczmarek2
    Moderator Smart Home
    Offline 
  • #2 21244539
    rjmp
    Poziom 8  
    Na drugiej stronie płytki (zdjęcia na ali) jest stabilizator 3.3V dla logiki matrycy. Zasilanie matrycy (wg DS) jest od 7V a działa przy zasilaniu 5V (arduino). Ciekawe jakby zasilić 3.3V (zewrzeć stabilizator).
  • #3 21244565
    p.kaczmarek2
    Moderator Smart Home
    Informacje od sprzedawców sugerują, że to ruszy normalnie na 3.3V:
    Specyfikacja wyświetlacza OLED 0,91 cala z napięciem zasilania 3,3V-5V
    Wyświetlacz OLED 0.91 cala z tekstem na ekranie i specyfikacją techniczną.
    Pomogłem? Kup mi kawę.
  • #4 21244576
    lopr_pol
    Poziom 31  
    Te wyświetlacze wypalają się w ekspresowym tempie, także żadne cudo ;)
  • #5 21244622
    austin007
    Poziom 17  
    >>21244576 Jak wygląda wypalenie w tym oledzie? Powoli piksele ciemnieją czy przestają nagle świecić? Jaką realną żywotność mogą mieć tu piksele? Technologia pewnie podobna w 1.3" od majfrienda? Miałem użyć do zegara, ale kiedyś zrezygnowałem na rzecz LCD właśnie w obawie o szybkie wypalenie. Użyłem do urządzeń, gdzie wyświetlacz nie pracuje długo.
  • #6 21244995
    tmf
    VIP Zasłużony dla elektroda
    p.kaczmarek2 napisał:
    nformacje od sprzedawców sugerują, że to ruszy normalnie na 3.3V:

    Problemem jest brak konwersji na liniach sterujących. 5V może je ubić.
    lopr_pol napisał:
    Te wyświetlacze wypalają się w ekspresowym tempie, także żadne cudo

    W nocie OLEDa (matrycy) są dane o czasie świecenia. Zwykle to jest 15-50tys. godzin, w zależności od producenta. Można ten czas znacznie wydłużyć, zmniejszając prąd OLEDa. W praktyce utrata jasności jest minimalna, natomiast wydłużenie żywotności duże.
    austin007 napisał:
    Jak wygląda wypalenie w tym oledzie? Powoli piksele ciemnieją czy przestają nagle świecić?

    Stopniowo zmniejsza się jasność. Nie jest to problemem o ile nie wyświetlasz dużych, jednorodnych obszarów.
  • #7 21246012
    sq3evp
    Poziom 36  
    tmf napisał:

    W nocie OLEDa (matrycy) są dane o czasie świecenia. Zwykle to jest 15-50tys. godzin, w zależności od producenta.

    15 tys godzin to 625 dni (ok 1 rok o 8-9 miesięcy ciągłej pracy) ciągłego świecenia, prawie rok, w tej cenie to chyba może być. Pytanie czy sens załączać cały czas wyświetlacz?
    50 tys to 2083 dni, czyli ponad 5,5 roku.
    Chyba nie jest źle.
  • #8 21246271
    tmf
    VIP Zasłużony dla elektroda
    sq3evp napisał:
    Chyba nie jest źle.

    Jeśli obniżysz jasność to pewnie wyjdzie jeszcze więcej. Poza tym czas jest liczony do jakiegoś tam obniżenia jasności. Więc OLEDy nie są takie złe. Czytelność, kontrast, czas reakcji - tu biją na głowę LCD.
  • #9 21246273
    RomanWorkshop
    Poziom 13  
    Gdyby ktoś szukał procedur do podstawowej obsługi wyświetlacza OLED I2C (sterownik SSD1306), napisanych w asemblerze mikrokontrolerów ATtiny/ATmega, to takowe są już dostępne: używając sprzętowego modułu TWI lub całkowicie programowo (bit-bang).
  • #10 21246833
    coberr
    Poziom 20  
    te wyswietlacze sa tak okropnie male - ze aż niepraktyczne...
    widać to dopoiero - jak sie ma w rekach taki działajacy wyświetlacz...

    dziwie sie - ze jeszcze chinczycy je "klepią" w tym rozmiarze i tej rozdzielczosci...
  • #11 21246975
    sq3evp
    Poziom 36  
    tmf napisał:
    Więc OLEDy nie są takie złe. Czytelność, kontrast,
    czas reakcji - tu biją na głowę LCD.

    To się zgadzam - mam kilka urządzeń z prostymi wyświetlaczami OLED i biją na głowę inne.
  • #12 21247620
    gemiel
    Poziom 25  
    Wszystko zależy od zastosowania wyświetlacza oraz preferencji użytkownika. Skoro produkuje się od wielu lat damskie zegarki mechaniczne, które mają tarcze o średnicy kilkunastu milimetrów, widocznie można coś na nich odczytać. Kwestia jakości wzroku. Po wielu latach też zacząłem wielbić coraz większe wyświetlacze.
    Ostatnio musiałem użyć odbiornika ATS-20 z wyświetlaczem OLED w słoneczny dzień. Wielkość znaków można skompensować okularami. Natomiast przy dużym natężeniu oświetlenia zewnętrznego, na wyświetlaczu nie widać nic.
    Jednak te maleńkie wyświetlacze mają swoje zalety. Można je montować jako wyświetlacze informacyjne w wielu małych urządzeniach.

Podsumowanie tematu

Moduł wyświetlacza OLED 0.91" oparty na sterowniku SSD1306 z interfejsem I2C ma rozdzielczość 128x32. Użytkownicy omawiają jego zasilanie, które może działać na 3.3V, mimo że producent zaleca 5V. Wskazują na problem wypalania pikseli, które mogą trwać od 15 do 50 tys. godzin, w zależności od ustawień jasności. Zmniejszenie jasności może wydłużyć żywotność wyświetlacza. Użytkownicy podkreślają, że mimo małych rozmiarów, wyświetlacze OLED oferują lepszą jakość obrazu w porównaniu do LCD, ale ich praktyczność w zastosowaniach zależy od kontekstu użycia. Wskazano również na dostępność procedur do obsługi wyświetlacza w asemblerze dla mikrokontrolerów ATtiny/ATmega.
Podsumowanie wygenerowane przez model językowy.
REKLAMA