Proje Defteri

TFT Görsel Çevirici

Resmi RGB565 C dizisine çevirin, panelin gerçek piksel ızgarasında önizleyin ve flash maliyetini anında görün. ILI9341, ST7789, ST7735, GC9A01 ve ILI9488 için hazır ölçüler, TFT_eSPI ile Adafruit_GFX taslağı ve çoklu kare desteği. Dosyalar tarayıcıdan çıkmaz.

Görsel seçin PNG, JPG, GIF, WebP, BMP veya SVG sürükleyin, tıklayın ya da panodan yapıştırın. Birden fazla dosya seçerseniz hepsi tek başlık dosyasına girer.

x
0
0

Bayt sırası seçeneğini kapalı bırakıp TFT_eSPI tarafında setSwapBytes(true) demek en yaygın kurulumdur. Araç hangisini seçerseniz seçin taslaktaki satırı ona göre yazar.

Diziyi görmek için bir görsel yükleyin.

Resmi TFT ekranda göstermenin kısa yolu

Bir mikrodenetleyicide ekrana resim basmanın yolu dosya okumak değil, resmi derleme zamanında bir C dizisine çevirmektir. ILI9341, ST7789, ST7735, GC9A01 ve ILI9488 gibi sürücülerin hepsi piksel başına 16 bit RGB565 bekler. Bu sayfa görseli o biçime indirger, sonucu panelin gerçek çözünürlüğünde gösterir ve ortaya çıkan dizinin kaç bayt tuttuğunu söyler.

RGB565 nasıl paketlenir

Kırmızının üst 5 biti, yeşilin üst 6 biti ve mavinin üst 5 biti tek bir 16 bitlik sözcüğe sıkıştırılır:

uint16_t rgb565 = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);

Yeşile bir bit fazla verilmesinin sebebi göz duyarlılığıdır. Sonuçta kanal başına 32, 64 ve 32 kademe kalır; 24 bitlik kaynaktaki yumuşak geçişler bu kademelere oturduğu için gradyanlarda bantlanma görürsünüz. Bantlanmayı kırmak için dithering seçeneğini açın, Floyd-Steinberg yuvarlama hatasını komşu piksellere dağıtır.

Diziyi ekrana basmak

TFT_eSPI tarafında tek satır yeterlidir. Kütüphanenin diziyi doğru okuması için bayt sırasının bir kez ayarlanması gerekir:

#include <TFT_eSPI.h>
#include "tft_image.h"

TFT_eSPI tft = TFT_eSPI();

void setup() {
  tft.init();
  tft.fillScreen(TFT_BLACK);
  tft.setSwapBytes(true);           // dizi big-endian üretildiyse
  tft.pushImage(0, 0, TFT_IMAGE_WIDTH, TFT_IMAGE_HEIGHT, tft_image);
}

Adafruit_GFX kullanıyorsanız karşılığı tft.drawRGBBitmap(x, y, dizi, genislik, yukseklik) olur. Bu API bayt çevirmez, dolayısıyla Adafruit tarafında Bayt sırasını çevir seçeneğini kapalı bırakın.

Renkler ters çıkıyorsa

Mavi ile kırmızının yer değiştirmesi, resmin bozuk olduğu anlamına gelmez; iki baytın sürücüye ters sırada gitmesi demektir. Çözüm tek bir yerde: ya diziyi çevrilmiş üretin ya da kütüphaneye çevirtin, ikisini birden yapmayın. Aynı görsel bir kartta doğru, diğerinde ters görünüyorsa aradaki fark genellikle bu satırdır.

Flash maliyeti ve nereye sığdığı

RGB565'te bir görselin boyutu basitçe genişlik x yükseklik x 2'dir. Birkaç yaygın ölçü:

Yani tek bir tam ekran görsel Arduino Uno'nun 32 KB flash'ının tamamını aşar, ESP32'nin 1,25 MB uygulama bölümünde ise rahatça durur. Sayfadaki bütçe çubukları bu karşılaştırmayı anlık yapar. Yer sıkıntısı varsa sırasıyla şunları deneyin: görseli küçültün, RGB332 veya 8 bit gri seçin, ya da tek renkli bir logo için LCD Assistant ile 1 bit bitmap üretin, o biçim piksel başına 1 bit tutar.

Yuvarlak ekranlar ve saydamlık

GC9A01 gibi yuvarlak paneller yine kare bir tampon bekler, sadece köşeleri göstermez. Yuvarlak maske seçeneği daire dışındaki pikselleri arka plan rengine boyar ve önizlemeyi gerçek çerçeveye geçirir, böylece taşan köşeler yüzünden hizalama yanılgısı yaşamazsınız. Arka planı ekranda görünmesin istemiyorsanız saydam renk kutusunu işaretleyin; üretilen taslak pushImage çağrısına o rengi saydam olarak geçirir, o renkteki pikseller ekranda olduğu gibi bırakılır.

Çoklu kare ve animasyon

Birden fazla dosya seçerseniz hepsi tek başlık dosyasına girer ve sona bir _frames[] işaretçi tablosu eklenir; üretilen TFT_eSPI taslağı da bu tabloyu döngüde gezer. Kaynak bir GIF ise kareleri tek tek ayırmak yerine GIF'ten OLED animasyon aracına bakın. Tek bir rengin RGB565 karşılığını merak ediyorsanız RGB565 renk çevirici daha hızlı, LVGL kullanıyorsanız LVGL görsel çevirici lv_image_dsc_t biçimini üretir.

Sık Sorulan Sorular

Ekranda renkler ters çıkıyor

Bayt sırası sorunudur. TFT_eSPI'de tft.setSwapBytes(true) ekleyin veya buradaki Bayt sırasını çevir kutusunu işaretleyin. İkisini birden yaparsanız sorun geri gelir, çünkü çevirme iki kez uygulanır.

Görsel ekranda kaymış veya bozuk çiziliyor

Çoğunlukla dizideki genişlik ile pushImage çağrısına geçirilen genişlik farklıdır. Başlık dosyasındaki _WIDTH ve _HEIGHT tanımlarını kullanın, sayı elle yazmayın. İkinci sık sebep ekran döndürmesidir: setRotation değeri, görseli hazırlarken seçtiğiniz en boy oranıyla uyuşmalı.

Gradyanlarda bantlanma var

RGB565 kanal başına 32/64/32 kademe verir, yumuşak geçişler bu kademelere oturur. Dithering seçeneğini açın. Keskin kenarlı logolarda kapalı bırakın, orada sadece kenarlara gürültü ekler.

Derleyici "section .text will not fit in region" diyor

Dizi flash'a sığmıyor. Görseli küçültün, RGB332 veya 8 bit gri seçin ya da görseli SPIFFS/LittleFS'e ham .bin olarak koyup çalışma anında okuyun; sayfadaki Ham .bin indir düğmesi tam bu dosyayı üretir.

PROGMEM'i kapatmalı mıyım?

AVR'de asla kapatmayın, dizi RAM'e kopyalanır ve kart açılışta durur. ESP32 ve RP2040'ta PROGMEM zaten etkisizdir, const veriler doğrudan flash'tan okunur, bu yüzden orada işaretli bırakmanın bir maliyeti de yoktur.

Görsellerim bir yere yükleniyor mu?

Hayır. Dosyalar tarayıcı belleğine okunur, canvas üzerinde işlenir ve hiçbir aşamada ağ isteği yapılmaz. Sayfa açıldıktan sonra çevrimdışı da çalışır.