5 popularnych błędów w GUI embedded (i jak ich unikać)
Opublikowano na Lopaka.app — bezpłatnym internetowym kreatorze GUI LVGL dla deweloperów embedded
Wprowadzenie
Przejrzałem setki projektów GUI embedded — od hobbystycznych konstrukcji Arduino po produkcyjne urządzenia IoT. I wciąż widzę te same błędy w kółko.
To nie są drobne czepialstwa. To różnica między interfejsem, który wygląda profesjonalnie, a takim, który sprawia, że użytkownicy sięgają zamiast tego po monitor portu szeregowego.
W tym wpisie przeprowadzę cię przez 5 najpopularniejszych błędów w GUI embedded, które widzę, dlaczego się pojawiają i jak ich unikać — często w zaledwie kilka minut.
Błąd nr 1: wpisywanie współrzędnych pikseli na sztywno
Problem
lv_obj_set_pos(label1, 47, 83);
lv_obj_set_pos(btn1, 112, 156);
lv_obj_set_pos(bar1, 23, 201);Ustawiasz każdy element, zgadując współrzędne pikseli, a potem poprawiasz o ±5 pikseli, wgrywasz ponownie, sprawdzasz, powtarzasz. To wolne, kruche i psuje się w momencie, gdy zmienisz rozmiar wyświetlacza.
Dlaczego się to dzieje
Większość tutoriali GUI Arduino pokazuje, jak tworzyć widżety, ale nie jak je układać. Więc robisz matematykę sam — a matematyka jest żmudna.
Rozwiązanie
Użyj wizualnego kreatora GUI takiego jak Lopaka, który załatwia pozycjonowanie za ciebie:
- Przeciągnij widżety na obszar rysowania
- Zobacz układ w czasie rzeczywistym
- Eksportuj kod z czystymi, spójnymi współrzędnymi
- Przełączaj rozmiary wyświetlacza bez robienia wszystkiego od nowa
Jeśli musisz kodować ręcznie, użyj pozycjonowania względnego:
// Instead of hardcoded positions:
lv_obj_align(label, LV_ALIGN_CENTER, 0, -40);
lv_obj_align(btn, LV_ALIGN_CENTER, 0, 20);
lv_obj_align(bar, LV_ALIGN_BOTTOM_MID, 0, -20);Błąd nr 2: brak hierarchii wizualnej
Problem
Wszystko na ekranie ma ten sam rozmiar, ten sam kolor, tę samą wagę wizualną. Użytkownik nie wie, gdzie spojrzeć najpierw.
┌─────────────────────────────┐
│ Temperature: 25.6C │
│ Humidity: 65% │
│ Pressure: 1013 hPa │
│ Battery: 75% │
│ Status: OK │
│ Time: 14:32 │
│ Date: 2026-04-02 │
└─────────────────────────────┘To zrzut danych, a nie interfejs.
Dlaczego się to dzieje
Deweloperzy embedded myślą strukturami danych, a nie projektem wizualnym. Każdy odczyt czujnika dostaje równe traktowanie, bo każda zmienna jest równie ważna w kodzie.
Rozwiązanie
Ustal jasną hierarchię:
- Informacje główne — duże, wyraziste, na środku ekranu (np. temperatura)
- Informacje drugorzędne — średni rozmiar, kontekst wspierający (np. wilgotność)
- Informacje trzeciorzędne — małe, peryferyjne (np. znacznik czasu, bateria)
// Primary — big and bold
lv_obj_set_style_text_font(temp_label, &lv_font_montserrat_36, 0);
// Secondary — readable but smaller
lv_obj_set_style_text_font(humidity_label, &lv_font_montserrat_20, 0);
// Tertiary — subtle
lv_obj_set_style_text_font(time_label, &lv_font_montserrat_14, 0);
lv_obj_set_style_text_color(time_label, lv_color_hex(0x888888), 0);Dobra hierarchia:
┌─────────────────────────────┐
│ │
│ 25.6°C │ ← Primary (large, center)
│ │
│ Humidity: 65% │ ← Secondary (medium)
│ Pressure: 1013 hPa │
│ │
│ 🔋 75% 14:32 │ ← Tertiary (small, bottom)
└─────────────────────────────┘Błąd nr 3: ignorowanie rozmiarów celów dotykowych
Problem
lv_obj_set_size(tiny_button, 40, 20);Przycisk o rozmiarze 40×20 pikseli na 2,8-calowym rezystancyjnym ekranie dotykowym to koszmar, żeby trafić go dokładnie. Użytkownicy będą chybia, frustrować się i przestaną używać twojego interfejsu.
Dlaczego się to dzieje
Deweloperzy projektują pod wyświetlacz, a nie pod palec. Na ekranie 320×240 40 pikseli wygląda rozsądnie — dopóki nie spróbujesz stuknąć go opuszkiem palca.
Rozwiązanie
Minimalny cel dotykowy: 40×40 pikseli (najlepiej większy)
// Too small
lv_obj_set_size(btn, 40, 20);
// Good
lv_obj_set_size(btn, 80, 44);
// Better — with padding
lv_obj_set_size(btn, 100, 50);
lv_obj_set_style_pad_all(btn, 8, 0);Zasady praktyczne:
- Przyciski: minimum 44 px wysokości (zalecenie Apple HIG)
- Odstępy między przyciskami: co najmniej 8 px
- Jeśli nie możesz wygodnie zmieścić tekstu, przycisk jest za mały
- Testuj na prawdziwym sprzęcie — rezystancyjne ekrany dotykowe potrzebują większych celów niż pojemnościowe
Błąd nr 4: brak informacji zwrotnej dla akcji użytkownika
Problem
Użytkownik naciska przycisk. Wydaje się, że nic się nie dzieje. Naciska go jeszcze raz. I jeszcze raz. Teraz akcja odpaliła się trzy razy.
Dlaczego się to dzieje
Systemy embedded są wolne. Przerwa między dotykiem a informacją wizualną może wynosić 100-500 ms — wieczność w czasie interfejsu. Bez natychmiastowej informacji zwrotnej użytkownicy zakładają, że dotyk się nie zarejestrował.
Rozwiązanie
Zapewnij natychmiastową informację wizualną:
// Button press state change
lv_obj_set_style_bg_color(btn, lv_color_hex(0x444444), LV_STATE_PRESSED);
lv_obj_set_style_transform_scale(btn, 240, LV_STATE_PRESSED);
// Loading indicator for slow operations
lv_obj_t *spinner = lv_spinner_create(lv_scr_act(), 1000, 60);
lv_obj_center(spinner);
// Toast notification for completed actions
lv_obj_t *toast = lv_label_create(lv_scr_act());
lv_label_set_text(toast, "Saved!");
lv_obj_align(toast, LV_ALIGN_BOTTOM_MID, 0, -10);
lv_obj_fade_out(toast, 500, 1500);Lista kontrolna informacji zwrotnej:
- Przycisk zmienia wygląd po naciśnięciu
- Wskaźnik ładowania dla operacji powyżej 200 ms
- Komunikat potwierdzający dla akcji destrukcyjnych
- Stan błędu widoczny i jasny (czerwone obramowanie, ikona błędu)
- Potwierdzenie sukcesu dla ukończonych akcji
Błąd nr 5: nietestowanie na prawdziwym sprzęcie wcześnie
Problem
Twoje GUI wygląda idealnie w symulatorze. Wgrywasz je na sprzęt i odkrywasz:
- Kolory wyglądają na wyblakłe na prawdziwym wyświetlaczu
- Tekst jest nieczytelny przy wybranym rozmiarze
- Kalibracja dotyku jest przesunięta o 10 pikseli
- Wyświetlacz jest wolniejszy, niż oczekiwano, co powoduje widoczne opóźnienie odrysowywania
Dlaczego się to dzieje
Symulatory są wygodne. Testowanie na sprzęcie wymaga konfiguracji. Więc deweloperzy odkładają testowanie na sprzęcie, aż GUI będzie „gotowe” — a potem odkrywają, że wszystko jest nie tak.
Rozwiązanie
Testuj na prawdziwym sprzęcie od pierwszego dnia:
- Wgraj podstawowy ekran testowy pierwszego dnia pracy z wyświetlaczem
- Od razu zweryfikuj kolory, czcionki i kalibrację dotyku
- Iteruj na sprzęcie, a nie tylko w symulatorze
- Użyj podglądu na żywo Lopaka do projektowania, a potem wgrywaj przyrostowo
Szybka lista kontrolna kondycji sprzętu:
- Sterownik wyświetlacza poprawnie zainicjowany
- Kolory pasują do oczekiwań (przetestuj próbkami kolorów)
- Rozmiary czcionek są czytelne przy normalnej odległości oglądania
- Kalibracja dotyku dokładna (przetestuj rogi i środek)
- Częstotliwość odświeżania akceptowalna (brak widocznego migotania lub rozrywania)
- Pobór mocy w budżecie (wyświetlacze są żarłoczne na energię)
Bonus: metabłąd
Nieużywanie narzędzi, które istnieją, żeby rozwiązać te problemy.
Nie musisz ręcznie kodować każdej pozycji piksela. Nie musisz zgadywać schematów kolorów. Nie musisz ręcznie obliczać rozmiarów celów dotykowych.
Narzędzia takie jak Lopaka istnieją specjalnie po to, żeby wyeliminować te błędy:
- Układ wizualny → koniec z wpisywanymi na sztywno współrzędnymi
- Wbudowane przewodniki stylu → spójna hierarchia wizualna
- Rozmiary świadome dotyku → przyciski zawsze przyjazne dla palców
- Podgląd w czasie rzeczywistym → widzisz zmiany od razu, testujesz na sprzęcie przyrostowo
- Czysty eksport kodu → gotowy do produkcji kod LVGL, bez ukrytego środowiska wykonawczego
Podsumowanie
| Błąd | Wpływ | Rozwiązanie |
|---|---|---|
| Współrzędne na sztywno | Wolne, kruche układy | Użyj kreatora wizualnego lub wyrównania względnego |
| Brak hierarchii wizualnej | Mylący interfejs | Rozmiar/kolor według ważności |
| Małe cele dotykowe | Frustrujące doświadczenie | Przyciski minimum 40×40 px |
| Brak informacji zwrotnej od użytkownika | Niepewne interakcje | Stany naciśnięcia, wskaźniki ładowania, toasty |
| Późne testowanie na sprzęcie | Drogie przeróbki | Testuj na sprzęcie od pierwszego dnia |
Zasoby
- Lopaka.app — buduj GUI bez tych błędów
- System stylów LVGL — głębokie spojrzenie na style LVGL
- Cele dotykowe Apple HIG — standard branżowy rozmiarów
- Discord Lopaka — uzyskaj pomoc od społeczności
Jakie błędy w GUI popełniłeś? Podziel się historiami wojennymi w komentarzach — wszyscy tam byliśmy.