黄山派小智自定义待机界面(一)
小智自定义待机界面
一、界面预览
二、简介
尝试了黄山派小智官方文档的自定义设计功能,觉得待机界面也可以自定义设计一下,所以尝试写个相关的自定义文档。
我也是刚开始使用 GUI-Guider 和 黄山派小智不多久,有可以提升的地方也希望大家一同指出。
最后会附上源代码文件和固件。
三、流程简介
1、GUI-Guider建立一个自定义的待机界面
2、添加生成的界面代码
2、缩减小智原代码
3、随后将生成的相关代码移植到小智的代码中
4、然后适配相关的代码
5、更新显示
四、Gui-Guider 建立自定义待机界面
Gui-Guider 的学习可以看B站的相关教学视频,这里做一些简单的说明。
需要注意的是,小智相关代码使用的是lvgl_v9
以下是创建工程的流程

这里选择lvgl_v9



面板类型可以填写 oled 宽高必须是 390*450

控件放置
包含的控件及功能
定义好控件的名称,方便后续识别调用。
所有控件位置都可以自定义摆放
| 控件 | 使用 | 名称 |
|---|---|---|
| 文本 | 电量百分比显示 | xiaozhiui_battery_percent |
| 文本 | 年月日日期显示 | xiaozhiui_date |
| 文本 | 时间的时分显示 | xiaozhiui_time |
| 文本 | 时间的秒数显示 | xiaozhiui_second |
| 文本 | 天气信息显示 | xiaozhiui_weather |
| 文本 | 小智连接状态信息显示 | xiaozhiui_connect |
| 进度条 | 电池电量进度条显示 | xiaozhiui_battery |
| 图片 | 蓝牙连接成功图片 | xiaozhiui_ble_Y |
| 图片 | 蓝牙未连接时显示 | xiaozhiui_ble_N |
| 图片 | 待机界面背景 | xiaozhiui_bg |

背景图片显示控件
xiaozhiui_bg设置大小390*450位置0,0即可

蓝牙图标显示控件
xiaozhiui_ble_Y&xiaozhiui_ble_N
图片控件大小位置可以自定义放置
这里将两个图片控件大小设置为40*40
位置在X:40 Y:15
将xiaozhiui_ble_Y新增Hidden让其默认隐藏,方便实现状态切换功能

时间/电量文本控件
xiaozhiui_time&xiaozhiui_second&xiaozhiui_battery_percentxiaozhiui_time中填入文本00:00字体大小80字体样式设置为AlexBrush_Regularxiaozhiui_second中填入文本00字体大小设置16字体样式设置为SourceHanSerifSC_Regularxiaozhiui_battery_percent中填入文本100%字体大小设置10字体样式设置为SourceHanSerifSC_Regular
控件基础属性设置如下


xiaozhiui_second样式属性

年月日周显示控件
xiaozhiui_date
文本中填入2025年12月30日 周三 一二三四五六末包含所有可能需要显示的汉字,其他文本的设置也是类似的
同时字体样式选择SourceHanSerifSC_Regular只有这个字体样式可以显示中文,否则无法显示
模式选择Warp即可
这里设置显示分为上下两行


天气信息/小智连接信息
文本框样式信息如下
模式选择Circular

xiaozhiui_connect文本内容
连接中...按键小智...初始化请稍等蓝牙断开PAN成功尝试唤醒重新启正在确保设备开启了共享网络新发起
xiaozhiui_weather 文本内容
这里我只包含了当前所在地区附近的地址,其他未加入的地址显示时会出现口,所以地址需要根据所在地区填入
IP °城市天气温度: 年月日天气雨雪大小中风冰雾沙晴多云转阵雷伴有雹夹暴特冻尘到浮扬强上海黄浦徐汇区长宁静安普陀虹口杨闵行宝山嘉定东新区金山松江青奉贤崇明
电池电量显示
xiazhiui_battery



运行编译,生成C代码
最后,运行编译,生成C代码即可,生成的C代码在工程目录下查看,我们只需要其中
custom&generated中的文件


五、小智源代码
当前小智版本为 1.3.5
1、添加生成的代码并修改SConscript文件
添加代码
1、在
src目录下添加user_ui文件夹
将GUI_Guider工具生成的代码文件custom和generated文件夹的内容复制放到该目录下。

修改文件
Src下SConscript文件
add:
src = src + Glob('./user_ui/*.c')
src = src + Glob('./user_ui/guider_customer_fonts*/.c')
src = src + Glob('./user_ui/guider_fonts/*.c')
src = src + Glob('./user_ui/images/*.c')

编译验证一下(通过)

2、引用自定义的界面
修改的文件有:
xiaozhi_ui.c
/* 需要做如下修改的文件有 */
main.c
xiaozhi_ui.c
xiaozhi_screen.c
xiaozhi_websocket.c
/* 加入头文件 */
#include "./user_ui/gui_guider.h"
#include "./user_ui/events_init.h"
/* 修改参数 */
/* 修改待机界面 */
/* 并将原 standby_screen 替换成 standby_screen.screen 修改*/
lv_obj_t *standby_screen = NULL; -> lv_ui standby_screen;
xiaozhi_ui.c
这里引用自定义的小智待机界面
lv_obj_t *xiaozhi_standby_screen = NULL; /* 添加背景界面参数,放置小智对话界面 */
xiaozhi_ui_obj_init() 函数
/* 添加初始化代码 */
setup_ui(&standby_screen);
events_init(&standby_screen);
/* 删除不需要的原待机显示代码 */
编译(报错)
这里报错是正常的,因为空间不够,所以需要清理一些资源,腾出空间

3、删除文件
删除不需要的图片资源文件
保留了一个cool表情文件,替换后面所有用到的表情,这样小智就只有这一个表情了
保留了开机logo和非待机界面的蓝牙图标和充电显示
删除资源文件,同时也要删除相关代码xiaozhi_ui.cxiaozhi_ui.hxiaozhi_array.cweather.c

删除编译文件

到此为止已经可以显示自定义的UI,但是这还不够,还需要UI界面能够进行实时更新天气时间等信息。
4、显示更新
在
src\user_ui目录下添加xiaozhiui_update.h
对接数据与guider界面控件,在xiaozhi_ui.c中调用相关代码可以实现实时的更新数据
#include <stdio.h>
#include "./../weather/weather.h"
#include "lvgl.h"
#include <stdio.h>
#include "events_init.h"
#include "widgets_init.h"
#include "custom.h"
#include "gui_guider.h"
extern lv_ui standby_screen; /*小智的待机界面*/
extern date_time_t g_current_time ; /*当前时间结构体*/
extern weather_info_t g_current_weather; /*当前天气结构体*/
char battery_percent_str[8]; /*电池电量字符串*/
//time_ui_update_callback
#define TIME_GET xiaozhi_time_get_current(&g_current_time) /*获取当前时间信息*/
#define Current_Time g_current_time.time_str /*获取当前时间字符串*/
#define Current_Second g_current_time.second_str /*获取当前秒字符串*/
#define Current_Date g_current_time.date_str /*获取当前日期字符串*/
#define Current_Weather g_current_weather.weather_str /*获取当前天气文本信息*/
#define Current_Battery(percent) rt_snprintf(battery_percent_str, sizeof(battery_percent_str), "%d%%", percent) /*获取当前电池电量字符串*/
#define user_ui_time_text_set lv_label_set_text(standby_screen.screen_xiaozhiui_time, Current_Time) /*设置时间标签文本*/
#define user_ui_second_text_set lv_label_set_text(standby_screen.screen_xiaozhiui_second, Current_Second) /*设置秒标签文本*/
#define user_ui_date_text_set lv_label_set_text(standby_screen.screen_xiaozhiui_date, Current_Date) /*设置日期标签文本*/
#define user_ui_weather_text_set lv_label_set_text(standby_screen.screen_xiaozhiui_weather, Current_Weather) /*设置天气标签文本*/
#define user_ui_battery_text_set lv_label_set_text(standby_screen.screen_xiaozhiui_battery_percent, battery_percent_str) /*设置电池标签文本*/
#define user_ui_battery_bar_set(percent) lv_bar_set_value(standby_screen.screen_xiazhiui_battery, percent, LV_ANIM_OFF) /*设置电池进度条值*/
#define user_ui_connect_text_set(connect_text) lv_label_set_text(standby_screen.screen_xiaozhiui_connect, connect_text) /*设置连接标签文本*/
/*蓝牙状态*/
#define user_ui_ble_open lv_obj_clear_flag(standby_screen.screen_xiaozhiui_ble_Y, LV_OBJ_FLAG_HIDDEN); \
lv_obj_add_flag(standby_screen.screen_xiaozhiui_ble_N, LV_OBJ_FLAG_HIDDEN);
#define user_ui_ble_close lv_obj_add_flag(standby_screen.screen_xiaozhiui_ble_Y, LV_OBJ_FLAG_HIDDEN); \
lv_obj_clear_flag(standby_screen.screen_xiaozhiui_ble_N, LV_OBJ_FLAG_HIDDEN);
/*ui更新*/
#define user_ui_update lv_obj_update_layout(standby_screen.screen)
蓝牙状态更新

电量显示更新

小智连接状态文本更新

更新时间/日期信息
添加/修改格式来适应自定义界面格式

weather.c下

xiaozhi_ui.c下

天气信息更新
weather.c下

xiaozhi_ui.c下

六、小结
到此为止,一个自定义的且信息可实时更新的小智静态界面就做好了。
由于篇幅限制,我们后期再出,如何自定义动态待机界面背景为动态界面,已经如何优化动态界面显示帧率。
也会附上代码文件和固件。
看看现在编译下载后连接的现象。

更多推荐




所有评论(0)