OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7063|回复: 4

智能家居UI--空调控制/智能家居UI--空调控制

[复制链接]

1070

主题

1081

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4443
金钱
4443
注册时间
2019-5-8
在线时间
1199 小时
发表于 2022-3-11 17:27:05 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2022-3-11 17:26 编辑

以下文章来源于:公众号:开源电子网,读取更多技术文章,请扫码关注




智能家居UI--空调控制
接下来,小编来讲解使用LVGL8.2版本GUI图形库,制作智能家居空调控制UI界面讲解,注意:源码请在公众号获取。
前期准备:
n  PC模拟器—LVGL模拟项目工程请在官方网址下载。
n  背景图片,在百度搜索自己喜欢的背景
n  图标下载:阿里巴巴图标矢量库(https://www.iconfont.cn/)
n  图片工具:博客(By 夏雨夜寐)制作的软件
n  字库生成软件:网友【阿里】制作的(http://www.lfly.xyz/forum.php)
       接下来,我们来制作空调控制UI界面,如下图所示:
image001.png
       实现功能:
       选择空调模式,例如干燥、静音、制冷等等模式,注意:只能选择一个模式。
       界面整体布局:
image003.png
       从上述图可知:我们所需要img部件、tabview部件、btn部件、label部件即可完成。
       图标图片制作:
       打开Lvgl_image_convert_tool软件,如下图所示:
image006.jpg
       注意:其他图标也是一样,根据上图制作。
       制作背景图片:
       自行制作,这里不便演示。
       制作字库字体:
       注意:字库制作请看智能家居UI—灯光控制推文。
       打开PC模拟器,编写代码:
1.     声明字库和图片:
LV_IMG_DECLARE(light_contro_win)
LV_IMG_DECLARE(air_conditioning_control_win)
LV_IMG_DECLARE(curtain_control_wi)
LV_IMG_DECLARE(uase_win)
LV_IMG_DECLARE(music_win)

LV_IMG_DECLARE(lv_light_bg)
LV_FONT_DECLARE(myFont14)
LV_FONT_DECLARE(myFont18)
LV_FONT_DECLARE(myFont24)

typedef struct
{
    const void* app_image;
}app_image_info;


static const app_image_info app_image[] =
{
    {&light_contro_win},
    {&air_conditioning_control_win},
    {&curtain_control_wi},
    {&uase_win},
    {&music_win},
};
/* 获取路径的个数 */
#define image_mun(int)(sizeof(app_image)/sizeof(app_image[0]))
2.     编写主界面函数:
/**
  * @brief LVGL 入口
  * @param
  * @retval 无
  */
void lv_mainstart(void)
{
/* 创建tabview部件 */
lv_tabview_win = lv_tabview_create(lv_scr_act(), LV_DIR_LEFT, 80);
/* 创建5个tab */
    lv_tabview_tab_light_win = lv_tabview_add_tab(lv_tabview_win, " ");
    lv_tabview_tab_air_win = lv_tabview_add_tab(lv_tabview_win, " ");
    lv_tabview_tab_win = lv_tabview_add_tab(lv_tabview_win, " ");
    lv_tabview_uase_win = lv_tabview_add_tab(lv_tabview_win, " ");
    lv_tabview_music_win = lv_tabview_add_tab(lv_tabview_win, " ");

/* 获取5个tab的父类就是矩阵部件 */
lv_obj_t* tab_btns =lv_tabview_get_tab_btns(lv_tabview_win);
/*矩阵部件设置颜色 */
lv_obj_set_style_bg_color(tab_btns,
lv_color_make(59, 57, 71), LV_STATE_DEFAULT);
/* 矩阵部件回调函数 */
lv_obj_add_event_cb(tab_btns,lv_tab_btns_event_cb, LV_EVENT_ALL, NULL);
/* 空调控制界面 */
lv_air_conditioning_win(lv_tabview_tab_air_conditioning_control_win);
}
3.     绘画左边的图标,如下图所示:
image007.png
注意:上图的图标如何制作,大家可以看智能家居UI—灯光控制推文。
4.     编写空调控制界面:
  1. char* lv_air_btn_name[6] = { "干燥","静音","制冷","健康","节能","制热"};

  2. lv_obj_t* lv_air_btn[6];

  3. lv_obj_t* lv_air_btn_label[6];



  4. #define lv_object_number                          6

  5. #define lv_air_btn_w                               150

  6. #define lv_air_btn_h                               70

  7. #define lv_air_btn_number_of_rows               3

  8. #define lv_air_btn_object_clearance             15

  9. #define lv_air_btn_Top_and_bottom_clearance    15



  10. /* air_app就绪表 */

  11. unsigned int  air_app_readly_list[32];

  12. /* air_app触发位 */

  13. int lv_air_trigger_bit = 0;

  14. /* air_app状态表 */

  15. int air_app[lv_object_number] = { 0,0,0,0,0,0 };



  16. void lv_air_conditioning_win(lv_obj_t* parent)

  17. {

  18.     int lv_index = 0;



  19.     lv_obj_clear_flag(parent, LV_OBJ_FLAG_SCROLLABLE);



  20.     lv_obj_t* lv_air_image_bg = lv_img_create(parent);

  21.     lv_img_set_src(lv_air_image_bg, &lv_light_bg);

  22.     lv_obj_center(lv_air_image_bg);



  23.     lv_obj_t* lv_air_t = lv_img_create(parent);

  24.     lv_img_set_src(lv_air_t, &air_conditioning_control_win);

  25.     lv_obj_align(lv_air_t, LV_ALIGN_TOP_LEFT, 0, 0);

  26.     lv_obj_set_style_img_recolor_opa(lv_air_t, 255, LV_PART_MAIN);

  27.    

  28. /* 代码篇幅过长,请在公众号获取源码 */



  29.     lv_index++;



  30.     for (lv_index = 1; lv_index < 6; lv_index++)

  31.     {

  32.         /* 代码篇幅过长,请在公众号获取源码 */

  33.     }

  34. }

复制代码

上述源码:主要设置空调控制的主界面以及设置各个控件的样式属性和回调函数。
5.     实现相关功能:
  1. /**

  2.   * @brief  APP按键回调函数

  3.   * @param  obj  :对象

  4.   * @param  event:事件

  5.   * @retval 无

  6.   */

  7. static void lv_air_control_event_handler(lv_event_t* event)

  8. {

  9.     lv_event_code_t code = lv_event_get_code(event);

  10.     lv_obj_t* obj = lv_event_get_target(event);



  11.     if (code == LV_EVENT_CLICKED)

  12.     {

  13.         for (int i = 0; i < lv_object_number; i++)

  14.         {

  15.             if (obj == lv_air_btn[i])

  16.             {

  17.                 air_app_readly_list[i] = 1; /* app就绪表位置1 */                                            

  18.             }

  19.         }

  20. /* 计算前导指令 */

  21.         lv_air_trigger_bit = ((unsigned int)lv_clz((air_app_readly_list)));            

  22.         air_app[lv_air_trigger_bit] ++;

  23. /* 该位清零就绪表 */

  24.         air_app_readly_list[lv_air_trigger_bit] = 0;                                   

  25. /* 根据该位做相应的函数 */

  26.         switch (lv_air_trigger_bit)                                                   

  27.         {

  28.             case 0:

  29.             case 1:

  30.             case 2:

  31.             case 3:

  32.             case 4:

  33.             case 5:

  34.             case 6:

  35.                 for (int i = 0; i < lv_object_number; i++)

  36.                 {

  37.                     if (obj == lv_air_btn[i])

  38.                     {

  39.                         lv_obj_set_style_bg_color(lv_air_btn[i],

  40.                                                    lv_palette_main(LV_PALETTE_BLUE),

  41.                                                    LV_STATE_DEFAULT);

  42.                     }

  43.                     else

  44.                     {

  45.                         lv_obj_set_style_bg_color(lv_air_btn[i],

  46.                                                    lv_palette_main(LV_PALETTE_GREY),

  47.                                                    LV_STATE_DEFAULT);

  48.                     }

  49.                 }

  50.                 break;

  51.             default:

  52.                 break;

  53.         }

  54.     }

  55. }
复制代码

       上述回调函数主要作用是:判断那个按键按下,然后填充背景颜色以及其他按键按下时,会把上一个状态翻转。
最后,PC模拟器模拟,如以下GIF所示:
image008.gif



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

113

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1392
金钱
1392
注册时间
2021-8-10
在线时间
263 小时
发表于 2022-3-12 07:51:53 | 显示全部楼层
回复 支持 反对

使用道具 举报

6

主题

43

帖子

0

精华

高级会员

Rank: 4

积分
755
金钱
755
注册时间
2021-6-20
在线时间
78 小时
发表于 2022-3-13 19:48:50 | 显示全部楼层
点赞,码一下
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2019-1-30
在线时间
5 小时
发表于 2023-3-10 07:53:13 | 显示全部楼层
好例程
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2019-1-30
在线时间
5 小时
发表于 2023-3-10 07:54:07 | 显示全部楼层
很好,不错的源码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-8 15:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表