Obrazy TFT_eSPI: napraw kolory RGB565 i kolejność bajtów

Jeśli obraz ma właściwy kształt, ale błędne kolory w TFT_eSPI, przetestuj dwie rzeczy oddzielnie: konfigurację RGB/BGR wyświetlacza oraz kolejność bajtów danych obrazu. Zmiana obu naraz utrudnia określenie, które ustawienie naprawiło problem.
Mały wzór jest tu bardziej przydatny niż fotografia. Czerwień, zieleń, niebieski, biel i czerń dają wartości, które rozpoznasz bez zgadywania, jak wyglądał oryginalny obraz.
Najpierw rysuj jednolite kolory
Dodaj tę funkcję do szkicu, który już poprawnie inicjuje wyświetlacz. Wywołaj ją po tft.init() i ustawieniu rotacji. Zakłada ona, że obiekt wyświetlacza nazywa się tft, a ekran ma co najmniej 100 × 20 pikseli.
void drawColorReference() {
const uint16_t colors[] = {
TFT_RED, TFT_GREEN, TFT_BLUE, TFT_WHITE, TFT_BLACK
};
for (int i = 0; i < 5; ++i) {
tft.fillRect(i * 20, 0, 20, 20, colors[i]);
}
}
Syntetyczny wzór testowy, 100 × 20: pięć równych pasów — czerwony, zielony, niebieski, biały, czarny. To nie jest zdjęcie sprzętu. Pobierz referencyjny PNG i przekonwertuj go przez swój konwerter, aby porównać ścieżkę zasobów z renderowaniem jednolitych kolorów.
Jeśli te prostokąty są błędne, pracuj nad konfiguracją wyświetlacza przed konwersją kolejnego obrazu. Wybrany sterownik, wymiary panelu i kolejność kolorów należą do konfiguracji sprzętowej. Plik User_Setup.h biblioteki TFT_eSPI dokumentuje odpowiednie opcje, w tym TFT_RGB_ORDER dla obsługiwanych sterowników.
Jeśli czerwień pojawia się jako niebieski, a niebieski jako czerwień, podczas gdy zieleń pozostaje zielona, kolejność RGB/BGR jest prawdopodobnym podejrzanym. Sprawdź konfigurację rzeczywistego panelu, zamiast zakładać, że każdy moduł sprzedawany pod tą samą nazwą kontrolera zachowuje się identycznie.
Następnie przetestuj ścieżkę obrazu
Gdy jednolite prostokąty będą poprawne, wyślij tablicę RGB565 przez pushImage(). Ten drugi wzór jest rysowany niżej na ekranie, więc zapewnij łącznie co najmniej 100 × 32 piksele:
void drawImageReference() {
static const uint16_t strip[] = {
0xF800, 0x07E0, 0x001F, 0xFFFF, 0x0000,
0xF800, 0x07E0, 0x001F, 0xFFFF, 0x0000
};
const bool previous = tft.getSwapBytes();
tft.setSwapBytes(false);
tft.pushImage(0, 24, 5, 2, strip);
tft.setSwapBytes(true);
tft.pushImage(0, 30, 5, 2, strip);
tft.setSwapBytes(previous);
}Daje to dwa malutkie wzory 5 × 2, po jednym dla każdego ustawienia zamiany bajtów. Sprawdź, który odpowiada kolorom referencyjnym. W razie potrzeby użyj lupy; mała tablica ułatwia audyt każdej wartości.
Biblioteka deklaruje setSwapBytes() specjalnie dla kolejności bajtów pikseli w swoim nagłówku API. Poprawne ustawienie zależy od tego, jak zasób jest przechowywany i która ścieżka API go odczytuje. Traktuj wynik jako sprawdzenie tej reprezentacji zasobu, a nie uniwersalne ustawienie dla każdej bitmapy w projekcie.
Zamiana bajtów to nie zamiana czerwieni i niebieskiego
W RGB565 czerwień to 0xF800. Jej bajty to F8 i 00; ich odwrócenie daje 0x00F8. Zmienia to upakowaną wartość liczbową. Nie zamienia po prostu kanałów czerwonego i niebieskiego.
Dlatego dwa objawy wymagają różnych sprawdzeń:
| Co widzisz | Co sprawdzić najpierw |
|---|---|
| Jednolite prostokąty czerwony i niebieski są zamienione | Konfiguracja RGB/BGR panelu |
| Jednolite prostokąty wyglądają dobrze, zaimportowane kolory wyglądają źle | Kodowanie zasobu i kolejność bajtów |
| Wiersze zawijają się lub tworzą ukośne pasy | Szerokość, wysokość i długość tablicy |
| Wszystko jest puste, łącznie z jednolitymi prostokątami | Inicjalizacja wyświetlacza, okablowanie, podświetlenie i sterownik |
Eksportuj zasób dla TFT_eSPI
W Lopaka wybierz TFT_eSPI przed zaimportowaniem obrazu, a następnie wyeksportuj dane wraz z wygenerowanym wywołaniem rysowania. Jeśli później zmienisz bibliotekę docelową, wygeneruj zasób ponownie, zamiast przenosić starą tablicę bajtów do nowego firmware.
Kompletny przepływ układu opisuje przewodnik po niestandardowym interfejsie wyświetlacza TFT. Przewodnik po integracji TFT_eSPI obejmuje konfigurację sprzętową i wygenerowany kod rysowania.
Przygotuj najpierw wzór diagnostyczny, potem logo, a potem pełny ekran. Jeśli zawodzi tylko pełny ekran, zawęziłeś problem do tego zasobu lub ścieżki pamięci, której używa.
Częste pytania
Czy zawsze powinienem wywoływać setSwapBytes(true)?
Nie. Dopasuj ustawienie do tablicy i ścieżki rysowania. Przywróć je po lokalnym teście, aby późniejsze renderowanie nie odziedziczyło ustawienia, o którym zapomniałeś.
Czy tablica RGB565 może zachować przezroczystość PNG?
RGB565 nie ma składowej alfa. Przezroczysty PNG potrzebuje wybranego tła lub metody rysowania z jawną obsługą przezroczystości. Ciemna ramka wokół logo może wynikać ze spłaszczenia go na niewłaściwym tle.
Czy różni się to dla ST7789 i ILI9341?
Test działa z oboma, gdy TFT_eSPI już steruje panelem. Szczegóły ich konfiguracji nadal się różnią. Zachowaj konfigurację panelu, która sprawia, że jednolite kolory są poprawne, a następnie diagnozuj zaimportowane zasoby niezależnie.