按鍵是嵌入式產品常用的人機交互方式。為了更好的結構設計、更低的制造成本,對按鍵功能會有更高的要求,常見有單擊、雙擊和長按等需求。本文將基于 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.3button_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.3button_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擊、長按、短按等各種組合情況的判斷。為用戶在一定程度上簡化了流圖的復雜度,節約了一定的硬件資源成本。
審核編輯:湯梓紅
-
嵌入式
+關注
關注
5082文章
19104瀏覽量
304809 -
按鍵
+關注
關注
4文章
223瀏覽量
57595 -
ESDA
+關注
關注
0文章
28瀏覽量
7505 -
Button
+關注
關注
0文章
16瀏覽量
7569
原文標題:【產品應用】基于EsDA MPC-ZC1快速實現 — 按鍵高級應用
文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論