基于EsDA MPC-ZC1快速实现按键高级应用

电子说

1.2w人已加入

描述

按键是嵌入式产品常用的人机交互方式。为了更好的结构设计、更低的制造成本,对按键功能会有更高的要求,常见有单击、双击和长按等需求。本文将基于 EsDA 开发套件介绍如何快速完成按键业务的开发。  

 简介

按键主要是指轻触式按键,一种常用的电子开关,通过施加压力,使内部金属弹片接触,形成接通;撤销压力时接触点断开连接,从而产生关断效果,其物理特性正好对应到软件中的二进制状态。 EsDA 平台在使用按键功能时,只需要通过拖拽节点、连线绘制流图,即可实现按键信号捕获与处理,大大地简化了开发流程,缩短了项目开发周期,为客户产品抢占市场提供先机。 项目开发过程,除去单一的识别按下、松开等单击事件外,还经常需要支持双击、三击和长按等复杂事件。本文主要论述如何通过 EsDA 开发平台和 MPC-ZC1 工控单板快速实现按键的多种应用场景。

  按键相关节点介绍

按键相关的节点有button和button_expand,用户可在AWFlow Designer中查看相关介绍。button节点用于绑定IO,配置按键高、低电平触发模式,实现基础的按键功能;button_expand节点用于统计处理button节点的行为,并输出给下一个消费者,是对button按键节点功能进行的扩展。

1. button节点

button节点与GPIO绑定之后,即可实时读取到按键的状态,当用户按下/松开按键时,该节点即可输出相应的物理状态(当用户按下按键时,节点输出"on",当用户松开按键时,节点输出"off")。其主要属性如下:

ESDA

显示名称:在流图显示上所展示的名称,用户可自行修改;

对应的GPIO编号: 按键信号引脚所接的引脚编号;

触发条件:可选择是下降沿触发(fall),还是上升沿触发(up),具体模式由用户的硬件模块电路的实现方式决定;

输出变量:在按键按下时输出on,松开时输出off,在初始化完成以及按钮状态发生改变的时候会输出当前状态。

2. button_expand节点

2.1 节点功能简介


button_expand节点为按键节点button的扩展信号处理节点,主要配合button节点进行使用,其主要功能为监控button节点的输出信号情况,从而判断按键触发方式如单击、双击、连击、长按等等。 该节点主要包含两大类主模式,分别为触发条件模式与行为统计模式。触发条件模式,当button的信息情况符合预先设定时,节点将直接触发,同时不会设置payload属性。行为统计模式,该模式下将对button的信息情况进行次数统计,同时会设置payload属性将结果进行输出。


2.2 八种操作模式

cycle mode(trigger): 用户在周期时间内按下指定次数的按键时,该节点将触发输出;

continuous mode(trigger): 用户连续按下按键,且每次按键的时间小于设定时间间隔,将进行累加,直至超出设定间隔时,统计按键次数,若符合设定次数,该节点将触发输出;

press-release mode(trigger): 用户按下按键后持续一段时间再松开,统计按下-松开的时间,若持续时间在设定的时间段内,该节点将触发输出;

keep press mode(trigger): 用户按下按键持续不放,若持续时间超过设定时间,该节点将触发输出;

cycle mode(statistical): 统计用户在周期时间内按下的按键次数,然后通过msg.payload(int)传给后续的节点;

continuous mode(statistical): 用户连续按下按键,且每次按键的时间小于设定时间间隔,将进行累加,直至超出设定间隔时,统计按键次数后通过msg.payload(int)传给后续的节点;

press-release mode(statistical): 用户按下按键后持续一段时间再松开,节点记录按键持续的时间,然后通过msg.payload(int,单位ms)传给后续的节点;

keep press mode(statistical): 用户按下按键持续不放,在持续期内,每超用户设定的周期时间将输出一次按键按下至此刻的时间统计。

* 若论功能模式,则可分为两大类,分别为trigger模式(四种)和statistical模式(四种)。同种操作码类型下,trigger模式与statistical模式可以相互替换,但对流图和数据的处理却有一定的区别。具体区别在后续详细讲解。


2.3 输入变量


由button节点所输出的信号对象。

2.4 输出变量


节点的主题,用户可自行设置。  

  应用案例

本应用将通过4个应用案例,分别讲解cycle mode(trigger)、continuous mode(trigger)、press-release mode(trigger)和keep press mode(trigger)操作类型的应用。

硬件连接

按键模块引脚展示

ESDA

* 该模块为下降沿触发,故流图中的button节点,选择下降沿触发方式。

按键模块与ZC1板连接情况

ESDA

1. cycle mode(trigger)模式实验

1.1 实验简介

本实验使用 MPC-ZC1 板载的 红色LED、绿色LED 作为实验结果指示灯。本实验中,通过LED的不同显示状态来指示不同的按键事件,对应关系如下表。

操作 事件 效果
单击 开启红灯 led灯中 红灯亮
双击 开启绿灯 led灯中 绿灯亮
三击 关闭所有灯光 led灯 熄灭

1.2 流图设计

ESDA


其中,单击、双击、三击名称节点,均为button_expand节点,只是显示名称不同而已。同理,显示名称为开启红灯、开启绿灯、关闭所有灯光节点,均为fscript类型节点。显示名称为红灯、绿灯节点均为led类型节点。

1.3 button_expand节点

1.3.1 单击名称节点

ESDA

cycle mode(trigger): 用户在周期时间内按下指定次数的按键时,该节点将触发输出;

周期时间为800ms: 表示一次触发实限为800ms,及800ms内按下指定次数即可触发该节点;

冷却时间为1200ms: 表示该节点被触发后,需要的冷却时间1200ms,该时间内再次按下将不会触发节点,且节点冷却时间重新计算;

按键次数为1: 表示在指定周期且非冷却时间内按下1次,即可触发该节点;

主题和显示名称: 用户可自行配置,主题为传递给下一个节点的msg.topic参数,显示名称为在流图上节点显示的名字。

该节点主要实现功能为,在800ms周期内,按键被按下一次,节点触发,冷却时间1200ms满后可再次触发。

1.3.2 双击节点

ESDA

* 该节点配置与单击名称节点同理,区别在于按键次数修改为2,即同一周期内只按下两次,即可触发,且主题配置为双击,周期时间配置为1200ms,冷却时间配置为800ms。用户可参照上一小节cycle mode(trigger)模式实验-单击名称节点配置讲解。

1.3.3 三击节点

ESDA

* 该节点配置与单击名称节点同理,区别在于按键次数修改为3,即同一周期内只按下三次,即可触发,且主题配置为三击,周期时间配置为1600ms,冷却时间配置为400ms。用户可参照上一小节cycle mode(trigger)模式实验-单击名称节点配置讲解。

1.4 fscript节点

1.4.1 开启红灯节点

if(msg.topic == "单击"){

    output.payload = 1

}

* 该内容,主要实现对button_expand节点的消息进行判断,如果收到主题信息单击,则向下一个节点传递output对象中的payload属性值为1。由于下一个节点,连接了led节点,即为开灯。 1.4.2 开启绿灯节点

if(msg.topic == "双击"){
    output.payload = 1

}

* 该内容,主要实现对button_expand节点的消息进行判断,如果收到主题信息双击,则向下一个节点传递output对象中的payload属性值为1。由于下一个节点,连接了led节点,即为开灯。   1.4.3 关闭所有灯光节点

if(msg.topic == "三击"){
    output.payload = 0

}

* 该内容,主要实现对button_expand节点的消息进行判断,如果收到主题信息三击,则向下一个节点传递output对象中的payload属性值为0。由于下一个节点,连接了led节点,即为关灯。

1.5 led节点

ESDA

红灯节点

  ESDA

绿灯节点

1.6 实验现象

依次对按键进行单击、双击和三击操作。

ESDA

单击

红灯亮起

  ESDA

双击

绿灯亮起

  ESDA

三击

两灯都熄灭

2. continuous mode(trigger)模式实验

2.1 实验简介

本实验将与cycle mode(trigger)模式实验所实现的功能相同,不同点在于使用的button_expand节点的操作模式为continuous mode(trigger)。

2.2 流图设计

* 同cycle mode(trigger)模式实验流图。

2.3 button_expand节点

2.3.1 单击节点

ESDA

continuous mode(trigger)模式:用户连续按下按键,且每次按键的时间小于设定时间间隔,将进行累加,直至超出设定间隔时,统计按键次数,若符合设定次数,该节点将触发输出;

动作间隔时间为500ms: 表示用户前一次按下与后一次按下间隔时间,如果小于500ms,则进行计数。如果大于500ms时,则停止计数;

按键次数为1:当停止计数时,计数次数为1,则触发该节点;

主题为单击:表示节点触发时,输出给下一个节点的topic信息为"单击"。

2.3.2 双击节点

ESDA

* 该节点配置与单击名称节点同理,区别在于按键次数修改为2,主题配置为双击。用户可参照上一小节continuous mode(trigger)模式实验-单击名称节点配置讲解。

2.3.3 三击节点

ESDA

* 该节点配置与单击名称节点同理,区别在于按键次数修改为3,主题配置为三击。用户可参照上一小节continuous mode(trigger)模式实验-单击名称节点配置讲解。

2.4 其余节点配置 * 同cycle mode(trigger)模式实验中其他节点配置。 2.5 实验现象

依次对按键进行单击、双击和三击操作。

led灯显示情况

同cycle mode(trigger)模式实验中led灯显示情况。


3. press-release mode(trigger)模式实验





3.1 实验简介

本实验主要使用板子上所焊接好的led灯模块,该模块一共有两种灯颜色,分别为红灯与绿灯。本实验中,主要将红灯、绿灯模拟成两个独立的设备,通过一个button按键、button_expand按键实现长按2秒、长按3秒、长按1秒,从而控制红灯、绿灯的开关情况。


3.2 流图设计


ESDA


其中,显示名称为长按2秒、长按3秒、长按1秒的节点,均为button_expand类型节点,只是显示名称不同而已。同理,显示名称为长按开启红灯、长按开启绿灯、长按关闭所有设备的节点,均为fscript类型节点。显示名称为红灯、绿灯均为led类型节点。

3.3 button_expand节点

3.3.1 长按2s节点

ESDA

操作模式为 press-release mode(trigger):用户按下按键后持续一段时间再松开,节点记录按键持续的时间,然后通过msg.payload(int,单位ms)传给后续的节点;

最短持续时间为1800ms: 表示按下按键后,1800ms以前不松开;

最长持续时间为2500ms: 表示按下按键后,2500ms以前必松开。

* 简而言之,从用户刚按下按键开始,如果按住的持续时间介于1800ms与2500ms之间,则该节点触发,输出主题"长按2s"。

3.3.2 长按4s节点

ESDA

* 该节点配置与长按2s名称节点同理,区别在于最短持续时间为3500ms,最长持续时间为4500ms,主题配置为长按4s。用户可参照上一小节press-release mode(trigger)模式实验-长按2s名称节点配置讲解。即从用户刚按下按键开始,如果按住的持续时间介于3500ms与4500ms之间,则该节点触发,输出主题"长按4s"。

3.3.3 长按1s节点

ESDA

* 该节点配置与长按2s名称节点同理,区别在于最短持续时间为500ms,最长持续时间为1200ms,主题配置为长按1s。用户可参照上一小节press-release mode(trigger)模式实验-长按2s名称节点配置讲解。即从用户刚按下按键开始,如果按住的持续时间介于500ms与1200ms之间,则该节点触发,输出主题"长按1s"。

3.4 fscript节点

3.4.1 开启红灯节点

if(msg.topic == "长按2s"){
    output.payload = 1

}

* 该内容,主要实现对button_expand节点的消息进行判断,如果收到主题信息是长按2s,则向下一个节点传递output对象中的payload属性值为1。由于下一个节点,连接了led节点,即为开灯。

3.4.2 开启绿灯名称节点

if(msg.topic == "长按4s"){
    output.payload = 1

}

* 该内容,主要实现对button_expand节点的消息进行判断,如果收到主题信息是长按4s,则向下一个节点传递output对象中的payload属性值为1。由于下一个节点,连接了led节点,即为开灯。

3.4.3 关闭所有设备名称节点

if(msg.topic == "长按1s"){
    output.payload = 0

}

* 该内容,主要实现对button_expand节点的消息进行判断,如果收到主题信息是长按1s,则向下一个节点传递output对象中的payload属性值为0。由于下一个节点,连接了led节点,即为关灯。

3.5 其余节点配置

* 同cycle mode(trigger)模式实验节点配置。 3.6 实验现象 依次对按键进行长按2s、长按4s和长按1s操作。

led灯显示情况;

长按2s-红灯亮起;

ESDA

长按4s-绿灯亮起;

ESDA

长按1s-两灯都熄灭

ESDA

4. keep press mode(trigger)模式实验

4.1 实验简介 本实验主要使用板子上所焊接好的led灯模块,该模块一共有两种灯颜色,分别为红灯与绿灯。本实验中,主要将红灯、绿灯模拟成两个独立的设备,通过一个button按键、button_expand按键实现长按超过2秒、长按超过3秒、长按超过1秒,从而控制红灯、绿灯的开关情况。

4.2 流图设计
ESDA

其中,显示名称为长按超过2秒、长按过时3秒、长按超过1秒的节点,均为button_expand类型节点,只是显示名称不同而已。同理,显示名称为长按开启红灯、长按开启绿灯、长按关闭所有设备的节点,均为fscript节点。显示名称为红灯、绿灯均为led类型节点。

4.3 button_expand节点

4.3.1 长按超过1s节点
ESDA

操作模式为 keep press mode(trigger):用户按下按键持续不放,若持续时间超过设定时间,该节点将触发输出;

超时时间为1000ms: 从用户刚按下按键开始,如果按住的持续时间超过1000ms,则该节点触发,输出主题"长按1s"。

4.3.2 长按超过2s节点

ESDA

* 该节点配置与长按超过1s名称节点同理,区别在于超时时间为2000ms,主题配置为长按超过2s。用户可参照上一小节keep press mode(trigger)模式实验-长按超过1s名称节点配置讲解。即从用户刚按下按键开始,如果按住的持续时间超过2000ms,则该节点触发,输出主题"长按2s"。


4.3.3 长按超过3s节点

ESDA

* 该节点配置与长按超过3s名称节点同理,区别在于超时时间为3000ms,主题配置为长按超过3s。用户可参照上一小节keep press mode(trigger)模式实验-长按超过1s名称节点配置讲解。即从用户刚按下按键开始,如果按住的持续时间超过3000ms,则该节点触发,输出主题"长按3s"。

4.4 fscript节点

4.4.1 长按红灯节点

if(msg.topic == "长按超过1s"){

    output.payload = 1

}

* 该内容,主要实现对button_expand节点的消息进行判断,如果收到主题信息是长按超过1s,则向下一个节点传递output对象中的payload属性值为1。由于下一个节点,连接了led节点,即为开灯。

4.4.2 长按绿灯节点

if(msg.topic == "长按超过2s"){
    output.payload = 1

}

* 该内容,主要实现对button_expand节点的消息进行判断,如果收到主题信息是长按超过2s,则向下一个节点传递output对象中的payload属性值为1。由于下一个节点,连接了led节点,即为开灯。

4.4.3 长按关闭所有设备节点

if(msg.topic == "长按超过3s"){
    output.payload = 0

}

* 该内容,主要实现对button_expand节点的消息进行判断,如果收到主题信息是长按超过3s,则向下一个节点传递output对象中的payload属性值为0。由于下一个节点,连接了led节点,即为关灯。

4.5 其余节点配置

* 同keep press mode(trigger)模式实验节点配置。

4.6 实验现象

4.6.1 操作

一直按住按键,持续4s。

4.6.1 led灯显示情况
ESDA

长按超过1s时

红灯亮起

  ESDA

长按超过2s时

绿灯亮起

  ESDA

长按超过3s时

两灯熄灭

5. 同操作类型下trigger模式与statistical模式的区别

5.1 主要区别

区别一

同操作类型下,两种模式所实现的功能均可相互代替,但是所实现的fscript节点数据处理有所不同。trigger模式主要用于触发它所连接的节点工作;statistical模式则可以输出统计的信息,如连续按下按键的次数,或者按键按下所持续的时间。

区别二

同操作类型下,一个statistical模式节点可以代替多个trigger模式节点所实现的功能(fscript节点处理方式也要更改),从而使我们的流图得到大幅度简化。

5.2 模式实验

* 以continuous mode(trigger)模式实验为例,我们使用对应的(statistical)模式来实现,从而让大家进一步理解其之间的区别。

5.2.1 原trigger实验流图

ESDA

5.2.2 现statistical实验流图

ESDA


* statistical模式流图明显简化。


5.3 button_expand节点 按下次数统计名称节点。

ESDA

* 该实验下,只需要把操作模式切换到statistical模式即可。

5.4 fscript节点

5.4.1 红灯设备控制节点

if(msg.payload == 1){
    output.payload = 1
}

if(msg.payload == 3){
    output.payload = 0

}

* 该内容,主要实现对button_expand节点的消息进行数据处理。如果收到msg.payloa为1,则向下一个节点传递output对象中的payload属性值为1。由于下一个节点,连接了led节点,即为开灯。如果收到msg.payloa为3,则向下一个节点传递output对象中的payload属性值为0。由于下一个节点,连接了led节点,即为关灯。

5.4.2 绿灯设备控制节点

if(msg.payload == 2){
    output.payload = 1
}

if(msg.payload == 3){
    output.payload = 0

}

* 该内容,主要实现对button_expand节点的消息进行数据处理。如果收到msg.payloa为2,则向下一个节点传递output对象中的payload属性值为1。由于下一个节点,连接了led节点,即为开灯。如果收到msg.payloa为3,则向下一个节点传递output对象中的payload属性值为0。由于下一个节点,连接了led节点,即为关灯。

5.5 其余节点配置

* 同continuous mode(trigger)模式实验节点配置。


5.6 实验现象

依次对按键进行单击、双击和三击操作。

led灯显示情况

* 同continuous mode(trigger)模式实验led灯显示情况。

由此可见,使用statistical模式要比trigger模式更佳利于流图的简化,但是流图的简化,便意味着fscript节点中的数据处理可能会更加的复杂。两种方式各有利弊,大家可以根据自身的处理习惯和偏好进行选择。

  总结

button_expand扩展节点很巧妙地实现了,在有限的按键资源下,完成对远大于按键个数的事件进行控制。通过对button输出信号的处理,实现例如单击、n击、长按、短按等各种组合情况的判断。为用户在一定程度上简化了流图的复杂度,节约了一定的硬件资源成本。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分