ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

GUI Guider实战:零代码拖拽开发嵌入式温度计UI

GUI Guider实战:零代码拖拽开发嵌入式温度计UI 我用GUI Guider快速写个温度计从零到一的嵌入式UI开发实战在嵌入式开发中为设备添加一个直观、美观的用户界面UI往往是一个既耗时又需要专业图形设计知识的环节。传统的LVGLLight and Versatile Graphics Library开发虽然功能强大但需要编写大量C代码来构建界面对于快速原型开发或初学者来说门槛较高。最近在做一个智能家居传感器项目时我需要为温湿度传感器设计一个简单的显示界面手动编码调试布局花费了大量时间。直到我发现了GUI Guider这款由NXP推出的免费拖拽式UI设计工具它完美地解决了这个问题。本文将手把手带你使用GUI Guider从环境搭建到生成代码快速创建一个运行在嵌入式设备上的数字温度计UI整个过程清晰直观即使是嵌入式新手也能轻松上手。1. GUI Guider与LVGL快速UI开发的核心利器在深入实战之前我们有必要理解我们将要使用的工具链的核心组件。1.1 什么是LVGLLVGL是一个开源的嵌入式图形库为任何微控制器或微处理器提供创建精美UI所需的一切。它本身是纯C语言编写的具有高度可移植性支持多种输入设备触摸屏、按键、编码器等和显示设备并内置了丰富的控件按钮、标签、图表、列表等和动画效果。你可以把它想象成嵌入式领域的“Qt”或“WinForm”但更加轻量级专为资源受限的环境优化。1.2 什么是GUI GuiderGUI Guider是恩智浦NXP推出的一款免费、易用的拖放式UI设计器专门用于简化基于LVGL的应用程序开发。它的核心价值在于所见即所得WYSIWYG通过直观的拖拽操作来设计UI无需手动编写布局代码。自动代码生成设计完成后可以一键生成与LVGL框架兼容的、可直接编译运行的C代码。事件处理器生成可以为UI控件如按钮点击自动生成事件回调函数框架开发者只需填充业务逻辑。模拟器内置模拟器可以在PC上直接运行和测试UI效果无需反复烧录到硬件。多平台支持生成的代码可以轻松移植到NXP的MCU如i.MX RT系列或其他支持LVGL的平台上。简单来说GUI Guider是LVGL的“加速器”。它让开发者从繁琐的像素坐标计算和控件属性设置中解放出来专注于应用逻辑本身。我们本次要做的“温度计”项目正是展示其快速开发能力的绝佳例子。2. 环境准备安装与初识GUI Guider“工欲善其事必先利其器”。让我们先搭建好开发环境。2.1 系统与硬件要求操作系统Windows 10/11, Ubuntu Linux, 或 macOS。硬件对于本次教程我们主要使用GUI Guider的模拟器功能在PC上完成设计和测试。如果你想在真实硬件上运行需要一块支持LVGL的嵌入式开发板如ESP32、STM32、NXP i.MX RT等和一个显示屏如SPI/I2C接口的OLED、TFT屏。磁盘空间约500MB可用空间。2.2 下载与安装GUI Guider访问官网前往NXP官方网站在搜索栏或软件/工具页面找到GUI Guider。目前最新稳定版本是v1.6.x。选择适合你操作系统的安装包Windows为.exe Linux为.AppImage macOS为.dmg。安装Windows双击下载的.exe文件按照向导提示完成安装。Linux下载.AppImage文件后需要先赋予其可执行权限。打开终端导航到文件所在目录执行chmod x gui_guider-*.AppImage ./gui_guider-*.AppImagemacOS打开.dmg文件将GUI Guider图标拖拽到“应用程序”文件夹即可。首次运行启动GUI Guider你会看到一个欢迎界面可以选择创建新项目、打开示例或最近的项目。2.3 创建你的第一个GUI Guider项目启动后我们开始创建温度计项目点击“Create New Project”。选择显示器分辨率为了通用性我们选择一个中等分辨率例如320x240。这兼容大多数小尺寸嵌入式屏幕。选择颜色深度选择16-bit。这在保证色彩的同时节省内存是嵌入式设备的常见选择。选择主题GUI Guider提供Light和Dark等主题。我们选择“Dark”主题让我们的温度计看起来更酷。命名项目在“Project Name”中输入“DigitalThermometer”。选择项目路径选择一个你容易找到的文件夹来存放项目文件。点击“Create”。创建成功后你会进入GUI Guider的主设计界面。界面主要分为四个区域左侧控件工具箱Widgets和项目资源管理器。中间画布Canvas你在这里拖拽控件设计UI。右侧属性编辑器Property Editor用于设置选中控件的详细属性位置、大小、颜色、文本等。底部输出日志和模拟器控制台。3. 设计温度计UI拖拽构建界面我们的数字温度计将包含以下元素一个大的数字标签显示当前温度值。一个单位标签°C。一个图标或图片增强温度计的视觉识别度。一个背景面板用于整体布局。3.1 添加背景面板Container首先我们需要一个容器来承载所有元素。在左侧控件工具箱中找到“Container”控件。将其拖拽到中间的画布上。默认它会铺满整个屏幕。在右侧属性编辑器中我们可以调整它的样式大小Size保持宽度320 高度240。背景Bg Color点击颜色框可以调出一个调色板。我们选择一个深蓝色例如#1a237e作为背景与Dark主题搭配。边框Border可以取消边框让界面更简洁。3.2 添加温度值显示标签Label这是UI的核心。从工具箱拖拽一个“Label”控件到背景面板上。调整属性文本Text输入初始值例如“25.5”。字体Font点击下拉菜单GUI Guider内置了多种LVGL字体。为了显示大数字我们选择一种较大的字体例如lv_font_montserrat_48。如果你需要更大或自定义字体可以在项目设置中导入。文本颜色Text Color设置为醒目的白色#ffffff或亮黄色#ffeb3b。对齐Align设置为LV_ALIGN_CENTER并适当调整Y轴偏移例如Y -30为下面的单位标签留出空间。大小根据字体自动调整即可也可以手动设置一个足够大的区域。3.3 添加温度单位标签Label再拖拽一个“Label”控件放在温度数值标签的下方。调整属性文本输入“°C”。字体选择一个比数值小一些的字体例如lv_font_montserrat_24。文本颜色设置为浅灰色#b0bec5。对齐设置为LV_ALIGN_CENTER并调整Y轴偏移例如Y 20使其位于数值正下方。3.4 添加温度计图标Image为了让界面更生动我们可以添加一个图标。在左侧项目资源管理器的“Images”文件夹上右键选择“Import Images...”。从你的电脑中选择一个温度计图标文件PNG格式建议尺寸不要太大如64x64。你也可以从免费的图标网站如Flaticon, Iconfont下载一个。图标导入后会出现在“Images”列表中。从工具箱拖拽一个“Image”控件到画布上放在数值标签的左侧或右侧。在右侧属性编辑器中图像源Src点击下拉菜单选择你刚刚导入的图片。对齐设置为LV_ALIGN_LEFT_MID并调整X偏移或LV_ALIGN_RIGHT_MID。可以调整图像的大小Size以适应布局。3.5 布局微调与对齐使用GUI Guider提供的对齐工具可以快速整理布局按住Ctrl键用鼠标点击选中数值标签和单位标签。在画布上方的工具栏中找到“Align center”按钮确保两个标签水平居中对齐。使用鼠标拖动或属性编辑器中的X/Y坐标精细调整每个控件的位置直到你觉得美观为止。至此一个静态的温度计UI界面就设计完成了。你的画布应该看起来类似下图描述一个深蓝色背景上中央偏上显示着巨大的“25.5”其正下方是较小的“°C”左侧或右侧有一个温度计图标。4. 让温度计“活”起来添加事件与模拟数据静态UI没有灵魂。接下来我们要模拟温度变化让显示的数字能够动态更新。4.1 理解事件与回调在LVGL中交互和动态更新通过“事件”和“回调函数”机制实现。例如定时器到期是一个事件触摸点击是另一个事件。当事件发生时会调用预先注册好的回调函数我们在回调函数中编写更新UI的代码。4.2 创建定时器与更新函数我们将创建一个每1秒触发一次的定时器在它的回调函数中生成一个随机温度值并更新UI。切换到事件视图在GUI Guider主界面找到并点击“Events”标签页通常位于画布区域下方或右侧。添加全局定时器在Events视图你应该能看到一个“Widgets”树状列表里面包含我们创建的所有控件如screencontainer1label1等。选中最顶层的控件通常是screen因为定时器是作用于整个屏幕的。在右侧的“Events”配置区域点击“Add Event”按钮。从事件类型下拉菜单中选择“LV_EVENT_ALL”或找到特定的事件但更简单的方法是我们直接去代码里添加。GUI Guider的Events界面更适合配置控件如按钮的点击事件。对于全局定时器我们通常在生成的代码里手动添加。更直接的方法我们先生成代码框架然后在代码中手动添加定时器逻辑。这是更常见和灵活的做法。生成代码点击GUI Guider顶部菜单栏的“Generate Code”按钮或按F5。在弹出对话框中选择代码生成路径通常就在项目目录下然后点击生成。生成成功后你可以在项目目录下找到一个generated文件夹里面包含了所有UI相关的C和H文件。4.3 在生成代码中集成业务逻辑GUI Guider生成的代码结构清晰将UI初始化 (gui_guider.c/.h) 和用户自定义逻辑custom.c/.h分离开这非常利于维护。打开关键文件用你喜欢的代码编辑器如VS Code, CLion打开项目文件夹。找到以下文件generated/gui_guider.c 包含UI创建的代码setup_ui函数。generated/events_init.c 初始化事件回调的函数。custom/custom.c这是让我们添加自定义代码的地方在custom.c中添加定时器逻辑 打开custom/custom.c文件。你会看到setup_ui和custom_init等函数。我们在custom_init函数中添加我们的定时器。这个函数在UI设置完成后被调用是初始化自定义任务的理想位置。// 文件路径custom/custom.c #include custom.h #include gui_guider.h #include stdlib.h // 用于rand() #include time.h // 用于srand() // 声明一个定时器变量和回调函数 static lv_timer_t * temp_update_timer; static void temp_update_timer_cb(lv_timer_t * timer); void custom_init(lv_ui *ui) { /* 你的其他自定义初始化代码可以写在这里 */ // 初始化随机数种子 srand((unsigned int)time(NULL)); // 创建一个周期为1000ms1秒的定时器 // 回调函数是 temp_update_timer_cb // 将ui指针作为参数传递给回调函数以便在回调中访问UI控件 temp_update_timer lv_timer_create(temp_update_timer_cb, 1000, ui); // 可选立即执行一次回调避免初始显示为默认文本 temp_update_timer_cb(temp_update_timer); } // 定时器回调函数定义 static void temp_update_timer_cb(lv_timer_t * timer) { // 从定时器用户数据中获取ui结构体指针 lv_ui *ui (lv_ui *)timer-user_data; if (ui NULL) return; // 模拟生成一个20.0到30.0之间的随机温度值 float simulated_temp 20.0 (rand() % 100) / 10.0; // 例如 20.0, 20.1, ... 29.9 // 创建一个足够大的字符串缓冲区 char temp_str[10]; // 格式化温度值保留一位小数 snprintf(temp_str, sizeof(temp_str), %.1f, simulated_temp); // 更新UI上的标签文本 // 注意ui-screen_label_1 是GUI Guider为你的温度数值Label自动生成的变量名。 // 请务必根据你实际项目中的变量名进行修改你可以在 gui_guider.h 中查看。 // 假设你的温度数值Label在GUI Guider中被自动命名为 label_temp_value lv_label_set_text(ui-screen_label_temp_value, temp_str); // 请替换 screen_label_temp_value 为你的实际变量名 // 你也可以在这里根据温度值改变颜色例如高温红色低温蓝色 if(simulated_temp 28.0) { lv_obj_set_style_text_color(ui-screen_label_temp_value, lv_color_hex(0xFF5252), 0); // 红色 } else if (simulated_temp 22.0) { lv_obj_set_style_text_color(ui-screen_label_temp_value, lv_color_hex(0x2196F3), 0); // 蓝色 } else { lv_obj_set_style_text_color(ui-screen_label_temp_value, lv_color_hex(0xFFFFFF), 0); // 白色 } }关键点lv_timer_create 创建LVGL定时器。ui-screen_label_temp_value 这是访问UI控件的关键。这个变量名不是固定的它取决于你在GUI Guider中为Label控件设置的名称Name属性。你必须在gui_guider.h文件中找到对应控件的变量名。通常格式是screen_[控件类型]_[名称]。lv_label_set_text LVGL API用于设置标签文本。lv_obj_set_style_text_color LVGL API用于动态修改对象的文本颜色。修改控件变量名至关重要回到GUI Guider点击画布上的温度数值Label。在右侧属性编辑器的最上方找到“Widget Name”输入框。给它起一个有意义的名字例如“label_temp_value”。然后按回车或点击别处保存。重新生成代码点击“Generate Code”按钮。这会更新gui_guider.h和.c文件将控件变量名改为screen_label_temp_value。现在回到custom.c文件将lv_label_set_text(ui-screen_label_1, ...)这行代码中的screen_label_1替换为screen_label_temp_value。5. 运行与测试在模拟器中查看效果代码修改完成后我们不需要真实的硬件就能看到运行效果。在GUI Guider中点击顶部工具栏的“Run Simulator”按钮通常是一个绿色的播放图标。一个模拟器窗口会弹出显示你设计的UI。如果一切正确你会看到温度数值每隔一秒变化一次并且当温度高于28°C或低于22°C时数字颜色会相应地变成红色或蓝色。恭喜你已经成功创建了一个具有动态效果的虚拟数字温度计。这个在PC模拟器上运行的程序其代码框架与在嵌入式硬件上运行是完全一致的。6. 移植到真实硬件以ESP32为例如果你想在真实的嵌入式设备上运行这个温度计还需要一些步骤。这里以流行的ESP32开发板为例概述流程。6.1 硬件准备ESP32开发板如ESP32-DevKitC。SPI TFT显示屏如ILI9341驱动及连接线。杜邦线若干。6.2 软件环境准备安装ESP-IDF按照乐鑫官方指南安装ESP-IDF开发框架。创建ESP-IDF项目使用idf.py create-project或VS Code插件创建一个新项目。添加LVGL组件在项目目录下克隆LVGL仓库作为组件。cd your_esp32_project/components git clone --recursive https://github.com/lvgl/lvgl.git复制GUI Guider生成的代码将GUI Guider项目generated文件夹下的所有.c和.h文件复制到你的ESP-IDF项目的main目录下。将custom文件夹也复制到main目录下。修改主程序main.c// 文件路径main/main.c #include gui_guider.h #include custom.h #include lvgl.h // ... 显示屏驱动初始化代码取决于你的屏幕型号... // 此部分需要根据你的具体屏幕驱动库来编写通常包括SPI初始化、屏幕控制器初始化等。 void app_main(void) { // 1. 初始化LVGL lv_init(); // 2. 初始化你的显示屏驱动并注册LVGL的显示缓冲和输入设备 // ... 调用你的屏幕初始化函数 ... // 例如tft_init(); // lv_disp_drv_register(...); // 3. 创建UI lv_ui guider_ui; setup_ui(guider_ui); // 4. 初始化自定义任务我们的定时器就在这里 custom_init(guider_ui); // 5. 进入LVGL主循环 while (1) { lv_timer_handler(); // 处理LVGL定时器和任务 vTaskDelay(pdMS_TO_TICKS(10)); // 延时10ms让出CPU } }配置CMakeLists.txt和sdkconfig在main/CMakeLists.txt中添加生成的.c文件。通过idf.py menuconfig配置ESP32的SPI引脚、堆栈大小等。LVGL需要较大的堆内存和任务栈请务必在Component Config - LVGL和FreeRTOS中增加相关配置。编译与烧录idf.py set-target esp32 idf.py build idf.py -p /dev/ttyUSB0 flash monitor # 请替换为你的串口如果连接了真实的温度传感器如DHT11, DS18B20你可以在temp_update_timer_cb函数中将生成随机数的代码替换为读取传感器数据的函数一个真正的物理温度计就诞生了。7. 常见问题与排查思路在开发过程中你可能会遇到以下问题问题现象可能原因排查思路与解决方案GUI Guider模拟器运行正常但生成代码编译失败。1. 编译器找不到LVGL头文件。2. 生成的代码中有语法错误。3. 项目包含路径不正确。1. 确保你的嵌入式项目正确包含了LVGL库。2. 检查gui_guider.c和custom.c中是否有明显的拼写错误特别是控件变量名。3. 在IDE或Makefile/CMake中确认头文件包含路径已添加generated和lvgl目录。屏幕显示白屏或乱码。1. 显示屏驱动初始化失败。2. LVGL显示缓冲区设置错误。3. 像素格式不匹配如GUI Guider生成16位色但驱动配置为18位。1. 先用简单的测试程序验证屏幕驱动本身是否工作。2. 检查lv_disp_drv_init和lv_disp_drv_register的调用是否正确缓冲区大小是否足够。3. 核对GUI Guider项目设置的颜色深度与驱动中配置的是否一致。定时器回调函数没有被调用温度不更新。1. 定时器创建失败或参数错误。2.lv_timer_handler()没有被主循环定期调用。3. 控件变量名错误导致更新了错误的控件。1. 检查lv_timer_create的返回值是否为NULL周期参数单位是毫秒。2.确保在主循环中调用了lv_timer_handler()这是最常见的原因。3. 在回调函数中添加串口打印调试信息确认函数是否执行。再次核对ui-xxx中的变量名。触摸屏无反应。1. 触摸驱动未初始化或注册。2. 触摸屏引脚或校准参数错误。1. 确保正确调用了lv_indev_drv_register注册输入设备。2. 使用LVGL的触摸校准示例程序先测试触摸功能。控件显示位置或大小与设计不符。1. 屏幕物理分辨率与GUI Guider项目设置的分辨率不同。2. 控件使用了绝对坐标但父容器位置变化。1. 确保硬件屏幕的分辨率与GUI Guider中创建项目时设置的分辨率一致。如果不一致需要调整设计或使用LVGL的缩放功能。2. 多使用相对布局如LV_ALIGN_CENTER而非绝对坐标X,Y以提高移植性。8. 最佳实践与进阶建议掌握了基础流程后遵循一些最佳实践能让你的项目更健壮、更易维护。命名规范在GUI Guider中为每个控件设置清晰、有意义的名称Widget Name。避免使用label1button2这样的默认名。使用如label_temperaturebtn_start这样的名称这能让生成的代码变量名一目了然极大方便后续在custom.c中引用。资源管理图片嵌入式设备存储空间有限尽量使用小尺寸、低颜色深度的图片如索引色PNG。GUI Guider导入时会进行转换但源头文件小可以加快处理速度。字体仅嵌入项目实际用到的字体和字号。LVGL支持从外部存储器加载字体但对于简单UI将常用字体编译进固件更可靠。代码结构业务逻辑分离坚持将UI生成代码generated/和业务逻辑代码custom/分开。当UI需要修改时在GUI Guider中调整后重新生成代码你的业务逻辑在custom.c中基本不受影响。使用用户数据在定时器或事件回调中充分利用user_data指针来传递上下文信息如我们的ui指针避免使用全局变量。性能优化减少重绘区域LVGL会自动处理局部重绘。但在定时器频繁更新时确保只更新需要变化的控件属性如文本、颜色而不是刷新整个屏幕。缓冲区根据硬件内存情况合理设置LVGL的显示缓冲区数量单缓冲/双缓冲和大小。双缓冲可以避免闪烁。进阶功能探索多屏幕管理GUI Guider支持创建多个屏幕Screen。你可以设计一个主屏幕显示温度另一个屏幕显示历史图表或设置菜单并通过事件切换。使用真实传感器将custom.c中的随机数生成函数替换为读取I2C/SPI/OneWire温度传感器的实际代码。添加交互尝试添加一个按钮控件点击后在摄氏温度°C和华氏温度°F之间切换。这需要你在按钮的事件回调中修改温度计算和单位标签的文本。动画效果LVGL内置了强大的动画系统。你可以尝试为温度变化添加一个数字滚动的动画让界面更加生动。通过这个“温度计”项目我们不仅学会了一个工具的使用更掌握了一套高效的嵌入式UI开发流程在PC上用GUI Guider进行可视化设计和快速原型验证然后无缝地将代码移植到目标硬件最后在custom.c中注入灵魂——你的具体业务逻辑。这套方法可以扩展到智能家居面板、工业HMI、穿戴设备显示等众多场景极大地提升开发效率和界面质量。希望这篇教程能成为你探索嵌入式图形世界的良好开端接下来不妨尝试用GUI Guider为你手边的开发板打造一个专属的炫酷界面吧。
返回列表