[GUI] 【STM32H750B-DK评测】光伏发电控制系统

[复制链接]
3051|10
 楼主| 奇迹l 发表于 2022-9-7 19:33 | 显示全部楼层 |阅读模式
本帖最后由 奇迹l 于 2022-9-7 19:30 编辑

@21小跑堂
一、项目简介
本次评测主要偏向TouchGFX GUI开发部分,设计了一个简单的光伏发电控制界面,主题设计思路以简单易用为主,共计分为三个界面,主页、配置、报警,主要为了体现TouchGFX快速开发,以及简单设置就能得到一个较好界面的功能。

二、GUI设计部分
1.动态图表

看了看网上的图片,计划设计一个类似下图的图表,但是线比这稍微暗淡一点,有y轴的坐标。
QQ截图20220907142920.png

1.1 选择动态图表功能并放置
QQ截图20220907143301.png

1.2 将放置的图表调整到合适大小,点击进行配置
QQ截图20220907143441.png

1.3 设置显示模式为第二个(1.显示完一个屏幕后,全部清空,重新显示;2.显示完一个屏幕后,向前移动动态更新;3.显示完一个屏幕后,从头进行覆盖显示)
QQ截图20220907143512.png

1.4 设置Y最大数值 与分辨率(分辨率越高,能显示的精度就越高)
QQ截图20220907143558.png

1.5 设置Y轴网格显示
QQ截图20220907143633.png

1.6 设置界面内缩(优化显示,方便坐标轴数字显示)
QQ截图20220907143726.png

1.7 设置Y轴坐标轴数字显示
QQ截图20220907143746.png

1.8 配置图表填充,其中选择的图片为一张蓝到透明渐变,大小与整个图表相同的图片
QQ截图20220907143842.png

1.9 进行其他调整

1.10 修改代码,在滴答事件中,加入波形生成与数字显示
  1. float random_number[] = { 15.72058f, 13.5207f, 11.89068f, 11.52808f, 12.79996f, 15.64194f, 19.5641f, 23.76272f, 27.31082f, 29.38111f, 29.44686f, 27.41166f, 23.63623f, 18.85561f, 14.0067f, 10.00822f, 7.54646f, 6.91894f, 7.9737f, 10.15872f, 12.66879f, 14.65338f, 15.43436f, 14.67961f, 12.49004f, 9.37813f, 6.14351f, 3.67557f, 2.7319f, 3.74666f, 6.71617f, 11.19009f, 16.37062f, 21.29599f, 25.06366f, 27.03928f, 27.00043f, 25.18074f, 22.20367f, 18.92286f, 16.20808f, 14.72967f, 14.79419f, 16.27155f, 18.63144f, 21.07988f, 22.76223f, 22.98262f, 21.38562f, 18.05532f, 13.50694f, 8.57267f, 4.20914f, 1.27323f, 0.32068f, 1.47657f, 4.40899f, 8.41221f, 12.57907f, 16.02009f, 18.07607f, 18.47218f, 17.37615f, 15.34661f, 13.18478f, 11.72615f, 11.62375f, 13.17641f, 16.24474f, 20.27564f, 24.42979f, 27.78132f, 29.54078f, 29.24728f, 26.88245f, 22.87856f, 18.01858f, 13.25226f, 9.47326f, 7.31119f, 6.98926f, 8.28185f, 10.58186f, 13.06097f, 14.88297f, 15.41768f, 14.40254f, 12.01216f, 8.81852f, 5.65146f, 3.39358f, 2.75987f, 4.11623f, 7.38144f, 12.03707f, 17.2432f, 22.03209f, 25.5329f, 27.17287f, 26.80623f };
  2. void homeView::handleTickEvent()
  3. {
  4.     static uint8_t i = 0;
  5.     dynamicGraph1.addDataPoint(random_number[i]);
  6.     i++;
  7.     if (i >= 100) i = 0;

  8.     if (i % 20 == 0)
  9.     {
  10.         Unicode::snprintfFloat(power_textBuffer, POWER_TEXT_SIZE, "%.1f", random_number[i]);
  11.         power_text.invalidate();
  12.     }
  13. }

1.11 最终效果
bandicam-2022-09-07-17-45-35-884.gif

2.动态更新列表
设备运行时会产生许多条消息,这些消息我希望能实现类似智能手机的消息条机制,可以随意清除其中的某一条,然后后面的自动递补上

2.1 创建一个单个消息条的自定义控件,并给其中的按键设置一个点击事件,调用自定义函数 deleteAction
QQ截图20220907175646.png

2.2 添加一个可滚动容器(让里面的元素可以滚动),一个列表布局(实现自动排列功能),并调整大小
QQ截图20220907175730.png

2.3 将list拖到scrollCnt的下面
QQ截图20220907175741.png

2.4 配置list 方向设置为上下布局
QQ截图20220907175750.png

2.5 设置自定义组件函数 setupListElement设置里面显示的文字 setAction设置回调函数 deleteAction调用上一层的回调函数
  1. void CustomListElement::setupListElement(TEXTS iconTextID)
  2. {
  3.     text.setTypedText(TypedText(iconTextID));
  4.     text.resizeToCurrentText();
  5.     invalidate();
  6. }

  7. void CustomListElement::setAction(GenericCallback< CustomListElement& >& callback)
  8. {
  9.     viewCallback = &callback;
  10. }

  11. void CustomListElement::deleteAction()
  12. {
  13.     // Inform the view of the event
  14.     if (viewCallback->isValid())
  15.     {
  16.         viewCallback->execute(*this);
  17.     }
  18. }

2.6 设置初始化,添加自定义控件元素到list下
  1. void alertView::setupScreen()
  2. {
  3.     alertViewBase::setupScreen();

  4.     list.setHeight(0); //Compensates for the list height that is set to 200 by the designer

  5.     listElements[0].setupListElement(T_LIST_ELEMENT_00);
  6.     listElements[1].setupListElement(T_LIST_ELEMENT_01);
  7.     listElements[2].setupListElement(T_LIST_ELEMENT_02);
  8.     listElements[3].setupListElement(T_LIST_ELEMENT_03);
  9.     listElements[4].setupListElement(T_LIST_ELEMENT_04);
  10.     listElements[5].setupListElement(T_LIST_ELEMENT_05);
  11.     listElements[6].setupListElement(T_LIST_ELEMENT_06);
  12.     listElements[7].setupListElement(T_LIST_ELEMENT_07);
  13.     listElements[8].setupListElement(T_LIST_ELEMENT_08);
  14.     listElements[9].setupListElement(T_LIST_ELEMENT_09);
  15.     listElements[10].setupListElement(T_LIST_ELEMENT_10);

  16.     for (uint8_t i = 0; i < numberOfListElements; ++i)
  17.     {
  18.         listElements[i].setAction(listElementClickedCallback);
  19.         list.add(listElements[i]);
  20.     }

  21.     scrollCnt.setX(480);
  22. }

2.7 回调函数,删除list里面的一个子元素
  1. void alertView::listElementClicked(CustomListElement& element)
  2. {
  3.     // The button of the list element has been pressed
  4.     // so it is removed from the list
  5.     list.remove(element);
  6.     scrollCnt.invalidate();
  7. }

2.8最终效果
bandicam-2022-09-07-18-25-10-561.gif

3.动画
TouchGFX提供了一套简单的做动画的机制,很简单就能实现动画效果

3.1 选中需要做动画组件控件,勾选MoveAnimator
QQ截图20220907190934.png

3.2 设置屏幕转换结束回调
QQ截图20220907192103.png

3.3 设置控件初始位置(函数被简化)
  1. void alertView::setupScreen()
  2. {
  3.     alertViewBase::setupScreen();
  4.     scrollCnt.setX(480);
  5. }

3.4 屏幕转换结束回调,设置动作动画
  1. void alertView::ScreenBegins_function()
  2. {
  3.     scrollCnt.setMoveAnimationDelay(0);
  4.     scrollCnt.startMoveAnimation(80, scrollCnt.getY(), 15, EasingEquations::cubicEaseInOut);
  5. }

3.5 最终效果
bandicam-2022-09-07-19-11-15-111.gif

三、实际效果演示



地下縱情搖擺 发表于 2022-11-26 07:20 | 显示全部楼层
这个GUI能占用MCU的多少资源啊?

热爱童话世界 发表于 2022-11-26 07:52 | 显示全部楼层
感觉还是lvgl能好点?还能让低端一些的MCU能运行起来

喜爱弄人 发表于 2022-11-26 08:24 | 显示全部楼层
感觉TouchGFX只适合H7F7这种MCU,运行起来能效果好点

占得人间第一春 发表于 2022-11-26 08:56 | 显示全部楼层
看楼主做的效果,果然使用TouchGFX开发起来还很快嘛

风吻过你的不羁 发表于 2022-11-26 10:00 | 显示全部楼层
话说,你用模拟器是不是能直接生成代码啊?

討厭和人归類 发表于 2022-11-26 10:32 | 显示全部楼层
这种GUI是不是就图片占用的资源比较多啊?

极客晨星 发表于 2022-11-26 11:04 | 显示全部楼层
效果真是不错,而且感觉很有心意,TouchGFX很强

晚晚皆安 发表于 2022-11-26 11:36 | 显示全部楼层
想问一下,想要学习TouchGFX的话,一般就会C语言是不是就可以了

岁月反驳 发表于 2022-11-26 12:08 | 显示全部楼层
TouchGFX的控件可真多啊

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

本版积分规则

1

主题

8

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部