Files
lvgl/docs/README_pt_BR.md

15 KiB
Raw Blame History

English | 中文 | Português do Brasil | 日本語 | עברית

 

LVGL - Light and Versatile Graphics Library


LVGL - Biblioteca gráfica leve e versátil


   

Site | Editor LVGL Pro | Documentação | Fórum | Demos | Serviços


📒 Visão geral

LVGL é uma biblioteca de UI gratuita e de código aberto que permite criar interfaces gráficas para qualquer MCU e MPU, de qualquer fabricante, em qualquer plataforma.

Requisitos: o LVGL não possui dependências externas, o que facilita compilar para qualquer alvo moderno, desde pequenos MCUs até MPUs Linux multicore com suporte a 3D. Para uma UI simples, você precisa de ~100 kB de RAM, ~200300 kB de flash e um buffer de renderização com 1/10 do tamanho da tela.

Para começar, escolha um projeto pronto para uso no VSCode, Eclipse ou outro, e experimente o LVGL no seu PC. O código de UI do LVGL é totalmente independente de plataforma, então você pode reutilizá-lo nos seus alvos embarcados.

LVGL Pro é um kit completo para ajudar você a criar, testar, compartilhar e entregar UIs com mais rapidez. Ele inclui um Editor XML onde você pode criar e testar componentes reutilizáveis, exportar código C ou carregar os XMLs em tempo de execução. Saiba mais aqui.

💡 Recursos

Gratuito e portátil

  • Biblioteca totalmente em C (compatível com C++) sem dependências externas.
  • Pode ser compilada para qualquer MCU ou MPU, com qualquer (RT)OS. Make, CMake e globbing simples são suportados.
  • Suporta displays monocromáticos, ePaper, OLED, TFT e até monitores. Displays
  • Licença MIT, o que facilita o uso em projetos comerciais.
  • Precisa de apenas 32 kB de RAM, 128 kB de Flash, um frame buffer e pelo menos um buffer de 1/10 da tela para renderização.
  • Sistema operacional, memória externa e GPU são suportados, mas não obrigatórios.

Widgets, estilos, layouts e mais

  • 30+ Widgets embutidos: Button, Label, Slider, Chart, Keyboard, Meter, Arc, Table e muitos outros.
  • Sistema de estilos flexível com ~100 propriedades para personalizar qualquer parte dos widgets em qualquer estado.
  • Motores de layout tipo Flexbox e Grid para dimensionar e posicionar widgets de forma responsiva.
  • Texto renderizado com codificação UTF-8, com suporte a CJK, tailandês, híndi, árabe e persa.
  • Data bindings para conectar facilmente a UI ao aplicativo.
  • Motor de renderização com suporte a animações, antialiasing, opacidade, rolagem suave, sombras, transformação de imagens e mais.
  • Poderoso motor de renderização 3D para exibir modelos glTF com OpenGL.
  • Suporte a mouse, touchpad, keypad, teclado, botões externos e encoder. Dispositivos de entrada
  • Suporte a múltiplos displays.

📦 Plataformas compatíveis

O LVGL não possui dependências externas, por isso é fácil de compilar para qualquer dispositivo e também está disponível em vários gerenciadores de pacotes e RTOS:

🚀 Editor LVGL Pro

O LVGL Pro é um conjunto completo para criar, testar, compartilhar e entregar UIs embarcadas com eficiência.

Ele é composto por quatro ferramentas integradas:

  1. Editor XML: o coração do LVGL Pro. Um app de desktop para criar componentes e telas em XML, gerenciar data bindings, traduções, animações, testes e mais. Saiba mais sobre o formato XML e o Editor.
  2. Visualizador online: execute o Editor no navegador, abra projetos do GitHub e compartilhe facilmente sem configurar um ambiente de desenvolvimento. Visite https://viewer.lvgl.io.
  3. Ferramenta CLI: gere código C e rode testes no CI/CD. Veja os detalhes aqui.
  4. Plugin Figma: sincronize e extraia estilos diretamente do Figma. Veja como funciona aqui.

Juntas, essas ferramentas permitem criar UIs com eficiência, testá-las com confiabilidade e colaborar com colegas e clientes.

Saiba mais em https://pro.lvgl.io

🤝 Serviços comerciais

A LVGL LLC oferece vários tipos de serviços comerciais para apoiar o seu desenvolvimento de UI. Com mais de 15 anos de experiência em interfaces de usuário e gráficos, ajudamos você a levar sua UI para o próximo nível.

  • Design gráfico: nossos designers internos são especialistas em criar visuais modernos e bonitos que combinam com seu produto e com as capacidades do hardware.
  • Implementação de UI: implementamos sua UI com base no design criado por você ou por nós. Vamos tirar o máximo do seu hardware e do LVGL. Se faltar algum recurso ou widget no LVGL, nós implementamos para você.
  • Consultoria e suporte: oferecemos consultoria para evitar erros caros e demorados durante o desenvolvimento da UI.
  • Certificação de placas: para empresas que oferecem placas de desenvolvimento ou kits prontos para produção, fornecemos certificação demonstrando como a placa roda o LVGL.

Veja nossos Demos como referência. Para mais informações, acesse a página de Serviços.

Entre em contato e conte como podemos ajudar.

🧑‍💻 Integração do LVGL

Integrar o LVGL é simples. Basta adicioná-lo ao projeto e compilar como você compila outros arquivos. Para configurar, copie lv_conf_template.h para lv_conf.h, habilite o primeiro #if 0 e ajuste as configs conforme necessário. (A configuração padrão geralmente é suficiente.) Quando disponível, o LVGL também pode ser usado com Kconfig.

Depois de incluído no projeto, você pode inicializar o LVGL e criar dispositivos de display e de entrada assim:

#include "lvgl/lvgl.h" /*Defina LV_LVGL_H_INCLUDE_SIMPLE para incluir como "lvgl.h"*/

#define TFT_HOR_RES 320
#define TFT_VER_RES 240

static uint32_t my_tick_cb(void)
{
    return my_get_millisec();
}

static void my_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map)
{
    /*Escreva px_map na área (x1..x2, y1..y2) do frame buffer ou do controlador externo*/
}

static void my_touch_read_cb(lv_indev_t * indev, lv_indev_data_t * data)
{
   if(my_touch_is_pressed()) {
       data->point.x = touchpad_x;
       data->point.y = touchpad_y;
       data->state = LV_INDEV_STATE_PRESSED;
   } else {
       data->state = LV_INDEV_STATE_RELEASED;
   }
}

void main(void)
{
    my_hardware_init();

    /*Inicialize o LVGL*/
    lv_init();

    /*Defina a fonte de tick em milissegundos para o LVGL controlar o tempo*/
    lv_tick_set_cb(my_tick_cb);

    /*Crie um display onde telas e widgets serão adicionados*/
    lv_display_t * display = lv_display_create(TFT_HOR_RES, TFT_VER_RES);

    /*Adicione buffers de renderização
     *Aqui adicionamos um buffer parcial menor assumindo 16 bits (formato RGB565)*/
    static uint8_t buf[TFT_HOR_RES * TFT_VER_RES / 10 * 2]; /* x2 por causa de 16 bits por pixel */
    lv_display_set_buffers(display, buf, NULL, sizeof(buf), LV_DISPLAY_RENDER_MODE_PARTIAL);

    /*Adicione o callback que faz o flush do conteúdo de `buf` quando renderizado*/
    lv_display_set_flush_cb(display, my_flush_cb);

    /*Crie um dispositivo de entrada para toque*/
    lv_indev_t * indev = lv_indev_create();
    lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER);
    lv_indev_set_read_cb(indev, my_touch_read_cb);

    /*Drivers prontos, agora crie a UI*/
    lv_obj_t * label = lv_label_create(lv_screen_active());
    lv_label_set_text(label, "Hello world");
    lv_obj_center(label);

    /*Execute as tarefas do LVGL em loop*/
    while(1) {
        lv_timer_handler();
        my_sleep_ms(5);         /*Espere um pouco para o sistema respirar*/
    }
}

🤖 Exemplos

Você pode conferir mais de 100 exemplos em https://docs.lvgl.io/master/examples.html

O Visualizador Online também contém tutoriais para aprender XML com facilidade: https://viewer.lvgl.io/

Botão Hello World com evento

image
C code
static void button_clicked_cb(lv_event_t * e)
{
  printf("Clicked\n");
}

[...]

lv_obj_t * button = lv_button_create(lv_screen_active());
lv_obj_center(button);
lv_obj_add_event_cb(button, button_clicked_cb, LV_EVENT_CLICKED, NULL);

lv_obj_t * label = lv_label_create(button);
lv_label_set_text(label, "Hello from LVGL!");
Em XML com o LVGL Pro
<screen>
	<view>
		<lv_button align="center">
			<event_cb callback="button_clicked_cb" />
			<lv_label text="Hello from LVGL!" />
		</lv_button>
	</view>
</screen>

Slider estilizado com data binding

image
C code
static void my_observer_cb(lv_observer_t * observer, lv_subject_t * subject)
{
	printf("Slider value: %d\n", lv_subject_get_int(subject));
}

[...]

static lv_subject_t subject_value;
lv_subject_init_int(&subject_value, 35);
lv_subject_add_observer(&subject_value, my_observer_cb, NULL);

lv_style_t style_base;
lv_style_init(&style_base);
lv_style_set_bg_color(&style_base, lv_color_hex(0xff8800));
lv_style_set_bg_opa(&style_base, 255);
lv_style_set_radius(&style_base, 4);

lv_obj_t * slider = lv_slider_create(lv_screen_active());
lv_obj_center(slider);
lv_obj_set_size(slider, lv_pct(80), 16);
lv_obj_add_style(slider, &style_base, LV_PART_INDICATOR);
lv_obj_add_style(slider, &style_base, LV_PART_KNOB);
lv_obj_add_style(slider, &style_base, 0);
lv_obj_set_style_bg_opa(slider, LV_OPA_50, 0);
lv_obj_set_style_border_width(slider, 3, LV_PART_KNOB);
lv_obj_set_style_border_color(slider, lv_color_hex3(0xfff), LV_PART_KNOB);
lv_slider_bind_value(slider, &subject_value);

lv_obj_t * label = lv_label_create(lv_screen_active());
lv_obj_align(label, LV_ALIGN_CENTER, 0, -30);
lv_label_bind_text(label, &subject_value, "Temperature: %d °C");
Em XML com o LVGL Pro
<screen>
	<styles>
		<style name="style_base" bg_opa="100%" bg_color="0xff8800" radius="4" />
		<style name="style_border" border_color="0xfff" border_width="3" />
	</styles>

	<view>
		<lv_label bind_text="value" bind_text-fmt="Temperature: %d °C" align="center" y="-30" />
		<lv_slider align="center" bind_value="value" style_bg_opa="30%">
			<style name="style_base" />
			<style name="style_base" selector="knob" />
			<style name="style_base" selector="indicator" />
			<style name="style_border" selector="knob" />
		</lv_slider>
	</view>
</screen>

Checkboxes em um layout

image
C code
/*Crie uma nova tela e carregue-a*/
lv_obj_t * scr = lv_obj_create(NULL);
lv_screen_load(scr);

/*Defina um layout em coluna*/
lv_obj_set_flex_flow(scr, LV_FLEX_FLOW_COLUMN);
lv_obj_set_flex_align(scr, LV_FLEX_ALIGN_SPACE_EVENLY, /*Alinhamento vertical*/
  					   LV_FLEX_ALIGN_START,	       /*Alinhamento horizontal na trilha*/
  					   LV_FLEX_ALIGN_CENTER);      /*Alinhamento da trilha*/

/*Crie 5 checkboxes*/
const char * texts[5] = {"Input 1", "Input 2", "Input 3", "Output 1", "Output 2"};
for(int i = 0; i < 5; i++) {
  lv_obj_t * cb = lv_checkbox_create(scr);
  lv_checkbox_set_text(cb, texts[i]);
}

/*Altere alguns estados*/
lv_obj_add_state(lv_obj_get_child(scr, 1), LV_STATE_CHECKED);
lv_obj_add_state(lv_obj_get_child(scr, 3), LV_STATE_DISABLED);
Em XML com o LVGL Pro
<screen>
	<view
		flex_flow="column"
		style_flex_main_place="space_evenly"
		style_flex_cross_place="start"
		style_flex_track_place="center"
	>
		<lv_checkbox text="Input 1"/>
		<lv_checkbox text="Input 2"/>
		<lv_checkbox text="Input 3" checked="true"/>
		<lv_checkbox text="Output 1"/>
		<lv_checkbox text="Output 2" disabled="true"/>
   </view>
</screen>

🌟 Como contribuir

O LVGL é um projeto aberto, e contribuições são muito bem-vindas. Há muitas formas de contribuir, desde falar sobre o seu projeto, escrever exemplos, melhorar a documentação, corrigir bugs, até hospedar seu próprio projeto na organização LVGL.

Para uma descrição detalhada das oportunidades de contribuição, visite a seção Contributing da documentação.

Mais de 600 pessoas já deixaram sua marca no LVGL. Junte-se a nós. Até breve 🙂

... e muitas outras.