按键是嵌入式产品常用的人机交互方式。为了更好的结构设计、更低的制造成本,对按键功能会有更高的要求,常见有单击、双击和长按等需求。本文将基于 EsDA 开发套件介绍如何快速完成按键业务的开发。
简介
按键主要是指轻触式按键,一种常用的电子开关,通过施加压力,使内部金属弹片接触,形成接通;撤销压力时接触点断开连接,从而产生关断效果,其物理特性正好对应到软件中的二进制状态。EsDA 平台在使用按键功能时,只需要通过拖拽节点、连线绘制流图,即可实现按键信号捕获与处理,大大地简化了开发流程,缩短了项目开发周期,为客户产品抢占市场提供先机。项目开发过程,除去单一的识别按下、松开等单击事件外,还经常需要支持双击、三击和长按等复杂事件。本文主要论述如何通过 EsDA 开发平台和 MPC-ZC1 工控单板快速实现按键的多种应用场景。
按键相关节点介绍
按键相关的节点有button和button_expand,用户可在AWFlow Designer中查看相关介绍。button节点用于绑定IO,配置按键高、低电平触发模式,实现基础的按键功能;button_expand节点用于统计处理button节点的行为,并输出给下一个消费者,是对button按键节点功能进行的扩展。
1.button节点
button节点与GPIO绑定之后,即可实时读取到按键的状态,当用户按下/松开按键时,该节点即可输出相应的物理状态(当用户按下按键时,节点输出"on",当用户松开按键时,节点输出"off")。其主要属性如下:
显示名称:在流图显示上所展示的名称,用户可自行修改;
对应的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)操作类型的应用。
硬件连接
- 按键模块引脚展示
* 该模块为下降沿触发,故流图中的button节点,选择下降沿触发方式。
- 按键模块与ZC1板连接情况
1.cyclemode(trigger)模式实验
1.1实验简介
本实验使用 MPC-ZC1 板载的红色LED、绿色LED 作为实验结果指示灯。本实验中,通过LED的不同显示状态来指示不同的按键事件,对应关系如下表。
操作 | 事件 | 效果 |
单击 | 开启红灯 | led灯中红灯亮 |
双击 | 开启绿灯 | led灯中 绿灯亮 |
三击 | 关闭所有灯光 | led灯熄灭 |
1.2流图设计
其中,单击、双击、三击名称节点,均为button_expand节点,只是显示名称不同而已。同理,显示名称为开启红灯、开启绿灯、关闭所有灯光节点,均为fscript类型节点。显示名称为红灯、绿灯节点均为led类型节点。1.3 button_expand节点
1.3.1 单击名称节点
cycle mode(trigger):用户在周期时间内按下指定次数的按键时,该节点将触发输出;
周期时间为800ms:表示一次触发实限为800ms,及800ms内按下指定次数即可触发该节点;
冷却时间为1200ms:表示该节点被触发后,需要的冷却时间1200ms,该时间内再次按下将不会触发节点,且节点冷却时间重新计算;
按键次数为1:表示在指定周期且非冷却时间内按下1次,即可触发该节点;
主题和显示名称:用户可自行配置,主题为传递给下一个节点的msg.topic参数,显示名称为在流图上节点显示的名字。
该节点主要实现功能为,在800ms周期内,按键被按下一次,节点触发,冷却时间1200ms满后可再次触发。
1.3.2 双击节点
* 该节点配置与单击名称节点同理,区别在于按键次数修改为2,即同一周期内只按下两次,即可触发,且主题配置为双击,周期时间配置为1200ms,冷却时间配置为800ms。用户可参照上一小节cycle mode(trigger)模式实验-单击名称节点配置讲解。
1.3.3 三击节点
* 该节点配置与单击名称节点同理,区别在于按键次数修改为3,即同一周期内只按下三次,即可触发,且主题配置为三击,周期时间配置为1600ms,冷却时间配置为400ms。用户可参照上一小节cycle mode(trigger)模式实验-单击名称节点配置讲解。
1.4fscript节点
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.5led节点
红灯节点
绿灯节点
1.6实验现象
依次对按键进行单击、双击和三击操作。
单击
红灯亮起
双击
绿灯亮起
三击
两灯都熄灭
2. continuous mode(trigger)模式实验
2.1实验简介
本实验将与cycle mode(trigger)模式实验所实现的功能相同,不同点在于使用的button_expand节点的操作模式为continuous mode(trigger)。
2.2流图设计
*同cycle mode(trigger)模式实验流图。
2.3button_expand节点
2.3.1 单击节点
continuous mode(trigger)模式:用户连续按下按键,且每次按键的时间小于设定时间间隔,将进行累加,直至超出设定间隔时,统计按键次数,若符合设定次数,该节点将触发输出;
动作间隔时间为500ms:表示用户前一次按下与后一次按下间隔时间,如果小于500ms,则进行计数。如果大于500ms时,则停止计数;
按键次数为1:当停止计数时,计数次数为1,则触发该节点;
- 主题为单击:表示节点触发时,输出给下一个节点的topic信息为"单击"。
2.3.2 双击节点
* 该节点配置与单击名称节点同理,区别在于按键次数修改为2,主题配置为双击。用户可参照上一小节continuous mode(trigger)模式实验-单击名称节点配置讲解。
2.3.3三击节点
* 该节点配置与单击名称节点同理,区别在于按键次数修改为3,主题配置为三击。用户可参照上一小节continuous mode(trigger)模式实验-单击名称节点配置讲解。
2.4其余节点配置* 同cycle mode(trigger)模式实验中其他节点配置。2.5实验现象
依次对按键进行单击、双击和三击操作。
led灯显示情况
同cycle mode(trigger)模式实验中led灯显示情况。3.press-releasemode(trigger)模式实验3.1实验简介本实验主要使用板子上所焊接好的led灯模块,该模块一共有两种灯颜色,分别为红灯与绿灯。本实验中,主要将红灯、绿灯模拟成两个独立的设备,通过一个button按键、button_expand按键实现长按2秒、长按3秒、长按1秒,从而控制红灯、绿灯的开关情况。3.2流图设计其中,显示名称为长按2秒、长按3秒、长按1秒的节点,均为button_expand类型节点,只是显示名称不同而已。同理,显示名称为长按开启红灯、长按开启绿灯、长按关闭所有设备的节点,均为fscript类型节点。显示名称为红灯、绿灯均为led类型节点。3.3 button_expand节点3.3.1 长按2s节点
操作模式为 press-release mode(trigger):用户按下按键后持续一段时间再松开,节点记录按键持续的时间,然后通过msg.payload(int,单位ms)传给后续的节点;
最短持续时间为1800ms:表示按下按键后,1800ms以前不松开;
最长持续时间为2500ms:表示按下按键后,2500ms以前必松开。
* 简而言之,从用户刚按下按键开始,如果按住的持续时间介于1800ms与2500ms之间,则该节点触发,输出主题"长按2s"。
3.3.2长按4s节点
* 该节点配置与长按2s名称节点同理,区别在于最短持续时间为3500ms,最长持续时间为4500ms,主题配置为长按4s。用户可参照上一小节press-release mode(trigger)模式实验-长按2s名称节点配置讲解。即从用户刚按下按键开始,如果按住的持续时间介于3500ms与4500ms之间,则该节点触发,输出主题"长按4s"。
3.3.3长按1s节点
* 该节点配置与长按2s名称节点同理,区别在于最短持续时间为500ms,最长持续时间为1200ms,主题配置为长按1s。用户可参照上一小节press-release mode(trigger)模式实验-长按2s名称节点配置讲解。即从用户刚按下按键开始,如果按住的持续时间介于500ms与1200ms之间,则该节点触发,输出主题"长按1s"。
3.4fscript节点
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-红灯亮起;
长按4s-绿灯亮起;
长按1s-两灯都熄灭
4.keep press mode(trigger)模式实验
4.1实验简介本实验主要使用板子上所焊接好的led灯模块,该模块一共有两种灯颜色,分别为红灯与绿灯。本实验中,主要将红灯、绿灯模拟成两个独立的设备,通过一个button按键、button_expand按键实现长按超过2秒、长按超过3秒、长按超过1秒,从而控制红灯、绿灯的开关情况。4.2流图设计
其中,显示名称为长按超过2秒、长按过时3秒、长按超过1秒的节点,均为button_expand类型节点,只是显示名称不同而已。同理,显示名称为长按开启红灯、长按开启绿灯、长按关闭所有设备的节点,均为fscript节点。显示名称为红灯、绿灯均为led类型节点。
4.3button_expand节点
4.3.1 长按超过1s节点
- 操作模式为 keep press mode(trigger):用户按下按键持续不放,若持续时间超过设定时间,该节点将触发输出;
- 超时时间为1000ms:从用户刚按下按键开始,如果按住的持续时间超过1000ms,则该节点触发,输出主题"长按1s"。
4.3.2长按超过2s节点
* 该节点配置与长按超过1s名称节点同理,区别在于超时时间为2000ms,主题配置为长按超过2s。用户可参照上一小节keep press mode(trigger)模式实验-长按超过1s名称节点配置讲解。即从用户刚按下按键开始,如果按住的持续时间超过2000ms,则该节点触发,输出主题"长按2s"。4.3.3 长按超过3s节点
* 该节点配置与长按超过3s名称节点同理,区别在于超时时间为3000ms,主题配置为长按超过3s。用户可参照上一小节keep press mode(trigger)模式实验-长按超过1s名称节点配置讲解。即从用户刚按下按键开始,如果按住的持续时间超过3000ms,则该节点触发,输出主题"长按3s"。
4.4fscript节点
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灯显示情况
长按超过1s时
红灯亮起
长按超过2s时
绿灯亮起
长按超过3s时
两灯熄灭
5. 同操作类型下trigger模式与statistical模式的区别
5.1主要区别
区别一
同操作类型下,两种模式所实现的功能均可相互代替,但是所实现的fscript节点数据处理有所不同。trigger模式主要用于触发它所连接的节点工作;statistical模式则可以输出统计的信息,如连续按下按键的次数,或者按键按下所持续的时间。
区别二
同操作类型下,一个statistical模式节点可以代替多个trigger模式节点所实现的功能(fscript节点处理方式也要更改),从而使我们的流图得到大幅度简化。
5.2模式实验
* 以continuous mode(trigger)模式实验为例,我们使用对应的(statistical)模式来实现,从而让大家进一步理解其之间的区别。
5.2.1 原trigger实验流图
5.2.2 现statistical实验流图
* statistical模式流图明显简化。5.3button_expand节点按下次数统计名称节点。
* 该实验下,只需要把操作模式切换到statistical模式即可。
5.4fscript节点
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击、长按、短按等各种组合情况的判断。为用户在一定程度上简化了流图的复杂度,节约了一定的硬件资源成本。
-
嵌入式
+关注
关注
5068文章
19021浏览量
303351
发布评论请先 登录
相关推荐
评论