Wst臋p
Kiedy kupujemy wy艣wietlacz TFT z rodziny ST77xx (ST7789, ST7735, ST7796 itp.) — zw艂aszcza na portalach aukcyjnych, bez dok艂adnej dokumentacji — cz臋sto nie wiemy, jak膮 ma prawdziw膮 rozdzielczo艣膰 ani jakie s膮 jego offsety (colstart / rowstart). Biblioteki Adafruit domy艣lnie zak艂adaj膮 konkretne warto艣ci, a gdy si臋 pomylimy, efekt jest natychmiastowy:
obraz jest przesuni臋ty, uci臋ty na kraw臋dzi,
wida膰 „duchy" pikseli poza obszarem rysowania,
tekst jest lustrzany lub do g贸ry nogami,
kolory s膮 odwr贸cone (negatyw),
pod艣wietlenie nie dzia艂a.
Zamiast metod膮 pr贸b i b艂臋d贸w modyfikowa膰 docelowy projekt — mo偶na u偶y膰 dedykowanego testera. Poni偶ej opisuj臋 program, kt贸ry napisa艂em na ESP32 z my艣l膮 o szybkiej kalibracji dowolnego panelu z rodziny ST77xx.
Co potrafi tester
Program obs艂uguje si臋 wy艂膮cznie z Serial Monitora (115200 baud, Newline) — nie trzeba pod艂膮cza膰 偶adnych przycisk贸w, enkoder贸w ani potencjometr贸w. Po wgraniu na ESP32 i pod艂膮czeniu wy艣wietlacza wystarczy otworzy膰 Serial Monitor i wydawa膰 komendy.
Wzorzec testowy
Na ekranie rysowany jest czytelny wzorzec referencyjny:
Bia艂a ramka dok艂adnie na kraw臋dziach zadeklarowanego obszaru
W × H— od razu wida膰, czy rozdzielczo艣膰 jest poprawna.Siatka co 20 px (ciemnoszara) — u艂atwia ocen臋 przesuni臋cia.
Dwie przek膮tne (cyjan) — przecinaj膮 si臋 w geometrycznym 艣rodku.
4 kolorowe znaczniki w rogach:
czerwony — lewy-g贸rny,
zielony — prawy-g贸rny,
niebieski — lewy-dolny,
偶贸艂ty — prawy-dolny.
Dzi臋ki nim od razu wida膰 orientacj臋 i ewentualne lustro. Czerwony znacznik zawsze musi trafi膰 w lewy-g贸rny r贸g czytelnego obrazu.
Na 艣rodku ekranu wy艣wietlane s膮: aktualne
W × H,colstart/rowstart, rotacja oraz statusINV / MX / MY.
Gotowe profile
Program zawiera kilkana艣cie wpisanych profili najpopularniejszych paneli — m.in.:
| Profil | Rozdzielczo艣膰 | Uwagi |
|---|---|---|
| ST7789 240×240 | 1.3" / 1.54" | klasyk prosto z AliExpress |
| ST7789 240×320 | 2.0" / 2.4" | najcz臋stszy „2.4 cala" |
| ST7789 135×240 | 1.14" | ma艂y IPS |
| ST7789 170×320 | 1.9" | |
| ST7789 172×320 | 1.47" | |
| ST7789 240×280 | 1.69" | |
| ST7789 240×296 | 1.72" | |
| ST7789P3 76×282 | pasek | aktywny LOW, rotacja 1 |
| ST7735 128×160 | 1.8" | |
| ST7735 128×128 | 0.96" / 1.44" | |
| ST7735 80×160 | 0.96" mini | |
| ST7796 320×480 | 3.5" |
Plus osobny profil „MANUAL / nieznany" — do kalibracji od zera.
Sterowanie z Serial Monitora
n / p - nast臋pny / poprzedni gotowy profil
w / W - width -1 / +1
h / H - height -1 / +1
x / X - colstart -1 / +1
y / Y - rowstart -1 / +1
r - rotacja 0 -> 1 -> 2 -> 3 -> 0
v - prze艂膮cz negatyw / pozytyw
m - lustro w poziomie (bit MX w MADCTL)
M - lustro w pionie (bit MY w MADCTL)
f - cykl przez 4 kombinacje MX/MY (naprawa lustrzanego obrazu)
c - wyczy艣膰 CA艁Y obszar GRAM (480×480)
B - prze艂膮cz polaryzacj臋 pod艣wietlenia (HIGH/LOW)
i - wymu艣 ponown膮 inicjalizacj臋 i przerysowanie
s - zapisz konfiguracj臋 do NVS i wypisz gotowy kod
l - lista wbudowanych profili z numerami
g<nr> - skocz bezpo艣rednio do profilu o numerze <nr>, np. "g3"
a - w艂膮cz / wy艂膮cz auto-cykl (zmiana profilu co 8 s)
b - mignij pod艣wietleniem (test przewodu BL)
? - pomocPo zmianie dowolnego parametru ekran jest natychmiast czyszczony i rysowany od nowa — efekt widoczny od razu, bez restartu ESP32.
Zapis i eksport gotowego kodu
Komenda s zapisuje aktualn膮 konfiguracj臋 do NVS (pami臋ci nieulotnej ESP32) — po restarcie program startuje z tymi samymi ustawieniami. Co wa偶niejsze, na Serial wypisuje gotowy kod do wklejenia w docelowym projekcie:
class ST77xxDisplay : public Adafruit_ST7789 {
public:
ST77xxDisplay(int8_t cs, int8_t dc, int8_t rst) : Adafruit_ST7789(cs, dc, rst) {}
void setOffsets(int8_t col, int8_t row) { setColRowStart(col, row); }
};
ST77xxDisplay tft(TFT_CS, TFT_DC, TFT_RST);
pinMode(TFT_BL, OUTPUT);
digitalWrite(TFT_BL, HIGH); // pod艣wietlenie aktywne HIGH
tft.init(240, 320);
tft.setOffsets(0, 0);
tft.setRotation(0);
tft.invertDisplay(false);
{ uint8_t m = 0xC0; tft.sendCommand(0x36, &m, 1); } // rot=0 MX=0 MY=0Wklejasz, kompilujesz, dzia艂a.
Ostatnia poprawka do starej wersji: pe艂ne czyszczenie GRAM
Problem
Podczas kalibracji zmienia si臋 rozdzielczo艣膰, offsety, rotacj臋 i inwersj臋 dziesi膮tki razy. Standardowa funkcja fillScreen() czy艣ci tylko obszar bie偶膮cego W × H — wi臋c je艣li wcze艣niej testowa艂e艣 panel 320×480, a teraz przeskakujesz na 135×240, to poza nowym oknem adresowym zostaj膮 艣mieci z poprzedniego profilu. Utrudnia to ocen臋, czy np. colstart jest ju偶 ustawiony dobrze, bo wida膰 „duchy" pikseli w miejscach, kt贸rych nowy obraz nie zdo艂a艂 zamalowa膰.
Dodatkowo okazuje si臋, 偶e Adafruit_ST7789::setAddrWindow() automatycznie dodaje offsety colstart / rowstart do podanych wsp贸艂rz臋dnych. Wi臋c pr贸ba wyczyszczenia ekranu przez setAddrWindow(0, 0, 480, 480) przy profilu z colstart = 80 adresuje w rzeczywisto艣ci 80..559 × 80..559 — sterownik zawija licznik GRAM, cz臋艣膰 ekranu pozostaje nietkni臋ta, a inne piksele s膮 zapisywane wielokrotnie.
Rozwi膮zanie
W wersji v1.6 funkcja clearScreen() wysy艂a surowe komendy CASET / RASET / RAMWR bezpo艣rednio przez sendCommand(), z pe艂nym zakresem 0..479 i bez offset贸w:
void clearScreen() {
uint8_t caset[4] = { 0x00, 0x00, (uint8_t)((CLEAR_MAX_W - 1) >> 8), (uint8_t)((CLEAR_MAX_W - 1) & 0xFF) };
uint8_t raset[4] = { 0x00, 0x00, (uint8_t)((CLEAR_MAX_H - 1) >> 8), (uint8_t)((CLEAR_MAX_H - 1) & 0xFF) };
tft.sendCommand(ST77XX_CASET, caset, 4);
tft.sendCommand(ST77XX_RASET, raset, 4);
tft.sendCommand(ST77XX_RAMWR, (const uint8_t *)NULL, 0);
tft.startWrite();
tft.writeColor(ST77XX_BLACK, (uint32_t)CLEAR_MAX_W * CLEAR_MAX_H);
tft.endWrite();
}Ta funkcja jest wywo艂ywana automatycznie w applyProfile(), przed narysowaniem wzorca. Efekt: po ka偶dej zmianie profilu / rozdzielczo艣ci / offset贸w / rotacji / inwersji / lustra ekran jest w 100% czysty — 偶adnych „duch贸w" po poprzednich pr贸bach.
Jak u偶ywa膰 — krok po kroku
Pod艂膮cz wy艣wietlacz zgodnie z pinami zdefiniowanymi na g贸rze pliku (
TFT_CS=15,TFT_DC=2,TFT_RST=4,TFT_MOSI=23,TFT_SCLK=18,TFT_BL=32).Wgraj program na ESP32 (Arduino IDE, p艂ytka ESP32 Dev Module).
Otw贸rz Serial Monitor — 115200 baud, Newline.
Wpisz
l, 偶eby zobaczy膰 list臋 profili.Wybierz profil komend膮
g<nr>— np.g1dla ST7789 240×320.Dostrajaj:
w/W,h/H,x/X,y/Y— a偶 bia艂a ramka pokryje si臋 z kraw臋dziami ekranu, a czerwony znacznik b臋dzie w lewym-g贸rnym rogu czytelnego obrazu.Je艣li obraz jest lustrzany — wciskaj
f, a偶 tekst b臋dzie czytelny.Je艣li kolory s膮 odwr贸cone — wci艣nij
v.Je艣li pod艣wietlenie nie dzia艂a — wci艣nij
Bi/lubb.Wpisz
s— konfiguracja trafia do NVS i na Serial wypisuje si臋 gotowy kod do wklejenia w projekcie docelowym.
Kalibruj w rotacji 0 (pionowej) — dopiero po ustaleniu offset贸w i rozdzielczo艣ci przechod藕 na inne rotacje.
Pod mask膮 — ciekawe rozwi膮zania
ST77xxTesterjako podklasaAdafruit_ST7789—setColRowStart()bywa oznaczone jakoprotectedw niekt贸rych wersjach biblioteki. Utworzenie podklasy z publicznym wrapperemsetOffsets(col, row)obchodzi ten problem czysto, bez modyfikowania biblioteki.R臋czne wysy艂anie
MADCTLposetRotation()—init()resetuje rejestr MADCTL, wi臋c ustawienia lustra trzeba nak艂ada膰 po ka偶dej inicjalizacji. Program robi to wapplyMADCTL().Obszar czyszczenia 480×480 — pokrywa wszystkie panele z listy profili (w tym ST7796 320×480). Nadmiarowe adresy po prostu zawijaj膮 licznik GRAM, a poniewa偶 piszemy wsz臋dzie czarny — efekt jest dok艂adnie taki, jak trzeba.
Rzutowanie
(const uint8_t *)NULL— bez tego kompilator nie wie, kt贸re przeci膮偶eniesendCommandwybra膰 (zuint8_t*czyconst uint8_t*), boNULLpasuje do obu.
Wnioski
Tester skr贸ci艂 mi czas kalibracji nowego panelu z nawet godzin (metod膮 pr贸b i b艂臋d贸w w docelowym projekcie) do kilku minut w dedykowanym narz臋dziu. Kluczowe okaza艂y si臋:
Natychmiastowa reakcja na ka偶d膮 zmian臋 — czysty ekran i 艣wie偶o narysowany wzorzec po ka偶dym naci艣ni臋ciu klawisza.
Czytelny wzorzec — kolorowe znaczniki w rogach od razu pokazuj膮 orientacj臋 i ewentualne lustro.
Eksport gotowego kodu — komenda
seliminuje przepisywanie parametr贸w do projektu r臋cznie.Pe艂ne czyszczenie GRAM — bez tego po艂owa czasu kalibracji schodzi na odr贸偶nianie 艣mieci od rzeczywistych artefakt贸w nowego ustawienia.
Program jest dost臋pny na licencji otwartej — wystarczy wklei膰 do Arduino IDE, wgra膰 na ESP32 i cieszy膰 si臋 szybk膮 kalibracj膮 kolejnych egzotycznych paneli z rodziny ST77xx. Mi艂o by by艂o gdyby艣 pami臋ta艂 o jego autorze i w艂o偶onej przez niego pracy 馃槉.
Na koniec kilka fotek z kalibrowania:
![]() |
| 殴le dobrana rozdzielczo艣膰 i rotacja. |
![]() |
| 殴le dobrana rozdzielczo艣膰. Rotacja OK. |
![]() |
| Jeszcze z艂a rozdzielczo艣膰 i rotacja. |
![]() |
| Poprawna rozdzielczo艣膰, z艂a rotacja. |
![]() |
| Poprawna rozdzielczo艣膰 i rotacja. |
![]() |
Po w艂膮czeniu negacji wida膰 przesuni臋cie kraw臋dzi. |
![]() |
Teraz jest poprawnie. Tak mo偶na zapisa膰 -> [s]. |
Mi艂ego kalibrowania!
✍️ Autor: Robert HF5WWL
馃搮 Data projektu: wrzesie艅 2026 r.
馃搷 Lokalizacja: Wo艂omin, POLSKA
馃搧 Co艣 nie jasne? Pytaj poprzez e-mail (hf5wwl@gmail.com) lub w komentarzu
馃洜️ Poziom trudno艣ci: 艁atwy (jak si臋 wie co si臋 robi) 馃槉





















