OLED Bitmap Oluşturucu
SSD1306 ve benzeri monokrom ekranlar için ızgaraya piksel piksel ikon çizin, kodu Adafruit GFX, U8g2 (XBM), dikey bayt sırası ya da düz hex olarak alın. Elinizdeki diziyi yapıştırıp düzenleyebilirsiniz.
1:1 önizleme
Yapıştırmadan önce yukarıdan doğru ızgara boyutunu ve dizinin bayt düzenine uyan çıktı biçimini seçin.
OLED bitmap dizisi nasıl çalışır?
SSD1306 gibi tek renkli bir OLED ekranda her piksel yalnızca iki durumda olabilir: yanık ya da sönük. Bu yüzden bir görüntü tek tek piksel yerine bit olarak saklanır ve sekiz piksel tek bir bayta sığar. 128x64 bir ekranın tamamı böylece 8192 bit, yani 1024 bayt yer kaplar. Çizdiğiniz ikon da aynı mantıkla bir unsigned char dizisine dönüşür.
Bitlerin diziye hangi sırayla yerleştiğini bayt düzeni belirler ve kütüphaneler bu konuda anlaşmış değildir. Yatay düzende bir bayt, bir satırdaki sekiz komşu pikseli taşır ve satır sonunda kalan boşluk sıfırla doldurulur. Dikey düzende ise bir bayt, bir sütundaki sekiz alt alta pikseli taşır; SSD1306 denetleyicisi kendi belleğini bu şekilde, sekiz satırlık sayfalar halinde tuttuğu için ham veri gönderirken bu düzen gerekir.
Hangi çıktı biçimini seçmeliyim?
Adafruit GFX seçeneği en yaygın olanıdır ve display.drawBitmap(x, y, dizi, genislik, yukseklik, renk) çağrısıyla doğrudan çalışır. Her baytın bit 7'si satırın en solundaki pikseldir.
XBM / U8g2 seçeneği de yataydır ama bit yönü terstir: en soldaki piksel bit 0'dır. U8g2 kütüphanesinin drawXBMP fonksiyonu bu düzeni bekler. İki biçimi karıştırırsanız görüntü sekizerli bloklar halinde ayna gibi ters görünür, bu da en sık yapılan hatadır.
Dikey bayt sırası yalnızca ekrana kütüphane katmanı olmadan yazarken, u8x8 karo fonksiyonlarıyla çalışırken ya da ham tampon bekleyen kütüphanelerde gerekir. Düz hex ise diziyi kendi şablonunuza gömmek istediğinizde işe yarar, C bildirimi eklemez.
Belleği israf etmemek
Arduino Uno ve Nano gibi AVR kartlarında toplam SRAM 2048 bayttır. Tam ekran bir 128x64 bitmap tek başına 1024 bayt tutar, yani PROGMEM kullanmazsanız belleğin yarısı bir görüntüye gider ve kart açıklanamayan şekilde kilitlenmeye başlar. Diziyi flash bellekte tutmak için bildirimi const unsigned char PROGMEM ile yapın; Adafruit GFX ve U8g2 flash'taki diziyi okumayı kendisi halleder. ESP32 ve ESP8266 kartlarında bu sınır sorun olmaz ama işaret zararsızdır.
Pratikte tam ekran görüntü yerine küçük ikonlar çizip ekranda konumlandırmak hem çok daha az yer tutar hem de arayüzü esnek bırakır. 16x16 bir ikon yalnızca 32 bayttır; onunla bir simge seti kurup ekranı parça parça çizebilirsiniz.
Hazır görselden dönüştürmek
Elinizde çizim değil de bir dosya varsa bu araç yerine image2cpp görselden C array aracımızı kullanın; PNG, JPG ve BMP dosyalarını eşikleme ve dithering seçenekleriyle diziye çevirir. Hareketli görüntü için GIF'ten OLED animasyon aracı kareleri tek tek dışa aktarır. Ekranda yazı tipi seçmek istiyorsanız U8g2 font listesi hangi fontun ne kadar yer kapladığını gösterir.
Sıkça sorulan sorular
Adafruit GFX ile U8g2 çıktısı arasındaki fark nedir?
İkisi de yatay bayt sırası kullanır ama bit yönü terstir. Adafruit GFX drawBitmap fonksiyonu her baytın en anlamlı bitini (bit 7) satırın en solundaki piksel olarak okur. U8g2 drawXBMP ise XBM geleneğini izler ve en anlamsız biti (bit 0) en soldaki piksel kabul eder. Yanlış olanı seçerseniz görüntü sekizerli gruplar halinde ayna gibi ters çıkar.
Dikey bayt sırası ne zaman gerekir?
SSD1306 denetleyicisi kendi belleğini sekiz satırlık sayfalar halinde tutar ve her bayt bir sütunun sekiz pikselini taşır. Ekrana kütüphane kullanmadan doğrudan I2C ya da SPI üzerinden veri gönderiyorsanız, u8x8 karo fonksiyonlarıyla çalışıyorsanız veya SSD1306Ascii gibi ham tampon bekleyen bir kütüphane kullanıyorsanız dikey sırayı seçin. Adafruit GFX ve U8g2 çizim fonksiyonları dikey diziyi doğru yorumlamaz.
Elimdeki C array'i buraya yapıştırıp düzenleyebilir miyim?
Evet. Önce üstteki boyut listesinden dizinin gerçek genişlik ve yüksekliğini, çıktı biçiminden de dizinin bayt düzenini seçin, sonra diziyi içe aktarma kutusuna yapıştırın. Araç bayt sayısını seçtiğiniz boyutla karşılaştırır; uyuşmazsa beklenen ve gelen bayt sayısını söyler. Onaltılık, onluk ve ikilik yazım ile tam C bildirimi ve XBM bloğu kabul edilir.
PROGMEM işaretini neden kullanmalıyım?
AVR tabanlı kartlarda (Arduino Uno, Nano, Mega) sabit diziler varsayılan olarak SRAM'e kopyalanır. 128x64 tek renkli bir bitmap 1024 bayt tutar; Uno'nun toplam SRAM'i 2048 bayttır, yani tek bir tam ekran görüntü belleğin yarısını yer. PROGMEM diziyi flash bellekte bırakır. ESP32 ve ESP8266 üzerinde bu baskı yoktur ama işaret zararsızdır ve kod taşınabilir kalır.
Çizdiğim ikon ekranda kaymış ya da bozuk çıkıyor, sebebi ne?
En sık üç sebep var. Birincisi bit yönü: Adafruit GFX yerine XBM çıktısı almış olabilirsiniz, görüntü sekizerli bloklar halinde ters görünür. İkincisi genişlik: drawBitmap çağrısına verdiğiniz genişlik, diziyi üretirken seçtiğiniz genişlikten farklıysa satırlar kayarak çapraz bir desen oluşur. Üçüncüsü bayt yönü: dikey sırada üretilmiş diziyi yatay bekleyen bir fonksiyona verirseniz görüntü tanınmaz hale gelir.
Hazır bir görseli dönüştürmek istersem ne yapmalıyım?
Bu araç boş ızgaraya elle çizmek ve mevcut diziyi piksel düzeyinde düzeltmek içindir. Elinizde PNG, JPG ya da BMP dosyası varsa image2cpp aracımız eşikleme ve dithering seçenekleriyle dosyayı doğrudan C array'e çevirir. Hareketli GIF için GIF'ten OLED animasyon aracını kullanın.
Çizimim kaybolur mu?
Çizim her değişiklikte tarayıcınızın yerel deposuna kaydedilir, sayfayı yenilediğinizde kaldığınız yerden devam edersiniz. Veri sunucuya gönderilmez, tamamen sizin cihazınızda kalır. Gizli sekmede ya da site verisi engelliyse kayıt yapılamaz, araç yine de normal çalışır.