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.

B艂膮d przesuni臋cia H. 
B艂膮d przesuni臋cia H i V.
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]. |
Przepraszam za jako艣膰 zdj臋膰 ale tak m贸j telefon widzi ekran wy艣wietlacza.
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) 馃槉





















