打印

隔空手势识别测试系统

[复制链接]
314|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DW好汉|  楼主 | 2024-3-15 13:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.介绍
现在很多产品都带有屏幕,而有些屏幕不一定带触摸功能。不带触摸的屏幕,要控制屏幕一般都是用按键控制,而今天给大家带来的是不一样的无触摸屏幕的交互体验,通过隔空手势检测,来控制屏幕。

2.硬件准备
7英寸迪文科技COF超薄智能串口屏 DMG80480F070_01W,迪文COF系列评估板,PAJ7620U2 9种手势识别传感器模块
3.设计
首先是界面的设计,设计时要区分背景和控件素材,这样在更新素材的时候会便捷。

然后是首页的设计,通过手势识别进入测试系统,不需要任何按键,将手贴近传感器即可进入菜单系统。每个界面的右上角都会有一个手势识别状态,不同的数字代表识别到的手势。

进入菜单系统,共有四个选项,分别是翻页、识别、特殊和退出。可以通过上下左右手势进行选择,然后贴近传感器进行确认。

进入翻页界面,会有两张图片,通过上下左右对两张图片进行滑动切换。接近传感器3秒会退出到菜单页面。

进入识别界面,会显示识别到的手势,可以自由测试9种手势。接近传感器3秒会退出到菜单页面。

进入特殊界面,这个界面是一个滑动条,可以通过手势,左旋转和右旋转调节滑动条的值。接近传感器3秒会退出到菜单页面。

最后是程序设计,首先定义了一些变量和宏。
<font face="宋体">#define SELECT_RECTANGLE    0x1000  //选择框变量地址
#define SELECT_DESCRIBE_RECTANGLE    0x1100  //选择框描述地址
#define TURNING_IMAGE1    0x2100  //图片1描述地址
#define TURNING_IMAGE2    0x2200  //图片2描述地址
#define RECOGNITION_VAR_ICON    0x3000  //识别图标变量地址
#define SPECIAL_SLIDE    0x4000  //滑动条变量地址
uint8_t screen_page = 0;        //0主页,1选择页,2翻页页,3识别页,4特殊页
uint16_t forward_cnt = 0;       //向前计数器
uint8_t forward_flag = 0;       //向前标志位
uint8_t select_value = 0;       //选择页,0翻页,1识别,2特殊,3退出
uint16_t select_pos[4][2] =  {{133,124},{441,124},{133,296},{441,296}}; //选择页位置
uint8_t turning_current_image = 0;  //当前显示图片,0无图片,1图片1,2图片2
uint8_t turning_last_image = 0;  //上一张显示图片,0无图片,1图片1,2图片2</font>
复制代码
接下来是翻页界面的程序设计,通过识别到的动作,切换选择框图片的位置。

<font face="宋体">void select_operate(uint16_t gesrure_value)
{
    if(gesrure_value == GES_UP) //上
    {
        if(select_value >= 2)
        {
            select_value -= 2;
        }
        dgus_show_variate_icon_location_set(SELECT_DESCRIBE_RECTANGLE, select_pos[select_value][0], select_pos[select_value][1]);
    }
    else if(gesrure_value == GES_DOWN) //下
    {
        if(select_value <= 1)
        {
            select_value += 2;
        }
        dgus_show_variate_icon_location_set(SELECT_DESCRIBE_RECTANGLE, select_pos[select_value][0], select_pos[select_value][1]);
    }
    else if(gesrure_value == GES_LEFT) //左
    {
        if(select_value % 2 == 1)
        {
            select_value -= 1;
        }
        dgus_show_variate_icon_location_set(SELECT_DESCRIBE_RECTANGLE, select_pos[select_value][0], select_pos[select_value][1]);
    }
    else if(gesrure_value == GES_RIGHT) //右
    {
        if(select_value % 2 == 0)
        {
            select_value += 1;
        }
        dgus_show_variate_icon_location_set(SELECT_DESCRIBE_RECTANGLE, select_pos[select_value][0], select_pos[select_value][1]);
    }
}</font>
复制代码
比较复杂的是翻页界面,检测到上下左右手势后,需要判断一下当前显示的图片,然后将当前显示的图片划出界面,同时将下一次要显示的图片,以同等方向划入界面。

<font face="宋体">void turning_operate(uint16_t gesrure_value)
{
    uint16_t i = 0;
    uint8_t turning_mode = 0;       //翻页模式,0上,1下,2左,3右
    uint16_t turning_count = 0;     //翻页最终次数
    if(gesrure_value == GES_UP || gesrure_value == GES_DOWN || gesrure_value == GES_LEFT || gesrure_value == GES_RIGHT)
    {
        if(gesrure_value == GES_UP) //上
        {
            turning_mode = 0;
            turning_count = 48;
        }
        else if(gesrure_value == GES_DOWN) //下
        {
            turning_mode = 1;
            turning_count = 48;
        }
        else if(gesrure_value == GES_LEFT) //左
        {
            turning_mode = 2;
            turning_count = 80;
        }
        else if(gesrure_value == GES_RIGHT) //右
        {
            turning_mode = 3;
            turning_count = 80;
        }
        if(turning_current_image == 0 || turning_current_image == 2)
        {
            turning_current_image = 1;
        }
        else
        {
            turning_current_image = 2;
        }
        for(i = 0;i <= turning_count;i++)
        {
            switch(turning_mode)
            {
                case 0:
                    dgus_show_variate_icon_location_set(turning_current_image * 0x100 + 0x2000, 0, 480 - i * 10);
                    t5l0_sys_delay_ms(20);
                    if(turning_last_image != 0)
                    {
                        dgus_show_variate_icon_location_set(turning_last_image * 0x100 + 0x2000, 0, 0 - i * 10);
                    }
                    break;
                case 1:
                    dgus_show_variate_icon_location_set(turning_current_image * 0x100 + 0x2000, 0, -480 + i * 10);
                    t5l0_sys_delay_ms(20);
                    if(turning_last_image != 0)
                    {
                        dgus_show_variate_icon_location_set(turning_last_image * 0x100 + 0x2000, 0, 0 + i * 10);
                    }
                    break;
                case 2:
                    dgus_show_variate_icon_location_set(turning_current_image * 0x100 + 0x2000, 800 - i * 10, 0);
                    t5l0_sys_delay_ms(20);
                    if(turning_last_image != 0)
                    {
                        dgus_show_variate_icon_location_set(turning_last_image * 0x100 + 0x2000, 0 - i * 10, 0);
                    }
                    break;
                case 3:
                    dgus_show_variate_icon_location_set(turning_current_image * 0x100 + 0x2000, -800 + i * 10, 0);
                    t5l0_sys_delay_ms(20);
                    if(turning_last_image != 0)
                    {
                        dgus_show_variate_icon_location_set(turning_last_image * 0x100 + 0x2000, 0 + i * 10, 0);
                    }
                    break;
            }
            t5l0_sys_delay_ms(20);
        }
        turning_last_image = turning_current_image;
    }
}</font>
复制代码


4.总结
对于无触摸的屏幕,交互的方式也不少,不过手势识别是一个比较前沿的技术,可以让用户有更多的体验。还有一些隔空的控制,比如手指、手臂状态检测等,就像目前的手势感应遥控车一样,也是可以设计到无触摸屏幕中的

使用特权

评论回复

相关帖子

沙发
地瓜patch| | 2024-3-15 22:09 | 只看该作者
这个做好了,绝对好玩

使用特权

评论回复
评论
DW好汉 2024-3-18 17:05 回复TA
基本操作还是可以了哈https://www.bilibili.com/video/BV1zm411S7NP?t=12.1 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

8

帖子

0

粉丝