Pular para o conteúdo

5 erros comuns em GUIs embarcadas (e como evitá-los) ​

Publicado em Lopaka.app — O construtor de GUI LVGL gratuito e baseado na web para desenvolvedores embarcados

Introdução ​

Eu revisei centenas de projetos de GUI embarcada — de montagens Arduino de entusiastas a dispositivos IoT de produção. E continuo vendo os mesmos erros, repetidamente.

Não são detalhes bobos. São a diferença entre uma interface que parece profissional e uma que faz os usuários recorrerem ao monitor serial.

Neste post, vou passar pelos 5 erros mais comuns de GUI embarcada que vejo, por que eles acontecem e como evitá-los — muitas vezes em apenas alguns minutos.

Erro nº 1: Coordenadas de pixel codificadas manualmente ​

O problema ​

c
lv_obj_set_pos(label1, 47, 83);
lv_obj_set_pos(btn1, 112, 156);
lv_obj_set_pos(bar1, 23, 201);

Você posiciona cada elemento chutando coordenadas de pixel, depois ajusta em ±5 pixels, grava de novo, confere, repete. É lento, frágil e quebra no momento em que você muda o tamanho do display.

Por que isso acontece ​

A maioria dos tutoriais de GUI Arduino mostra como criar widgets, mas não como organizá-los. Então você faz as contas sozinho — e as contas são tediosas.

A correção ​

Use um construtor visual de GUI como o Lopaka, que resolve o posicionamento para você:

  1. Arraste widgets para uma tela de desenho
  2. Veja seu layout em tempo real
  3. Exporte código com coordenadas limpas e consistentes
  4. Troque o tamanho do display sem refazer tudo

Se você precisa codificar à mão, use posicionamento relativo:

c
// 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);

Erro nº 2: Nenhuma hierarquia visual ​

O problema ​

Tudo na tela tem o mesmo tamanho, a mesma cor, o mesmo peso visual. O usuário não sabe para onde olhar primeiro.

┌─────────────────────────────┐
│ Temperature: 25.6C          │
│ Humidity: 65%               │
│ Pressure: 1013 hPa          │
│ Battery: 75%                │
│ Status: OK                  │
│ Time: 14:32                 │
│ Date: 2026-04-02            │
└─────────────────────────────┘

Isso é um despejo de dados, não uma interface.

Por que isso acontece ​

Desenvolvedores embarcados pensam em estruturas de dados, não em design visual. Cada leitura de sensor recebe tratamento igual porque cada variável é igualmente importante no código.

A correção ​

Estabeleça uma hierarquia clara:

  1. Informação primária — Grande, em destaque, no centro da tela (por exemplo, temperatura)
  2. Informação secundária — Tamanho médio, contexto de apoio (por exemplo, umidade)
  3. Informação terciária — Pequena, periférica (por exemplo, carimbo de tempo, bateria)
c
// 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);

Boa hierarquia:

┌─────────────────────────────┐
│                             │
│         25.6°C              │  ← Primary (large, center)
│                             │
│    Humidity: 65%            │  ← Secondary (medium)
│    Pressure: 1013 hPa       │
│                             │
│  🔋 75%        14:32        │  ← Tertiary (small, bottom)
└─────────────────────────────┘

Erro nº 3: Ignorar o tamanho dos alvos de toque ​

O problema ​

c
lv_obj_set_size(tiny_button, 40, 20);

Um botão de 40×20 pixels em uma tela sensível ao toque resistiva de 2,8" é um pesadelo para acertar com precisão. Os usuários vão errar, ficar frustrados e parar de usar sua interface.

Por que isso acontece ​

Os desenvolvedores projetam para o display, não para o dedo. Em uma tela de 320×240, 40 pixels parece razoável — até você tentar tocar com a ponta do dedo.

A correção ​

Alvo de toque mínimo: 40×40 pixels (idealmente maior)

c
// 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);

Regras práticas:

  • Botões: altura mínima de 44px (recomendação do HIG da Apple)
  • Espaçamento entre botões: pelo menos 8px
  • Se não couber o texto confortavelmente, o botão é pequeno demais
  • Teste com seu hardware real — telas resistivas precisam de alvos maiores que as capacitivas

Erro nº 4: Nenhum feedback para as ações do usuário ​

O problema ​

O usuário pressiona um botão. Nada parece acontecer. Ele pressiona de novo. E de novo. Agora a ação disparou três vezes.

Por que isso acontece ​

Sistemas embarcados são lentos. O intervalo entre o toque e o feedback visual pode ser de 100-500ms — uma eternidade no tempo da UI. Sem feedback imediato, os usuários supõem que o toque não foi registrado.

A correção ​

Ofereça feedback visual instantâneo:

c
// 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);

Checklist de feedback:

  • O botão muda de aparência quando pressionado
  • Indicador de carregamento para operações >200ms
  • Mensagem de confirmação para ações destrutivas
  • Estado de erro visível e claro (borda vermelha, ícone de erro)
  • Confirmação de sucesso para ações concluídas

Erro nº 5: Não testar cedo em hardware real ​

O problema ​

Sua GUI parece perfeita no simulador. Você a grava no hardware e descobre:

  • As cores parecem desbotadas no display real
  • O texto está ilegível no tamanho escolhido
  • A calibração do toque está deslocada em 10 pixels
  • O display é mais lento do que o esperado, causando atraso visível no redesenho

Por que isso acontece ​

Simuladores são convenientes. Testar no hardware exige configuração. Então os desenvolvedores adiam o teste no hardware até a GUI estar “pronta” — e então descobrem que tudo está errado.

A correção ​

Teste em hardware real desde o primeiro dia:

  1. Grave uma tela de teste básica no seu primeiro dia com o display
  2. Verifique cores, fontes e calibração do toque imediatamente
  3. Itere no hardware, não apenas no simulador
  4. Use a pré-visualização ao vivo do Lopaka para projetar e, depois, grave de forma incremental

Checklist rápido de sanidade do hardware:

  • Driver do display inicializado corretamente
  • Cores conforme o esperado (teste com amostras de cor)
  • Tamanhos de fonte legíveis em distância normal de visualização
  • Calibração do toque precisa (teste cantos e centro)
  • Taxa de atualização aceitável (sem cintilação ou rasgos visíveis)
  • Consumo de energia dentro do orçamento (displays consomem muita energia)

Bônus: o metaerro ​

Não usar as ferramentas que existem para resolver esses problemas.

Você não precisa codificar manualmente cada posição de pixel. Não precisa chutar esquemas de cores. Não precisa calcular manualmente os tamanhos dos alvos de toque.

Ferramentas como o Lopaka existem especificamente para eliminar esses erros:

  • Layout visual → Chega de coordenadas codificadas manualmente
  • Guias de estilo integrados → Hierarquia visual consistente
  • Dimensionamento consciente do toque → Botões sempre amigáveis aos dedos
  • Pré-visualização em tempo real → Veja as mudanças instantaneamente, teste no hardware de forma incremental
  • Exportação de código limpo → Código LVGL pronto para produção, sem runtime de caixa-preta

Resumo ​

ErroImpactoCorreção
Coordenadas manuaisLayouts lentos e frágeisUse o construtor visual ou alinh. relativo
Sem hierarquia visualInterface confusaTamanho/cor por importância
Alvos de toque pequenosUX frustranteBotões de no mínimo 40×40px
Sem feedback ao usuárioInterações incertasEstados de pressão, indicadores, avisos
Teste tardio no hardwareRetrabalho caroTeste no hardware desde o primeiro dia

Recursos ​

Quais erros de GUI você já cometeu? Compartilhe suas histórias de guerra nos comentários — todos nós já passamos por isso.