Panel de hogar inteligente con ESP32: tutorial completo de diseño de UI
Publicado en Lopaka.app: el constructor de GUI de LVGL gratuito y basado en la web para desarrolladores embebidos
Introducción
Los paneles de hogar inteligente son uno de los proyectos ESP32 más populares, y con razón. Combinan datos de sensores, controles del usuario y retroalimentación en tiempo real en una sola interfaz satisfactoria.
En este tutorial completo, diseñarás una interfaz de panel de hogar inteligente completa con Lopaka, el constructor gratuito de GUI de LVGL basado en la web, y luego la desplegarás en un ESP32 con una pantalla TFT de 3,5". El panel incluirá:
- Visualización de temperatura y humedad con lecturas de sensores en vivo
- Controles de iluminación con interruptores de encendido/apagado y controles deslizantes de brillo
- Panel de estado de seguridad con indicadores de puertas y ventanas
- Widget del tiempo que muestra las condiciones actuales
- Navegación entre varias pantallas
Tiempo estimado de finalización: 45-60 minutos para el diseño de la interfaz, más el tiempo de configuración del hardware.
Nivel de dificultad: Intermedio
Requisitos de hardware
| Componente | Recomendado | Alternativa |
|---|---|---|
| Microcontrolador | ESP32 DevKit V1 | ESP32-S3, ESP32-C3 |
| Pantalla | TFT ILI9488 de 3,5" (480x320) | ILI9341 de 2,8" (320x240) |
| Temperatura/Humedad | DHT22 (AM2302) | BME280, SHT30 |
| Sensor de luz | BH1750 | LDR + ADC |
| Módulo de relés | Relé de 4 canales 5V | Módulo MOSFET para tiras LED |
| Alimentación | Fuente USB 5V 2A | LiPo 3,7V + convertidor elevador |
| Caja | Caja impresa en 3D | Caja de proyecto |
Costo total estimado: 25-45 $ dependiendo de lo que ya tengas.
Requisitos de software
- Lopaka: constructor de GUI gratuito basado en la web (lopaka.app)
- Arduino IDE o PlatformIO: para la programación del ESP32
- Biblioteca LVGL: v8.x o v9.x
- Biblioteca de controlador de pantalla TFT: se recomienda TFT_eSPI
- Bibliotecas de sensores: DHT, BH1750, etc.
Paso 1: Planifica el diseño de tu panel
Antes de abrir Lopaka, esboza el diseño de tu panel en papel. Un buen panel de hogar inteligente sigue estos principios:
- La información más importante primero: la temperatura y la hora deben ser prominentes
- Agrupación lógica: controles relacionados juntos (toda la iluminación en una zona)
- Apto para el tacto: los botones y controles deslizantes deben tener al menos 40x40 píxeles
- Espaciado coherente: usa un sistema de cuadrícula para la alineación
- Código de colores: usa colores para indicar el estado (verde = encendido, rojo = alerta, gris = apagado)
Para una pantalla de 480x320, diseñaremos este diseño:
+-----------------------------------------------------+
| [=] 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 | |
| +--------------+ +--------------+ |
| |
+-----------------------------------------------------+Paso 2: Crea el proyecto en Lopaka
- Abre lopaka.app en tu navegador
- Haz clic en «New Project»
- Selecciona ESP32 como plataforma de destino
- Ingresa la resolución de la pantalla: 480 x 320 (o las dimensiones de tu pantalla)
- Nombra tu proyecto: «Smart Home Dashboard»
- Haz clic en «Create»
Ahora tienes un lienzo en blanco con la resolución correcta.
Paso 3: Diseña la barra de encabezado
El encabezado ofrece contexto e información de acceso rápido.
Rectángulo de fondo:
- Arrastra un widget Rectangle a la parte superior
- Posición: (0, 0), Tamaño: (480, 40)
- Color de fondo:
#1e293b(pizarra oscuro)
Ícono de menú:
- Arrastra un widget Button
- Posición: (10, 8), Tamaño: (24, 24)
- Color de fondo: transparente
- Agrega una Label hija con el texto
"=", tamaño de fuente 18, color#94a3b8
Título:
- Arrastra un widget Label
- Posición: (44, 10), Tamaño: (250, 20)
- Texto:
"Smart Home Dashboard" - Fuente:
LV_FONT_DEFAULT_16, color:#e2e8f0
Widget del tiempo:
- Arrastra un widget Label
- Posición: (340, 10), Tamaño: (130, 20)
- Texto:
"72 deg F" - Fuente:
LV_FONT_DEFAULT_14, color:#94a3b8 - Alineado a la derecha
Paso 4: Crea las tarjetas de sensores
Las tarjetas de sensores muestran datos ambientales en tiempo real.
Tarjeta de temperatura
Fondo de la tarjeta:
- Arrastra un widget Rectangle
- Posición: (20, 55), Tamaño: (210, 80)
- Color de fondo:
#0f172a - Radio del borde: 12
- Color del borde:
#334155, ancho: 1
Ícono de temperatura:
- Arrastra un widget Label
- Posición: (30, 65), Tamaño: (30, 30)
- Texto:
"T", tamaño de fuente 24
Valor de temperatura:
- Arrastra un widget Label
- Posición: (70, 65), Tamaño: (140, 36)
- Texto:
"72.5 deg F" - Fuente: grande (28px o
LV_FONT_DEFAULT_28), color:#f97316(naranja)
Etiqueta de ubicación:
- Arrastra un widget Label
- Posición: (70, 100), Tamaño: (140, 20)
- Texto:
"Living Room" - Fuente:
LV_FONT_DEFAULT_12, color:#64748b
Tarjeta de humedad
Duplica la tarjeta de temperatura y modifícala:
- Copia la tarjeta de temperatura (selecciona todos los widgets, copia, pega)
- Muévela a la posición (250, 55)
- Cambia el ícono a
"H" - Cambia el valor a
"45% RH", color:#06b6d4(cian) - Cambia la ubicación a
"Living Room"
Paso 5: Crea el panel de control de iluminación
Esta sección combina interruptores y controles deslizantes para el control de la luz.
Fondo del panel:
- Arrastra un widget Rectangle
- Posición: (20, 150), Tamaño: (440, 100)
- Color de fondo:
#0f172a - Radio del borde: 12
- Color del borde:
#334155, ancho: 1
Título del panel:
- Arrastra un widget Label
- Posición: (35, 158), Tamaño: (200, 20)
- Texto:
"Lighting" - Fuente:
LV_FONT_DEFAULT_16, color:#e2e8f0
Fila de luz de la cocina:
- Etiqueta:
"Kitchen:"en (35, 185), color:#94a3b8 - Control deslizante: Posición (120, 185), Tamaño: (200, 16)
- Fondo:
#334155, indicador:#fbbf24(amarillo) - Establece el valor inicial en 60%
- Fondo:
- Interruptor: Posición (340, 182), Tamaño: (40, 22)
- Fondo cuando está encendido:
#22c55e - Establecer en estado ON
- Fondo cuando está encendido:
- Etiqueta:
"60%"en (390, 185), color:#94a3b8
- Etiqueta:
Fila de luz del dormitorio:
- Duplica la fila de la cocina, muévela a la posición y 215
- Cambia la etiqueta a
"Bedroom:" - Establece el control deslizante en 20%
- Establece el interruptor en estado OFF
- Cambia la etiqueta a
"20%"
Fila de luz del porche:
- Etiqueta:
"Porch:"en (35, 242), color:#94a3b8 - Solo interruptor: Posición (120, 239), Tamaño: (40, 22)
- Establecer en estado ON
- Etiqueta:
"ON"en (175, 242), color:#22c55e
- Etiqueta:
Paso 6: Crea las tarjetas de estado
Dos tarjetas más pequeñas en la parte inferior para la supervisión de seguridad y energía.
Tarjeta de seguridad
Fondo de la tarjeta:
- Rectángulo en (20, 265), Tamaño: (210, 50)
- Fondo:
#0f172a, radio del borde: 12, borde:#334155
Ícono de seguridad:
- Etiqueta:
"LOCK", posición (30, 273), tamaño 30x30, fuente 20
- Etiqueta:
Texto de estado:
- Etiqueta:
"All Clear", posición (65, 275), tamaño 150x20 - Fuente:
LV_FONT_DEFAULT_14, color:#22c55e(verde)
- Etiqueta:
Texto de detalle:
- Etiqueta:
"3 doors, 2 windows", posición (65, 293), tamaño 150x16 - Fuente:
LV_FONT_DEFAULT_10, color:#64748b
- Etiqueta:
Tarjeta de energía
Fondo de la tarjeta:
- Rectángulo en (250, 265), Tamaño: (210, 50)
- Fondo:
#0f172a, radio del borde: 12, borde:#334155
Ícono de energía:
- Etiqueta:
"PWR", posición (260, 273), tamaño 30x30, fuente 20
- Etiqueta:
Valor de consumo:
- Etiqueta:
"1.2 kWh", posición (295, 275), tamaño 150x20 - Fuente:
LV_FONT_DEFAULT_14, color:#e2e8f0
- Etiqueta:
Texto de detalle:
- Etiqueta:
"Today - $0.18", posición (295, 293), tamaño 150x16 - Fuente:
LV_FONT_DEFAULT_10, color:#64748b
- Etiqueta:
Paso 7: Agrega una segunda pantalla: Ajustes
Un panel de hogar inteligente necesita una pantalla de ajustes para la configuración.
- En Lopaka, haz clic en «Add Screen» en el panel de pantallas
- Nómbrala
"Settings" - Diseña la pantalla de ajustes con:
- Encabezado (el mismo estilo que la pantalla principal)
- Sección de ajustes WiFi con SSID e intensidad de la señal
- Campos de configuración MQTT
- Opciones de calibración de sensores
- Control deslizante de brillo de la pantalla
- Selector de tema (interruptor de modo oscuro/claro)
Paso 8: Agrega la navegación entre pantallas
Conecta el botón de menú para navegar entre pantallas.
- Selecciona el botón de menú en la pantalla principal
- En el panel Events, agrega un evento Click
- Acción: Navigate to screen ->
"Settings" - En la pantalla de ajustes, agrega un botón de retroceso que navegue a la pantalla principal
Paso 9: Exporta el código
- Haz clic en Export en la barra de herramientas superior
- Selecciona LVGL C code for ESP32
- Descarga los archivos generados
La exportación incluye:
dashboard_ui.c: código de creación de la pantalla principalsettings_ui.c: código de la pantalla de ajustesui.h: declaraciones compartidas y referencias a las pantallasui_helpers.c: funciones auxiliares para la navegación y los estilos
Paso 10: Conecta los datos de los sensores
La interfaz exportada es estática: ahora conecta los datos reales de los 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);
}Paso 11: Agrega la entrada táctil
Conecta los eventos del control deslizante y del interruptor para controlar los 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 piezas con enlaces
| Pieza | Precio aprox. | Dónde comprar |
|---|---|---|
| ESP32 DevKit V1 | $6-8 | Amazon, AliExpress, Adafruit |
| TFT ILI9488 de 3,5" | $10-15 | Amazon, AliExpress |
| Sensor DHT22 | $4-6 | Amazon, Adafruit |
| Sensor de luz BH1750 | $2-3 | Amazon, AliExpress |
| Relé de 4 canales | $4-6 | Amazon, AliExpress |
| Cables de conexión | $3-5 | Cualquier proveedor de electrónica |
| Protoboard | $3-5 | Cualquier proveedor de electrónica |
Solución de problemas
La pantalla no funciona
- Verifica que
User_Setup.hde TFT_eSPI coincida con los pines de tu pantalla - Comprueba las conexiones SPI (MOSI, MISO, SCK, CS, DC, RST)
- Asegúrate de que la fuente de alimentación pueda entregar suficiente corriente (las pantallas TFT pueden consumir 200-300mA)
El tacto no responde
- Verifica el tipo de controlador táctil (XPT2046 es común en los módulos ILI9488)
- Calibra el tacto con el sketch de calibración táctil de TFT_eSPI
- Comprueba que el pin CS táctil esté definido correctamente
Problemas de memoria de LVGL
- Aumenta
LV_MEM_SIZEenlv_conf.h(prueba 48KB o 64KB) - Reduce el número de widgets simultáneos
- Usa
LV_MEM_CUSTOM=1para usar la asignación dinámica
Lecturas de sensores poco fiables
- Agrega una resistencia pull-up de 10K al pin de datos del DHT22
- Usa cable blindado para las conexiones de sensores de más de 1 metro
- Agrega filtrado por software (media móvil) para lecturas más suaves
Próximos pasos
Ahora que tu panel de hogar inteligente funciona, considera estas mejoras:
- Integración MQTT: conecta con Home Assistant u OpenHAB
- Actualizaciones OTA: habilita las actualizaciones de firmware inalámbricas
- Varias habitaciones: agrega navegación por pestañas para distintas habitaciones
- Gráficos y diagramas: muestra el historial de temperatura a lo largo del tiempo
- Control por voz: integra con Alexa o Google Home
- Caja: imprime en 3D una caja personalizada para un aspecto pulido
¿Por qué Lopaka?
Lopaka hace que el diseño de interfaces embebidas sea accesible para todos. En lugar de pasar horas colocando widgets por ensayo y error, puedes:
- Diseñar visualmente arrastrando y soltando en tu navegador
- Ver los cambios al instante sin compilar ni flashear
- Exportar código LVGL limpio listo para el despliegue en ESP32
- Iterar rápidamente: prueba distintos diseños en minutos, no en horas
- Gratis para siempre: sin limitaciones, sin marcas de agua, sin registro
Empieza a diseñar tu panel de hogar inteligente en lopaka.app: no se requiere descarga.
Únete a la comunidad
- Discord: Únete a la comunidad de Lopaka para ayuda y para compartir proyectos
- GitHub: Dale una estrella al proyecto y contribuye
- Twitter: Sigue a @lopaka_app para consejos y novedades
Comparte tus proyectos de panel de hogar inteligente con nosotros: ¡nos encanta ver lo que crea la comunidad!
Este tutorial fue escrito para Lopaka.app, el constructor gratuito de GUI de LVGL basado en la web. Creado por desarrolladores embebidos, para desarrolladores embebidos.