Painel de casa inteligente ESP32: tutorial completo de design de UI
Publicado em Lopaka.app — O construtor de GUI LVGL gratuito e baseado na web para desenvolvedores embarcados
Introdução
Painéis de casa inteligente são um dos projetos ESP32 mais populares — e por um bom motivo. Eles combinam dados de sensores, controles do usuário e feedback em tempo real em uma única interface gratificante.
Neste tutorial abrangente, você vai projetar uma UI completa de painel de casa inteligente usando o Lopaka — o construtor de GUI LVGL gratuito e baseado na web — e, depois, implantá-la em um ESP32 com um display TFT de 3,5". O painel incluirá:
- Exibição de temperatura e umidade com leituras de sensores ao vivo
- Controles de iluminação com interruptores liga/desliga e controles deslizantes de brilho
- Painel de status de segurança com indicadores de porta/janela
- Widget de clima mostrando as condições atuais
- Navegação entre várias telas
Tempo estimado de conclusão: 45-60 minutos para o design da UI, mais o tempo de configuração do hardware.
Nível de dificuldade: Intermediário
Requisitos de hardware
| Componente | Recomendado | Alternativa |
|---|---|---|
| Microcontrolador | ESP32 DevKit V1 | ESP32-S3, ESP32-C3 |
| Display | TFT ILI9488 de 3,5" (480x320) | ILI9341 de 2,8" (320x240) |
| Temperatura/Umidade | DHT22 (AM2302) | BME280, SHT30 |
| Sensor de luz | BH1750 | LDR + ADC |
| Módulo de relé | Relé de 4 canais 5V | Módulo MOSFET para fitas LED |
| Alimentação | Fonte USB 5V 2A | LiPo 3,7V + conversor boost |
| Gabinete | Caixa impressa em 3D | Caixa de projeto |
Custo total estimado: US$ 25-45, dependendo do que você já tem.
Requisitos de software
- Lopaka — construtor de GUI gratuito e baseado na web (lopaka.app)
- Arduino IDE ou PlatformIO — para programação do ESP32
- Biblioteca LVGL — v8.x ou v9.x
- Biblioteca de driver de display TFT — TFT_eSPI recomendada
- Bibliotecas de sensores — DHT, BH1750 etc.
Passo 1: Planeje o layout do seu painel
Antes de abrir o Lopaka, esboce o layout do seu painel no papel. Um bom painel de casa inteligente segue estes princípios:
- Informação mais importante primeiro — temperatura e hora devem estar em destaque
- Agrupamento lógico — controles relacionados juntos (toda a iluminação em uma área)
- Amigável ao toque — botões e controles deslizantes devem ter pelo menos 40x40 pixels
- Espaçamento consistente — use um sistema de grade para alinhamento
- Código por cores — use cores para indicar status (verde = ligado, vermelho = alerta, cinza = desligado)
Para um display de 480x320, vamos projetar este layout:
+-----------------------------------------------------+
| [=] Smart Home Dashboard [72 deg F] | <- Header (40px)
+-----------------------------------------------------+
| |
| +--------------+ +--------------+ |
| | TEMP 72.5F | | HUM 45% RH | <- Sensor cards
| | Living Room| | Living Room| |
| +--------------+ +--------------+ |
| |
| +-------------------------------------------+ |
| | LIGHTING | |
| | Kitchen: [====|=====] 60% [ON] | | <- Controls
| | Bedroom: [==|=======] 20% [OFF] | |
| | Porch: [ON] | |
| +-------------------------------------------+ |
| |
| +--------------+ +--------------+ |
| | SECURITY | | ENERGY | <- Status cards
| | All Clear | | 1.2 kWh | |
| +--------------+ +--------------+ |
| |
+-----------------------------------------------------+Passo 2: Crie o projeto no Lopaka
- Abra lopaka.app no seu navegador
- Clique em "New Project"
- Selecione ESP32 como plataforma de destino
- Insira a resolução do display: 480 x 320 (ou as dimensões do seu display)
- Dê um nome ao seu projeto: "Smart Home Dashboard"
- Clique em "Create"
Agora você tem uma tela de desenho em branco na resolução correta.
Passo 3: Projete a barra de cabeçalho
O cabeçalho oferece contexto e informações de acesso rápido.
Retângulo de fundo:
- Arraste um widget Rectangle para o topo
- Posição: (0, 0), Tamanho: (480, 40)
- Cor de fundo:
#1e293b(ardósia escura)
Ícone de menu:
- Arraste um widget Button
- Posição: (10, 8), Tamanho: (24, 24)
- Cor de fundo: transparente
- Adicione um Label filho com o texto
"=", tamanho de fonte 18, cor#94a3b8
Título:
- Arraste um widget Label
- Posição: (44, 10), Tamanho: (250, 20)
- Texto:
"Smart Home Dashboard" - Fonte:
LV_FONT_DEFAULT_16, cor:#e2e8f0
Widget de clima:
- Arraste um widget Label
- Posição: (340, 10), Tamanho: (130, 20)
- Texto:
"72 deg F" - Fonte:
LV_FONT_DEFAULT_14, cor:#94a3b8 - Alinhado à direita
Passo 4: Crie os cartões de sensores
Os cartões de sensores exibem dados ambientais em tempo real.
Cartão de temperatura
Fundo do cartão:
- Arraste um widget Rectangle
- Posição: (20, 55), Tamanho: (210, 80)
- Cor de fundo:
#0f172a - Raio da borda: 12
- Cor da borda:
#334155, espessura: 1
Ícone de temperatura:
- Arraste um widget Label
- Posição: (30, 65), Tamanho: (30, 30)
- Texto:
"T", tamanho de fonte 24
Valor da temperatura:
- Arraste um widget Label
- Posição: (70, 65), Tamanho: (140, 36)
- Texto:
"72.5 deg F" - Fonte: grande (28px ou
LV_FONT_DEFAULT_28), cor:#f97316(laranja)
Rótulo de local:
- Arraste um widget Label
- Posição: (70, 100), Tamanho: (140, 20)
- Texto:
"Living Room" - Fonte:
LV_FONT_DEFAULT_12, cor:#64748b
Cartão de umidade
Duplique o cartão de temperatura e modifique:
- Copie o cartão de temperatura (selecione todos os widgets, copie, cole)
- Mova para a posição (250, 55)
- Altere o ícone para
"H" - Altere o valor para
"45% RH", cor:#06b6d4(ciano) - Altere o local para
"Living Room"
Passo 5: Crie o painel de controle de iluminação
Esta seção combina interruptores e controles deslizantes para o controle de luzes.
Fundo do painel:
- Arraste um widget Rectangle
- Posição: (20, 150), Tamanho: (440, 100)
- Cor de fundo:
#0f172a - Raio da borda: 12
- Cor da borda:
#334155, espessura: 1
Título do painel:
- Arraste um widget Label
- Posição: (35, 158), Tamanho: (200, 20)
- Texto:
"Lighting" - Fonte:
LV_FONT_DEFAULT_16, cor:#e2e8f0
Linha da luz da cozinha:
- Rótulo:
"Kitchen:"em (35, 185), cor:#94a3b8 - Controle deslizante: Posição (120, 185), Tamanho: (200, 16)
- Fundo:
#334155, indicador:#fbbf24(amarelo) - Defina o valor inicial como 60%
- Fundo:
- Interruptor: Posição (340, 182), Tamanho: (40, 22)
- Fundo quando ligado:
#22c55e - Defina para o estado LIGADO
- Fundo quando ligado:
- Rótulo:
"60%"em (390, 185), cor:#94a3b8
- Rótulo:
Linha da luz do quarto:
- Duplique a linha da cozinha, mova para a posição y 215
- Altere o rótulo para
"Bedroom:" - Defina o controle deslizante como 20%
- Defina o interruptor como DESLIGADO
- Altere o rótulo para
"20%"
Linha da luz da varanda:
- Rótulo:
"Porch:"em (35, 242), cor:#94a3b8 - Apenas interruptor: Posição (120, 239), Tamanho: (40, 22)
- Defina para o estado LIGADO
- Rótulo:
"ON"em (175, 242), cor:#22c55e
- Rótulo:
Passo 6: Crie os cartões de status
Dois cartões menores na parte inferior para segurança e monitoramento de energia.
Cartão de segurança
Fundo do cartão:
- Retângulo em (20, 265), Tamanho: (210, 50)
- Fundo:
#0f172a, raio da borda: 12, borda:#334155
Ícone de segurança:
- Rótulo:
"LOCK", posição (30, 273), tamanho 30x30, fonte 20
- Rótulo:
Texto de status:
- Rótulo:
"All Clear", posição (65, 275), tamanho 150x20 - Fonte:
LV_FONT_DEFAULT_14, cor:#22c55e(verde)
- Rótulo:
Texto de detalhe:
- Rótulo:
"3 doors, 2 windows", posição (65, 293), tamanho 150x16 - Fonte:
LV_FONT_DEFAULT_10, cor:#64748b
- Rótulo:
Cartão de energia
Fundo do cartão:
- Retângulo em (250, 265), Tamanho: (210, 50)
- Fundo:
#0f172a, raio da borda: 12, borda:#334155
Ícone de energia:
- Rótulo:
"PWR", posição (260, 273), tamanho 30x30, fonte 20
- Rótulo:
Valor de uso:
- Rótulo:
"1.2 kWh", posição (295, 275), tamanho 150x20 - Fonte:
LV_FONT_DEFAULT_14, cor:#e2e8f0
- Rótulo:
Texto de detalhe:
- Rótulo:
"Today - $0.18", posição (295, 293), tamanho 150x16 - Fonte:
LV_FONT_DEFAULT_10, cor:#64748b
- Rótulo:
Passo 7: Adicione uma segunda tela — Configurações
Um painel de casa inteligente precisa de uma tela de configurações.
- No Lopaka, clique em "Add Screen" no painel de telas
- Chame-a de
"Settings" - Projete a tela de configurações com:
- Cabeçalho (mesmo estilo da tela principal)
- Seção de configurações de WiFi com SSID e força do sinal
- Campos de configuração MQTT
- Opções de calibração de sensores
- Controle deslizante de brilho do display
- Seletor de tema (alternância entre modo escuro/claro)
Passo 8: Adicione a navegação entre telas
Conecte o botão de menu para navegar entre telas.
- Selecione o botão de menu na tela principal
- No painel Events, adicione um evento Click
- Ação: Navigate to screen ->
"Settings" - Na tela de configurações, adicione um botão de voltar que navega para a tela principal
Passo 9: Exporte o código
- Clique em Export na barra de ferramentas superior
- Selecione LVGL C code for ESP32
- Baixe os arquivos gerados
A exportação inclui:
dashboard_ui.c— código de criação da tela principalsettings_ui.c— código da tela de configuraçõesui.h— declarações compartilhadas e referências de telaui_helpers.c— funções auxiliares para navegação e estilo
Passo 10: Conecte os dados dos sensores
A UI exportada é estática — agora conecte dados reais dos sensores.
#include <lvgl.h>
#include <DHT.h>
#include "ui.h"
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Reference to UI labels (declared in ui.h)
extern lv_obj_t *ui_TempValue;
extern lv_obj_t *ui_HumidValue;
void update_sensor_data(lv_timer_t *timer) {
float temp = dht.readTemperature();
float humid = dht.readHumidity();
if (!isnan(temp)) {
char buf[16];
snprintf(buf, sizeof(buf), "%.1f deg F", temp * 9.0/5.0 + 32);
lv_label_set_text(ui_TempValue, buf);
}
if (!isnan(humid)) {
char buf[16];
snprintf(buf, sizeof(buf), "%.0f%% RH", humid);
lv_label_set_text(ui_HumidValue, buf);
}
}
void setup() {
Serial.begin(115200);
dht.begin();
// Initialize LVGL and display
lv_init();
// ... display driver setup ...
// Create the UI from Lopaka export
ui_init();
// Create a timer to update sensor data every 2 seconds
lv_timer_create(update_sensor_data, 2000, NULL);
}
void loop() {
lv_timer_handler();
delay(5);
}Passo 11: Adicione a entrada por toque
Conecte os eventos do controle deslizante e do interruptor para controlar relés.
// Event callback for kitchen light slider
void kitchen_slider_event(lv_event_t *e) {
lv_obj_t *slider = lv_event_get_target(e);
int value = lv_slider_get_value(slider);
// Update PWM output for dimming
ledcWrite(KITCHEN_PWM_CHANNEL, value * 255 / 100);
// Update percentage label
char buf[8];
snprintf(buf, sizeof(buf), "%d%%", value);
lv_label_set_text(ui_KitchenPercentLabel, buf);
}
// Event callback for toggle switch
void porch_toggle_event(lv_event_t *e) {
lv_obj_t *toggle = lv_event_get_target(e);
bool state = lv_obj_has_state(toggle, LV_STATE_CHECKED);
digitalWrite(PORCH_RELAY_PIN, state ? HIGH : LOW);
lv_label_set_text(ui_PorchStatusLabel, state ? "ON" : "OFF");
}
void setup() {
// ... previous setup code ...
// Register event callbacks
lv_obj_add_event_cb(ui_KitchenSlider, kitchen_slider_event, LV_EVENT_VALUE_CHANGED, NULL);
lv_obj_add_event_cb(ui_PorchToggle, porch_toggle_event, LV_EVENT_VALUE_CHANGED, NULL);
}Lista completa de peças com links
| Peça | Preço aprox. | Onde comprar |
|---|---|---|
| ESP32 DevKit V1 | US$ 6-8 | Amazon, AliExpress, Adafruit |
| TFT ILI9488 de 3,5" | US$ 10-15 | Amazon, AliExpress |
| Sensor DHT22 | US$ 4-6 | Amazon, Adafruit |
| Sensor de luz BH1750 | US$ 2-3 | Amazon, AliExpress |
| Relé de 4 canais | US$ 4-6 | Amazon, AliExpress |
| Fios jumper | US$ 3-5 | Qualquer fornecedor de eletrônica |
| Protoboard | US$ 3-5 | Qualquer fornecedor de eletrônica |
Solução de problemas
O display não funciona
- Verifique se o
User_Setup.hdo TFT_eSPI corresponde aos pinos do seu display - Confira as conexões SPI (MOSI, MISO, SCK, CS, DC, RST)
- Garanta que a fonte de alimentação forneça corrente suficiente (displays TFT podem consumir 200-300mA)
O toque não responde
- Verifique o tipo de controlador de toque (XPT2046 é comum em módulos ILI9488)
- Calibre o toque usando o sketch de calibração de toque do TFT_eSPI
- Confira se o pino CS do toque está definido corretamente
Problemas de memória do LVGL
- Aumente
LV_MEM_SIZEemlv_conf.h(tente 48KB ou 64KB) - Reduza o número de widgets simultâneos
- Use
LV_MEM_CUSTOM=1para usar alocação em heap
Leituras de sensores não confiáveis
- Adicione um resistor pull-up de 10K ao pino de dados do DHT22
- Use cabo blindado para conexões de sensores com mais de 1 metro
- Adicione filtragem por software (média móvel) para leituras mais suaves
Próximos passos
Agora que seu painel de casa inteligente está funcionando, considere estes aprimoramentos:
- Integração MQTT — conecte ao Home Assistant ou OpenHAB
- Atualizações OTA — habilite atualizações de firmware sem fio
- Vários ambientes — adicione navegação por abas para ambientes diferentes
- Gráficos e tabelas — exiba o histórico de temperatura ao longo do tempo
- Controle por voz — integre com Alexa ou Google Home
- Gabinete — imprima em 3D uma caixa personalizada para um acabamento refinado
Por que o Lopaka?
O Lopaka torna o design de UI embarcada acessível a todos. Em vez de passar horas posicionando widgets por tentativa e erro, você pode:
- Projetar visualmente com arrastar e soltar no seu navegador
- Ver mudanças instantaneamente sem compilar ou gravar
- Exportar código LVGL limpo pronto para implantação no ESP32
- Iterar rapidamente — experimente layouts diferentes em minutos, não em horas
- Grátis para sempre — sem limitações, sem marcas d'água, sem cadastro
Comece a projetar seu painel de casa inteligente em lopaka.app — sem download.
Entre para a comunidade
- Discord: Entre para a comunidade Lopaka para ajuda e compartilhamento de projetos
- GitHub: Dê uma estrela no projeto e contribua
- Twitter: Siga @lopaka_app para dicas e atualizações
Compartilhe seus projetos de painel de casa inteligente com a gente — adoramos ver o que a comunidade constrói!
Este tutorial foi escrito para o Lopaka.app — o construtor de GUI LVGL gratuito e baseado na web. Criado por desenvolvedores embarcados, para desenvolvedores embarcados.