LVGL嵌入式UI开发:三种方式对比与GPT自动生成实战

📅 2026/7/18 3:04:29
LVGL嵌入式UI开发:三种方式对比与GPT自动生成实战
在嵌入式设备开发中UI界面设计一直是开发者面临的重要挑战。传统的嵌入式UI开发往往需要手动编写大量代码布局调整繁琐特别是当需要集成传感器数据展示和设备控制功能时开发效率更是受到限制。本文将通过实际案例详细对比LVGL的三种UI开发方式并展示如何利用GPT自动生成设备控制界面同时实现温湿度传感器数据的实时上报和前端展示。1. LVGL基础概念与环境搭建1.1 LVGL简介与核心特性LVGLLight and Versatile Graphics Library是一款轻量级、开源的嵌入式图形库支持多种MCU、MPU和显示类型。它具有以下核心特性跨平台支持兼容STM32、ESP32等多种嵌入式平台丰富的组件库提供按钮、标签、滑块、图表等40UI组件内存效率高最低仅需64KB Flash和16KB RAM硬件加速支持GPU加速和多种显示接口多语言支持内置UTF-8编码支持中文显示1.2 开发环境配置以STM32F407为例搭建LVGL开发环境// lv_conf.h 关键配置 #define LV_MEM_SIZE (32U * 1024U) // 内存池大小 #define LV_HOR_RES_MAX 480 // 水平分辨率 #define LV_VER_RES_MAX 320 // 垂直分辨率 #define LV_USE_LOG 1 // 启用日志 #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN // 显示驱动配置 static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p) { // 实现显示刷新函数 lv_disp_flush_ready(disp_drv); } // 输入设备配置 static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data) { // 实现触摸屏读取 }1.3 项目目录结构embedded_ui_project/ ├── Core/ │ ├── Inc/ │ └── Src/ ├── LVGL/ │ ├── src/ │ ├── examples/ │ └── lv_conf.h ├── Drivers/ ├── Sensors/ │ ├── dht11.c │ └── aht20.c └── UI/ ├── manual_ui.c ├── designer_ui.c └── gpt_ui.c2. 三种LVGL UI开发方式深度对比2.1 手动代码编写方式手动编写UI代码是最基础的方式适合简单界面和性能要求高的场景。// manual_ui.c - 手动创建温湿度监控界面 void create_manual_ui(void) { // 创建主容器 lv_obj_t * main_cont lv_obj_create(lv_scr_act()); lv_obj_set_size(main_cont, 400, 240); lv_obj_center(main_cont); // 温度显示标签 lv_obj_t * temp_label lv_label_create(main_cont); lv_label_set_text(temp_label, 温度: --°C); lv_obj_align(temp_label, LV_ALIGN_TOP_LEFT, 20, 20); // 湿度显示标签 lv_obj_t * humi_label lv_label_create(main_cont); lv_label_set_text(humi_label, 湿度: --%); lv_obj_align(humi_label, LV_ALIGN_TOP_LEFT, 20, 60); // 控制按钮 lv_obj_t * btn lv_btn_create(main_cont); lv_obj_set_size(btn, 100, 40); lv_obj_align(btn, LV_ALIGN_BOTTOM_MID, 0, -20); lv_obj_t * btn_label lv_label_create(btn); lv_label_set_text(btn_label, 刷新数据); lv_obj_center(btn_label); } // 数据更新函数 void update_sensor_data_manual(float temperature, float humidity) { static char temp_str[20]; static char humi_str[20]; snprintf(temp_str, sizeof(temp_str), 温度: %.1f°C, temperature); snprintf(humi_str, sizeof(humi_str), 湿度: %.1f%%, humidity); // 更新显示内容 lv_label_set_text(temp_label, temp_str); lv_label_set_text(humi_label, humi_str); }手动方式的优势代码完全可控性能优化空间大内存占用最小适合资源受限设备调试方便问题定位准确手动方式的劣势开发效率低界面调整繁琐代码重复度高维护成本大不适合复杂界面布局2.2 可视化设计工具方式使用SquareLine Studio等可视化工具可以大幅提高开发效率。// designer_ui.c - 设计器生成的UI代码 // 由SquareLine Studio自动生成 // 初始化函数 void ui_init(void) { ui_Screen1 lv_obj_create(NULL); lv_obj_clear_flag(ui_Screen1, LV_OBJ_FLAG_SCROLLABLE); // 温度仪表盘 ui_TempArc lv_arc_create(ui_Screen1); lv_obj_set_width(ui_TempArc, 150); lv_obj_set_height(ui_TempArc, 150); lv_obj_set_x(ui_TempArc, -80); lv_obj_set_y(ui_TempArc, -40); lv_arc_set_range(ui_TempArc, 0, 50); lv_arc_set_value(ui_TempArc, 25); // 湿度进度条 ui_HumiBar lv_bar_create(ui_Screen1); lv_obj_set_width(ui_HumiBar, 200); lv_obj_set_height(ui_HumiBar, 20); lv_obj_set_x(ui_HumiBar, 0); lv_obj_set_y(ui_HumiBar, 80); lv_bar_set_range(ui_HumiBar, 0, 100); lv_bar_set_value(ui_HumiBar, 50, LV_ANIM_OFF); } // 事件处理回调 void temp_arc_event_cb(lv_event_t * e) { lv_event_code_t event_code lv_event_get_code(e); if(event_code LV_EVENT_VALUE_CHANGED) { // 温度设置处理 } }设计器方式的优势可视化布局所见即所得开发效率高适合快速原型支持实时预览和调整设计器方式的劣势生成代码可能不够优化自定义功能需要手动修改对复杂交互支持有限2.3 GPT自动生成方式利用GPT生成UI代码是新兴的高效开发方式特别适合标准化界面。# gpt_ui_generator.py - GPT界面生成器 import openai import json def generate_lvgl_ui(requirements): prompt f 请生成LVGL嵌入式UI代码要求 1. 显示温度和湿度数据 2. 包含控制按钮和设置界面 3. 支持数据图表显示 4. 使用现代UI设计风格 具体要求{json.dumps(requirements, ensure_asciiFalse)} response openai.ChatCompletion.create( modelgpt-4, messages[{role: user, content: prompt}] ) return response.choices[0].message.content # 生成示例 requirements { sensors: [temperature, humidity], controls: [refresh, settings, chart_view], style: modern, screen_size: 480x320 } ui_code generate_lvgl_ui(requirements)生成的LVGL代码示例// gpt_generated_ui.c - GPT生成的智能界面 void create_gpt_ui(void) { // 创建现代化主界面 lv_obj_t * main_screen lv_obj_create(lv_scr_act()); lv_obj_set_style_bg_color(main_screen, lv_color_hex(0x2D3250), 0); // 顶部状态栏 lv_obj_t * status_bar lv_obj_create(main_screen); lv_obj_set_size(status_bar, 480, 40); lv_obj_set_style_bg_color(status_bar, lv_color_hex(0x424769), 0); // 温度湿度卡片式布局 lv_obj_t * temp_card create_sensor_card(main_screen, 温度, °C, 60, 60); lv_obj_t * humi_card create_sensor_card(main_screen, 湿度, %, 180, 60); // 图表显示区域 lv_obj_t * chart lv_chart_create(main_screen); lv_obj_set_size(chart, 400, 120); lv_obj_align(chart, LV_ALIGN_BOTTOM_MID, 0, -20); } // 创建传感器显示卡片 lv_obj_t * create_sensor_card(lv_obj_t * parent, const char * title, const char * unit, int x, int y) { lv_obj_t * card lv_obj_create(parent); lv_obj_set_size(card, 100, 80); lv_obj_set_pos(card, x, y); lv_obj_set_style_radius(card, 10, 0); lv_obj_t * title_label lv_label_create(card); lv_label_set_text(title_label, title); lv_obj_align(title_label, LV_ALIGN_TOP_MID, 0, 10); lv_obj_t * value_label lv_label_create(card); lv_label_set_text(value_label, --); lv_obj_align(value_label, LV_ALIGN_CENTER, 0, 0); lv_obj_t * unit_label lv_label_create(card); lv_label_set_text(unit_label, unit); lv_obj_align(unit_label, LV_ALIGN_BOTTOM_MID, 0, -10); return card; }GPT生成方式的优势开发效率极高快速生成标准界面支持自然语言描述需求代码风格统一易于维护GPT生成方式的劣势需要网络连接和API调用生成代码可能需要调试优化对特殊硬件适配需要人工干预3. 温湿度传感器数据采集与处理3.1 DHT11传感器驱动实现// dht11.c - 温湿度传感器驱动 #include dht11.h #define DHT11_PORT GPIOA #define DHT11_PIN GPIO_PIN_0 // 传感器初始化 void DHT11_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin DHT11_PIN; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(DHT11_PORT, GPIO_InitStruct); HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET); HAL_Delay(1000); } // 读取传感器数据 DHT11_Data_t DHT11_Read(void) { DHT11_Data_t data {0}; uint8_t buffer[5] {0}; // 启动信号 HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET); HAL_Delay(18); HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET); // 切换为输入模式 GPIO_InitTypeDef GPIO_InitStruct {0}; GPIO_InitStruct.Pin DHT11_PIN; GPIO_InitStruct.Mode GPIO_MODE_INPUT; GPIO_InitStruct.Pull GPIO_PULLUP; HAL_GPIO_Init(DHT11_PORT, GPIO_InitStruct); // 等待传感器响应 if (wait_pin_state(GPIO_PIN_RESET) ! HAL_OK) return data; if (wait_pin_state(GPIO_PIN_SET) ! HAL_OK) return data; // 读取40位数据 for (int i 0; i 40; i) { if (wait_pin_state(GPIO_PIN_RESET) ! HAL_OK) return data; uint32_t start_time HAL_GetTick(); if (wait_pin_state(GPIO_PIN_SET) ! HAL_OK) return data; uint32_t duration HAL_GetTick() - start_time; buffer[i/8] 1; if (duration 40) { // 高电平持续时间判断0/1 buffer[i/8] | 1; } } // 数据校验 if (buffer[4] (buffer[0] buffer[1] buffer[2] buffer[3])) { data.temperature buffer[2]; data.humidity buffer[0]; data.valid 1; } return data; }3.2 AHT20高精度传感器驱动// aht20.c - 高精度温湿度传感器 #include aht20.h #include i2c.h #define AHT20_ADDRESS 0x38 // 传感器初始化 HAL_StatusTypeDef AHT20_Init(void) { uint8_t cmd[3] {0xBE, 0x08, 0x00}; HAL_StatusTypeDef status; // 发送初始化命令 status HAL_I2C_Master_Transmit(hi2c1, AHT20_ADDRESS 1, cmd, 3, 100); if (status ! HAL_OK) return status; HAL_Delay(10); // 检查校准状态 uint8_t status_byte; status HAL_I2C_Master_Receive(hi2c1, AHT20_ADDRESS 1, status_byte, 1, 100); if (status ! HAL_OK) return status; if (!(status_byte 0x08)) { return HAL_ERROR; // 校准未完成 } return HAL_OK; } // 读取温湿度数据 AHT20_Data_t AHT20_Read(void) { AHT20_Data_t data {0}; uint8_t cmd[3] {0xAC, 0x33, 0x00}; uint8_t buffer[6] {0}; // 触发测量 HAL_I2C_Master_Transmit(hi2c1, AHT20_ADDRESS 1, cmd, 3, 100); // 等待测量完成 HAL_Delay(80); // 读取数据 HAL_I2C_Master_Receive(hi2c1, AHT20_ADDRESS 1, buffer, 6, 100); // 解析数据 uint32_t humi_raw ((uint32_t)buffer[1] 12) | ((uint32_t)buffer[2] 4) | (buffer[3] 4); uint32_t temp_raw (((uint32_t)buffer[3] 0x0F) 16) | ((uint32_t)buffer[4] 8) | buffer[5]; data.humidity (humi_raw * 100.0) / (1 20); data.temperature (temp_raw * 200.0) / (1 20) - 50; data.valid 1; return data; }3.3 传感器数据管理模块// sensor_manager.c - 传感器数据统一管理 typedef struct { float temperature; float humidity; uint32_t timestamp; uint8_t sensor_type; // 0:DHT11, 1:AHT20 uint8_t valid; } SensorData_t; static SensorData_t sensor_data; static lv_timer_t * data_update_timer; // 数据更新定时器回调 void data_update_cb(lv_timer_t * timer) { SensorData_t new_data; // 根据配置选择传感器 if (config.use_high_precision) { new_data AHT20_Read(); new_data.sensor_type 1; } else { DHT11_Data_t dht_data DHT11_Read(); new_data.temperature dht_data.temperature; new_data.humidity dht_data.humidity; new_data.valid dht_data.valid; new_data.sensor_type 0; } new_data.timestamp HAL_GetTick(); if (new_data.valid) { sensor_data new_data; update_ui_display(sensor_data); send_to_cloud(sensor_data); // 上传到云平台 } } // 初始化传感器管理器 void sensor_manager_init(void) { // 初始化传感器 DHT11_Init(); AHT20_Init(); // 创建数据更新定时器 data_update_timer lv_timer_create(data_update_cb, 2000, NULL); // 2秒更新一次 } // 获取当前传感器数据 SensorData_t get_sensor_data(void) { return sensor_data; }4. GPT自动生成设备控制界面实战4.1 GPT提示词设计与优化设计有效的GPT提示词是生成高质量UI代码的关键# gpt_prompt_design.py - GPT提示词优化 def create_ui_generation_prompt(requirements): prompt_template 你是一个嵌入式UI开发专家请为LVGL库生成高质量的C代码。 项目需求 - 微控制器{mcu} - 屏幕分辨率{resolution} - 主要功能{functions} - 设计风格{style} - 性能要求{performance} 代码要求 1. 使用LVGL v8.x最新API 2. 包含完整的事件处理 3. 添加必要的错误处理 4. 代码注释详细 5. 内存使用优化 请生成可直接编译运行的完整代码。 return prompt_template.format( mcurequirements[mcu], resolutionrequirements[resolution], functions, .join(requirements[functions]), stylerequirements[style], performancerequirements[performance] ) # 示例需求配置 requirements { mcu: STM32F407, resolution: 480x320, functions: [温度显示, 湿度显示, 历史图表, 设备控制], style: 现代化扁平设计, performance: 低内存占用流畅动画 }4.2 生成的智能控制界面代码// gpt_smart_control_ui.c - GPT生成的智能控制界面 #include lvgl.h // 全局UI对象 static lv_obj_t * main_screen; static lv_obj_t * temp_label; static lv_obj_t * humi_label; static lv_obj_t * chart; static lv_chart_series_t * temp_series; static lv_chart_series_t * humi_series; // 创建现代化主界面 void create_smart_control_ui(void) { // 创建主屏幕 main_screen lv_obj_create(lv_scr_act()); lv_obj_set_size(main_screen, LV_HOR_RES, LV_VER_RES); lv_obj_set_style_bg_color(main_screen, lv_color_hex(0x1E1E2E), 0); lv_obj_set_style_bg_opa(main_screen, LV_OPA_COVER, 0); // 创建顶部状态栏 create_status_bar(); // 创建数据展示区域 create_data_display_area(); // 创建控制面板 create_control_panel(); // 创建图表区域 create_chart_area(); } // 创建状态栏 void create_status_bar(void) { lv_obj_t * status_bar lv_obj_create(main_screen); lv_obj_set_size(status_bar, LV_HOR_RES, 40); lv_obj_set_style_bg_color(status_bar, lv_color_hex(0x313244), 0); lv_obj_set_style_border_width(status_bar, 0, 0); // 时间显示 lv_obj_t * time_label lv_label_create(status_bar); lv_label_set_text(time_label, 12:30); lv_obj_align(time_label, LV_ALIGN_LEFT_MID, 10, 0); // 网络状态 lv_obj_t * wifi_icon lv_label_create(status_bar); lv_label_set_text(wifi_icon, LV_SYMBOL_WIFI); lv_obj_align(wifi_icon, LV_ALIGN_RIGHT_MID, -10, 0); } // 创建数据展示区域 void create_data_display_area(void) { // 温度显示卡片 lv_obj_t * temp_card lv_obj_create(main_screen); lv_obj_set_size(temp_card, 150, 100); lv_obj_align(temp_card, LV_ALIGN_TOP_LEFT, 20, 50); lv_obj_set_style_radius(temp_card, 15, 0); lv_obj_set_style_bg_color(temp_card, lv_color_hex(0x45475A), 0); lv_obj_t * temp_icon lv_label_create(temp_card); lv_label_set_text(temp_icon, LV_SYMBOL_TINT); lv_obj_align(temp_icon, LV_ALIGN_TOP_LEFT, 10, 10); temp_label lv_label_create(temp_card); lv_label_set_text(temp_label, 25.5°C); lv_obj_set_style_text_font(temp_label, lv_font_montserrat_24, 0); lv_obj_align(temp_label, LV_ALIGN_BOTTOM_LEFT, 10, -10); // 湿度显示卡片 lv_obj_t * humi_card lv_obj_create(main_screen); lv_obj_set_size(humi_card, 150, 100); lv_obj_align(humi_card, LV_ALIGN_TOP_RIGHT, -20, 50); lv_obj_set_style_radius(humi_card, 15, 0); lv_obj_set_style_bg_color(humi_card, lv_color_hex(0x45475A), 0); lv_obj_t * humi_icon lv_label_create(humi_card); lv_label_set_text(humi_icon, LV_SYMBOL_TINT); lv_obj_align(humi_icon, LV_ALIGN_TOP_LEFT, 10, 10); humi_label lv_label_create(humi_card); lv_label_set_text(humi_label, 60.2%); lv_obj_set_style_text_font(humi_label, lv_font_montserrat_24, 0); lv_obj_align(humi_label, LV_ALIGN_BOTTOM_LEFT, 10, -10); } // 更新传感器数据显示 void update_sensor_display(float temperature, float humidity) { static char temp_str[20]; static char humi_str[20]; snprintf(temp_str, sizeof(temp_str), %.1f°C, temperature); snprintf(humi_str, sizeof(humi_str), %.1f%%, humidity); lv_label_set_text(temp_label, temp_str); lv_label_set_text(humi_label, humi_str); // 更新图表数据 lv_chart_set_next_value(chart, temp_series, (int32_t)(temperature * 10)); lv_chart_set_next_value(chart, humi_series, (int32_t)(humidity * 10)); }4.3 高级功能语音控制集成// voice_control.c - 语音控制功能集成 #include voice_recognition.h // 语音命令处理 void voice_command_handler(const char * command) { if (strstr(command, 温度) ! NULL) { // 显示温度详情 show_temperature_detail(); } else if (strstr(command, 湿度) ! NULL) { // 显示湿度详情 show_humidity_detail(); } else if (strstr(command, 刷新) ! NULL) { // 手动刷新数据 force_data_update(); } else if (strstr(command, 图表) ! NULL) { // 切换图表显示 toggle_chart_view(); } } // 语音控制初始化 void voice_control_init(void) { voice_recognition_init(); set_voice_callback(voice_command_handler); }5. 数据上报与云端通信5.1 MQTT数据上报实现// mqtt_client.c - MQTT云端通信 #include mqtt_client.h static esp_mqtt_client_handle_t mqtt_client; // MQTT事件处理 static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) { esp_mqtt_event_handle_t event event_data; switch (event_id) { case MQTT_EVENT_CONNECTED: printf(MQTT连接成功\n); // 订阅主题 esp_mqtt_client_subscribe(mqtt_client, device/control, 0); break; case MQTT_EVENT_DATA: printf(收到MQTT消息: %.*s\n, event-data_len, event-data); process_control_message(event-data, event-data_len); break; case MQTT_EVENT_DISCONNECTED: printf(MQTT连接断开\n); break; } } // 上报传感器数据 void publish_sensor_data(const SensorData_t * data) { char payload[128]; snprintf(payload, sizeof(payload), {\temp\:%.1f,\humi\:%.1f,\ts\:%lu,\sensor\:%d}, >// http_client.c - HTTP REST API通信 #include esp_http_client.h // HTTP事件处理 esp_err_t http_event_handler(esp_http_client_event_t *evt) { switch(evt-event_id) { case HTTP_EVENT_ON_DATA: printf(HTTP响应: %.*s\n, evt-data_len, (char*)evt-data); break; default: break; } return ESP_OK; } // 上报数据到REST API void upload_to_rest_api(const SensorData_t * data) { esp_http_client_config_t config { .url https://api.example.com/sensor/data, .method HTTP_METHOD_POST, .event_handler http_event_handler, }; esp_http_client_handle_t client esp_http_client_init(config); // 设置JSON数据 char post_data[256]; snprintf(post_data, sizeof(post_data), {\device_id\:\%s\,\temperature\:%.1f,\humidity\:%.1f,\timestamp\:%lu}, get_device_id(),>// memory_optimization.c - 内存优化配置 void optimize_lvgl_memory(void) { // 配置内存池大小 #define LV_MEM_SIZE (48 * 1024) // 根据设备调整 // 启用内存监控 #define LV_USE_MEM_MONITOR 1 // 优化字体使用 #define LV_FONT_MONTSERRAT_12 0 #define LV_FONT_MONTSERRAT_14 1 #define LV_FONT_MONTSERRAT_16 0 // 只启用需要的字体 // 禁用不用的功能 #define LV_USE_ANIMATION 1 #define LV_USE_SHADOW 0 // 阴影效果占用较多内存 #define LV_USE_GPU 0 // 如果没有GPU则禁用 } // 动态内存管理 void * lv_malloc_custom(size_t size) { // 使用内存池分配 void * ptr lv_mem_alloc(size); if (ptr NULL) { // 内存不足处理 lv_mem_monitor_t mon; lv_mem_monitor(mon); printf(内存不足! 已使用: %d, 碎片: %d\n, mon.total_size - mon.free_size, mon.free_biggest_size); } return ptr; }6.2 显示性能优化// display_optimization.c - 显示性能优化 void optimize_display_performance(void) { // 使用部分刷新 lv_disp_drv_t disp_drv; lv_disp_drv_init(disp_drv); disp_drv.flush_cb my_flush_callback; disp_drv.full_refresh 0; // 禁用全屏刷新 // 启用双缓冲 static lv_color_t buf1[LV_HOR_RES * 20]; static lv_color_t buf2[LV_HOR_RES * 20]; lv_disp_draw_buf_init(draw_buf, buf1, buf2, LV_HOR_RES * 20); // 优化渲染模式 disp_drv.render_mode LV_DISP_RENDER_MODE_PARTIAL; } // 自定义刷新函数 static void my_flush_callback(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p) { // 只刷新指定区域 lcd_flush(area-x1, area-y1, area-x2, area-y2, color_p); lv_disp_flush_ready(disp_drv); }7. 实际项目部署与调试7.1 项目配置文件// project_config.h - 项目配置文件 #ifndef PROJECT_CONFIG_H #define PROJECT_CONFIG_H // 硬件配置 #define CONFIG_DEVICE_NAME SmartSensor_v1.0 #define CONFIG_SCREEN_WIDTH 480 #define CONFIG_SCREEN_HEIGHT 320 #define CONFIG_TOUCH_ENABLED 1 // 传感器配置 #define CONFIG_USE_AHT20 1 // 使用高精度传感器 #define CONFIG_SAMPLE_INTERVAL 2000 // 采样间隔(ms) // 网络配置 #define CONFIG_WIFI_SSID Your_WiFi_SSID #define CONFIG_WIFI_PASSWORD Your_WiFi_Password #define CONFIG_MQTT_BROKER mqtt://broker.example.com // UI配置 #define CONFIG_UI_THEME THEME_DARK #define CONFIG_UI_ANIMATION 1 #define CONFIG_UI_CHART_POINTS 50 // 图表数据点数 // 调试配置 #define CONFIG_DEBUG_ENABLED 1 #define CONFIG_LOG_LEVEL LOG_LEVEL_INFO #endif7.2 主应用程序框架// main.c - 主应用程序 #include lvgl.h #include sensor_manager.h #include ui_controller.h #include network_manager.h // 全局变量 static lv_disp_t * display; static lv_indev_t * touchpad; int main(void) { // 硬件初始化 hardware_init(); // LVGL初始化 lv_init(); // 显示初始化 display_init(); // 触摸屏初始化 touchpad_init(); // 传感器初始化 sensor_manager_init(); // 网络初始化 network_init(); // UI初始化 ui_controller_init(); // 主循环 while (1) { lv_timer_handler(); // LVGL任务处理 network_process(); // 网络处理 sensor_process(); // 传感器处理 // 低功耗延迟 HAL_Delay(5); } return 0; } // 硬件初始化 void hardware_init(void) { // HAL库初始化 HAL_Init(); // 系统时钟配置 SystemClock_Config(); // GPIO初始化 MX_GPIO_Init(); // I2C初始化用于AHT20 MX_I2C1_Init(); // SPI初始化用于显示 MX_SPI1_Init(); // UART初始化用于调试 MX_USART1_UART_Init(); } // 显示初始化 void display_init(void) { // 显示驱动初始化 lv_disp_draw_buf_init(draw_buf, buf1, buf2, LV_HOR_RES * 10);