Wyświetlacz z SSD1306 podłączony do Arduino
Gdy przychodzi do wyboru wyświetlacza dla Arduino opcji jest sporo. Dziś zajmiemy się niewielkim (0.96 cala) wyświetlaczem o rozdzielczości 128×64. Ma on jasny i wyraźny obraz. Ten egzemplarz akurat ma dziwną konfigurację podłączenia, ale o tym zaraz. Najpierw – jest on monochromatyczny ale jednak dwukolorowy :)
Jak to możliwe? Ano pierwsze 16 linii ma piksele żółte, a reszta niebieskie.
To zdjęcie chyba najlepiej oddaje to, o co chodzi z tym żółtym/niebieskim.
Serce modułu – SSD1306
Kontroler SSD1306 może pracować zarówno jako urządzenie SPI jak i I2C. Jednak niezbadane są drogi którymi podąża umysł Chińczyka… Te moduły które dostaliśmy opis mają jakby miały być w trybie I2C. Jednak są w trybie SPI. Nie widać żadnej zworki, by ten tryb zmienić.
Co więcej, tryb SPI ale… nie ma CS wyprowadzonego. CS układu SSD1306 jest zwarte na stałe do masy, co znaczy, że układ cały czas nasłuchuje na szynie SPI. Dlatego nie podłączysz innego urządzenia do szyny SPI jeśli chcesz podłączyć ten akurat wyświetlacz.
Ale nie bój nic, jeśli użyjesz biblioteki Adafruit do obsługi wyświetlacza, to korzysta ona z programowego SPI (aka bitbanging). Znaczy to, że można wyświetlacz podłączyć do dowolnych pinów, więc SPI w UNO może zostać na podłączania innych urządzeń.
No dobra, skoro już o tym mowa, to….
Jak podłączyć OLED 0.96 do Arduino UNO
O tak! Jak powiedziałem przed chwilą, piny moga być dowolne, testowo zmieniłem zestaw z 12,11,10,9 na 7,6,5,4 i wyświetlacz (po przeprogramowaniu UNO) działa jak działał.
Dobra, czyli jak podłączyć?
[table id=1 /]
Piny 12-9 mogą zostać zmienione na inne trzeba tylko poprawić definicje w szkicu. No to skoro o nim mowa to całość przykładu jest tutaj: oled096-test. Przed jego kompilacją musisz mieć zainstalowane dwie biblioteki od Adafruit – Adafruit_SSD1306 i Adafruit GFX. Obie zainstalujesz przez managera bibliotek w Arduino IDE.
Domyślenie biblioteka Adafruit SSD1306 jest skonfigurowana pod wyświetlacz 128×32, aby wszystko działało jak należy musisz zmienić w pliku Adafruit_SSD1306.h
definicję:
// #define SSD1306_128_64 #define SSD1306_128_32 // #define SSD1306_96_16
na
#define SSD1306_128_64 // #define SSD1306_128_32 // #define SSD1306_96_16
Są to okolice linii 73. Plik ten znajdziesz w katalogu ze szkicami w podkatalogu libraries/Adafruit_SSD1306
. Lokalizację katalogu ze szkicami możesz znaleźć w ustawieniach Arduino IDE (Ctrl+,
)
OLED 096, SSD1306 i grafika z bitmapy
Tutaj mały bonus, jak przygotować sobie taką graficzkę. W sieci można znaleźć taki konwertery do ściągnięcia, ale… Po pierwsze większość była na Windows, a ja pracuję na Ubuntu. Po drugie, po co ściągać skoro pewnie jest strona gdzie się to da zrobić. Oby link działał przez długie lata ;) Potrzebny jest plik, może być PNG, z obrazkiem w dwóch kolorach. Uwaga nie radzi sobie z PNG z przeźroczystością, musi mieć tło.
Przejdź na digole.com (mam nadzieję że ten konwerter będzie działał wiele lat, bo ten blog już prawie 10 lat ciągnie, wiec szkoda by link przestał za jakiś czas działać). Wgraj swój obrazek, i wygeneruj dane.
Rezultat to dwa pola, pierwsze ze współrzędni gdzie się zaczyna obrazek i kończy (użyte logo Nettigo zaczyna się w 0,0
a kończy 128,25
. Wystarczy dane z drugiego pola w odpowiednie miejsce szkicu. W naszym jest to definicja tablicy bitmap
:
const uint8_t PROGMEM bitmap[] = { 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
Narysować na ekranie można obrazek przez:
display.drawBitmap(0,16,bitmap,128,25,1); display.display();
Funkcja drawBitmap
przyjmuje kolejno współrzędne gdzie ma zacząć rysować bimapę (nasz OLED jest dwukolorowy, więc chcę uciec z żółtego pola w pierwszych 16 liniach), tablicę z danymi i rozmiar bitampy. I tyle, można używać…
Co oznacza czas wyświetlany na ekranie: „czas 10092 ms ” ?
@Paweł
To był czas od startu, ZTCP przez kilka sekund wyświetlał logo a potem ten tekst, akurat 10 sekund się razem zebrało.
Mam podobny wyświetlacz tylko wyjścia są podpisane: DC, RES, D1, D0, VCC i GND. Z tyłu jest zwora z możliwością wyboru SPI – I2C (fabrycznie zwarte na SPI). Jak na SPI za mało wyprowadzeń. Przepiąć na I2C i trafiać D0 D1 – SDA SCL ? Ten RES to chyba RST.
@leszek60
Z info znalezionego w sieci, wynika, ze ponoć zwykle D0 to SCL a D1 SCA. Próbuj czy i2c scan znajdzie jakis adres.
Co do SPI – to wyglada na to ze brakuje nieszczęsnego CS. Może będzie działać jako jedyne urządzenie na SPI.
Próbowałem. Skaner nic nie znajduje. Po zamianie też. Trzeba będzie wrócić do SPI.
@leszek60
Jeszcze dla formalności się spytam – nie piszesz do czego podłączasz ten OLED. Jeśli do Arduino, to biblioteka Wire standardowo włącza pullupy a liniach I2C. Ale jeżeli to jest inny µc lub inny soft, to sprawdź jak jest z pullupami…
Do Wemos-a. Zdecydowanie ma pullup-a. Zaraz będę testować na SDI. Może po prostu walnięty?