feat: 添加 UI 组件支持,整合界面元素和全局变量管理

This commit is contained in:
Wang Beihong
2026-03-06 20:03:31 +08:00
parent b8f33364d7
commit d532d037ab
18 changed files with 544 additions and 23 deletions

View File

@@ -1,4 +1,4 @@
idf_component_register(SRCS "main.c"
INCLUDE_DIRS "."
REQUIRES wifi-connect esp_lvgl_port lvgl_st7735s_use i2c_master_messager io_device_control console_simple_init console console_user_cmds capactive_soil_moisture_sensor_V2.0
REQUIRES wifi-connect esp_lvgl_port lvgl_st7735s_use i2c_master_messager io_device_control console_simple_init console console_user_cmds capactive_soil_moisture_sensor_V2.0 ui
)

View File

@@ -12,6 +12,9 @@
#include "console_simple_init.h" // 提供 console_cmd_user_register 和 console_cmd_all_register
#include "console_user_cmds.h"
#include "capactive_soil_moisture_sensor_V2.0.h"
#include "ui.h" // 使用EEZStudio提供的ui组件便于后续扩展
#include "esp_lvgl_port.h"
#include "vars.h" // 定义全局变量接口
#ifndef CONFIG_I2C_MASTER_MESSAGER_BH1750_ENABLE
#define CONFIG_I2C_MASTER_MESSAGER_BH1750_ENABLE 0
@@ -44,24 +47,23 @@
static const char *TAG = "main";
static const char *wifi_status_short_str(wifi_connect_status_t status)
static char s_air_temp[16];
static char s_air_hum[16];
static char s_soil[16];
static char s_lux[16];
static void ui_task(void *arg)
{
switch (status)
(void)arg;
for (;;)
{
case WIFI_CONNECT_STATUS_IDLE:
return "IDLE";
case WIFI_CONNECT_STATUS_PROVISIONING:
return "PROV";
case WIFI_CONNECT_STATUS_CONNECTING:
return "CONN";
case WIFI_CONNECT_STATUS_CONNECTED:
return "UP";
case WIFI_CONNECT_STATUS_FAILED:
return "FAIL";
case WIFI_CONNECT_STATUS_TIMEOUT:
return "TIME";
default:
return "UNKN";
lvgl_port_lock(0);
ui_tick();
lvgl_port_unlock();
// UI 刷新周期无需过高20ms 兼顾流畅度与CPU占用。
vTaskDelay(pdMS_TO_TICKS(20));
}
}
@@ -101,6 +103,14 @@ void app_main(void)
// 启动 LVGL 演示程序,显示简单的界面
ESP_ERROR_CHECK(start_lvgl_demo());
// 初始化 UI 组件(需在 LVGL 锁内进行对象创建)
lvgl_port_lock(0);
ui_init();
lvgl_port_unlock();
BaseType_t ui_task_ok = xTaskCreate(ui_task, "ui_task", 4096, NULL, 5, NULL);
ESP_ERROR_CHECK(ui_task_ok == pdPASS ? ESP_OK : ESP_FAIL);
// 初始化 IO 设备控制组件GPIO1 水泵GPIO10 光照,高电平有效)
ESP_ERROR_CHECK(io_device_control_init());
@@ -169,17 +179,30 @@ void app_main(void)
cap_soil_sensor_data_t soil_data = {0};
if (soil_ready && cap_soil_sensor_read(&soil_data) == ESP_OK)
{
// 读取成功,当前版本仅保留采样流程,显示逻辑由用户自定义。
// 读取成功
snprintf(s_soil, sizeof(s_soil), "%.0f", soil_data.moisture_percent);
set_var_soil_moisture(s_soil);
}
i2c_master_messager_data_t sensor_data = {0};
if (i2c_ready && i2c_master_messager_get_data(&sensor_data) == ESP_OK)
{
// 读取成功,当前版本仅保留采样流程,显示逻辑由用户自定义。
}
// 读取成功
if (sensor_data.aht30.valid)
{
snprintf(s_air_temp, sizeof(s_air_temp), "%.1f", sensor_data.aht30.temperature_c);
set_var_air_temperature(s_air_temp);
set_var_air_temperature_int((int32_t)(sensor_data.aht30.temperature_c * 100)); // 以 1°C 为单位的整数
// TODO: 在这里实现你自己的 LCD 显示内容与排版。
// ESP_ERROR_CHECK(lvgl_st7735s_set_center_text("custom text"));
snprintf(s_air_hum, sizeof(s_air_hum), "%.1f", sensor_data.aht30.humidity_rh);
set_var_air_humidity(s_air_hum);
}
if (sensor_data.bh1750.valid)
{
snprintf(s_lux, sizeof(s_lux), "%.0f", sensor_data.bh1750.lux);
set_var_light_intensity(s_lux);
}
}
vTaskDelay(pdMS_TO_TICKS(1000));
}