1599|1

281

帖子

7

TA的资源

一粒金砂(高级)

楼主
 

【智能水杯托】03-基于TouchGFX的UI设计 [复制链接]

 

本次作品是设计一款水杯托,能检测水杯使用状态,能够提醒用户及时喝水。初步设计的系统状态机如下图。

图1、状态机

待机状态下,显示一个模拟时钟。如果超过一定时间用户未拿起水杯,进入下一个提醒状态。如果未超时就喝水,进入鼓励状态。

提醒状态下,显示文本“该喝水啦!”。如果用户拿起水杯,进入鼓励状态。

鼓励状态下,显示文本“棒棒哒!”。如果用户放下水杯,进入待机状态。如果超过一定时间用户未放下水杯,进入接水状态。

接水状态下,显示文本“接水去了吗?”。如果用户放下水杯,进入待机状态。

下面开始使用TouchGFX 4.20.0 Designer设计界面。首先基于STM32L496G-DISCO创建一个空工程,如下图。

图2、创建工程

添加背景、控件等等,如下图是添加模拟时钟。

图3、添加控件

经过一番折腾尝试,终于把界面配置好,如下图。由于不熟练,还专门增加一个屏幕,用来测试各个控件的用法。

图4、界面设计

我先在测试屏幕把用到的各个元素进行了一番尝试,并确认代码能实现,然后才向正式的主屏幕移植。如下图是测试屏幕的样子。

图5、测试屏幕

这里特别说明一下,为了模拟水杯拿起和放下,我在主界面设置了两个透明按钮来实现状态的改变。可能有同学会疑惑为啥不用VS实现,这里我特别说明一下,这个平台头次接触,我还没学会(´-﹏-`;)。

下图是其中一个按钮的说明。为了方便按到,我把上半个屏幕作为可触控区域,然后按钮放在最上层,并设置透明。在最右边添加交互,调用一个虚函数。

图6、透明按钮

下图是透明按钮交互虚函数实现的具体介绍,注意有些代码是自动生成的,有些是我添加的。

图7、虚函数实现

然后就是在<MainView.cpp>这个文件中添加代码,实现我设计的状态机。下面是具体的代码。

代码1、状态机实现

#include <gui/main_screen/MainView.hpp>
#include <texts/TextKeysAndLanguages.hpp>

MainView::MainView()
{
    tickCounter = 0;
    delayCounter = 0;
    delayStatus_cur = 0;
    position_d = 0;
}

void MainView::setupScreen()
{
    MainViewBase::setupScreen();
    analogHours = analogClock.getCurrentHour();
    analogMinutes = analogClock.getCurrentMinute();
    analogSeconds = analogClock.getCurrentSecond();
}

void MainView::tearDownScreen()
{
    MainViewBase::tearDownScreen();
}

void MainView::handleTickEvent()
{
    tickCounter++;

    if (tickCounter % 60 == 0)
    {
        delayCounter++;
        if (++analogSeconds >= 60)
        {
            analogSeconds = 0;
//            delayCounter++;
            if (++analogMinutes >= 60)
            {
                analogMinutes = 0;
                if (++analogHours >= 24)
                {
                    analogHours = 0;
                }
            }
        }

        // Update the clocks
        analogClock.setTime24Hour(analogHours, analogMinutes, analogSeconds);
    }
    /////////////////////////////////////
#define POS_TIMEOUT 10  //水杯放置时间    
#define DRINK_TIMEOUT 5  //拿起水杯喝水时间
#define POS_ON   0  //水杯在位置
#define POS_OFF  1  //水杯离开
    

    switch (delayStatus_cur)
    {
    case RUN_CLOCK:
        if(delayCounter > POS_TIMEOUT)
        {
            delayStatus_cur = RUN_REMIND;
            
            //隐藏时钟,显示:该喝水啦
            //Set textArea1 text to Resource: text_drink
            textArea1.setTypedText(touchgfx::TypedText(T_TEXT_DRINK));
            textArea1.invalidate();
            
            //Hide analogClock
            analogClock.setVisible(false);
            analogClock.invalidate();
            
            //Show textArea1
            textArea1.setVisible(true);
            textArea1.invalidate();
            delayCounter = 0;
        }
        if(position_d == POS_OFF)
        {
            delayStatus_cur = RUN_GOOD;
            //隐藏时钟,显示:棒棒哒
            //Set textArea1 text to Resource: T_TEXT_GOOD
            textArea1.setTypedText(touchgfx::TypedText(T_TEXT_GOOD));
            textArea1.invalidate();
            
            //Hide analogClock
            analogClock.setVisible(false);
            analogClock.invalidate();
            
            //Show textArea1
            textArea1.setVisible(true);
            textArea1.invalidate();
            delayCounter = 0;
        }
        break;
    case RUN_REMIND:
        if(position_d == POS_OFF)
        {
            delayStatus_cur = RUN_GOOD;
            //显示:棒棒哒
            //Set textArea1 text to Resource: T_TEXT_GOOD
            textArea1.setTypedText(touchgfx::TypedText(T_TEXT_GOOD));
            textArea1.invalidate();
        }
        delayCounter = 0;
        break;
    case RUN_GOOD:
        if(delayCounter > DRINK_TIMEOUT)
        {
            delayStatus_cur = RUN_REFILL;
            //显示:接水去了吗
            //Set textArea1 text to Resource: T_TEXT_REST
            textArea1.setTypedText(touchgfx::TypedText(T_TEXT_REST));
            textArea1.invalidate();
            delayCounter = 0;
        }
        if(position_d == POS_ON)
        {
            delayStatus_cur = RUN_CLOCK;
            //显示时钟,隐藏文字
            //Hide textArea1
            textArea1.setVisible(false);
            textArea1.invalidate();
            
            //Show analogClock
            analogClock.setVisible(true);
            analogClock.invalidate();
            delayCounter = 0;
        }
        
        break;
    case RUN_REFILL:
        if(position_d == POS_ON)
        {
            delayStatus_cur = RUN_CLOCK;
            //显示时钟,隐藏文字
            //Hide textArea1
            textArea1.setVisible(false);
            textArea1.invalidate();
            
            //Show analogClock
            analogClock.setVisible(true);
            analogClock.invalidate();
        }
        delayCounter = 0;
        break;
    default:
        break;
    }
}

void MainView::updateVal(unsigned int newValue)
{
//    position_d = newValue%2;
}

void MainView::functionPosSet()
{
    position_d = POS_OFF;
}

void MainView::functionPosCls()
{
    position_d = POS_ON;
}

通过使用TouchGFX的仿真功能进行测试除错,确定没问题了就可以一键下载到开发板,在硬件上直接测试了。如下视频为调试好的界面展示。


 

视频1、界面展示

综上,基础的界面就设计完了。整体看起来可能很简单,但是对于从零开始学习TouchGFX的人,还是要查阅多个例程,构思哪些功能能够用的上,用何种方式配置,以什么形式展示。但是一旦入了门,这个后续用起来就简单了。

后面我开始添加硬件支持,实现实物水杯的拿起、放下检测,和UI配合起来,变成实用的作品。

最新回复

后面我开始添加硬件支持,实现实物水杯的拿起、放下检测,和UI配合起来,变成实用的作品。 离成功不远啦,加油!   详情 回复 发表于 2022-10-6 17:10
点赞 关注
 
 

回复
举报

6960

帖子

11

TA的资源

版主

沙发
 

后面我开始添加硬件支持,实现实物水杯的拿起、放下检测,和UI配合起来,变成实用的作品。

离成功不远啦,加油!

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
KOMAT'SU工控触摸屏

有块大芯片查不到DATASHEET,有哪位高人乐意帮忙啊?29844

[MSP430 学习笔记] 晶体振荡器的负载电容

最近有童靴在问如何确定MSP430的晶体负载电容,一般来讲,大家都是在用一些经验值,对其原理也不是特别清楚。 有兴趣的同学可以看 ...

RTC晶振

最近一个项目用到STM32,要求做晚间睡眠,早上定时唤醒,在调RTC的过程中碰到些问题,解决后跟大家分享一下: 一、刚开始是很多 ...

[LPC54102]04、LPC5410x启动过程分析

本帖最后由 dvd1478 于 2015-4-23 00:45 编辑 LPCXpressopen 进行lib方式的开发,不利于上电复位的流程,也做成我读按键的值 ...

测评颁奖: 国产FPGA高云GW1N 系列开发板

感谢网友参与&分享 国产FPGA高云GW1N 系列开发板,这个活动开启了论坛的国产fpga之旅,尝鲜小分队也很给力。关于国产fpga,大 ...

HMI芯片方案接龙啦

本贴的目的是想让大家推荐一些可以用来制作HMI方案的芯片。下面就是我知道的一些芯片介绍。 一、全志 F1C100S、 1、指令集 ...

中国ROHS检测 产品rohs六项报告办理

中国ROHS检测 产品rohs六项报告办理 金属rohs2.0测试项目 首先,简单说下RoHS2.0检测这个概念。 RoHS2.0检测是旧Ro ...

【DigiKey创意大赛】食堂自助计价系统+图像采集完成

本帖最后由 奇迹12 于 2023-12-17 21:41 编辑 感谢Digikey和EEWORLD开展的活动,本次活动我参赛的项目是《食堂自助计价系统》 ...

《深度学习的数学——使用Python语言》3、NumPy数据类型

第1.2.2节中,讲到NumPy的底层是用C语言实现的,因为NumPy支持C语言中所有的数据类型,在数据输入时,可以由用户选择数据类型, ...

关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表