【ProtoPie Connect 教程】第4課 - Arduino第2節(jié):玩轉(zhuǎn)自編Sketch代碼


引言
在Arduino第1節(jié)課程中,我們展示了通過Blokdots把Arduino連接到Pie上實(shí)現(xiàn)互動(dòng)的過程。這個(gè)過程十分簡單,實(shí)現(xiàn)起來也挺快,但只是這樣連接起來使用的話,還是存在一些問題。比如說,按鈕按下的判斷反饋與實(shí)際情況相反了——沒按下按鈕時(shí)Blokdots報(bào)回1,而按鈕已經(jīng)按下時(shí)Blokdots卻報(bào)回0。此外,旋轉(zhuǎn)編碼器轉(zhuǎn)得太快時(shí),還可以觀察到一個(gè)被稱為“反彈”的現(xiàn)象:編碼器按照正向旋轉(zhuǎn)、計(jì)數(shù)應(yīng)該增大時(shí),實(shí)際卻得到了計(jì)數(shù)減小的結(jié)果;反之編碼器反向旋轉(zhuǎn)、計(jì)數(shù)應(yīng)該減小時(shí),實(shí)際卻得到了計(jì)數(shù)增大的結(jié)果。
我們可以通過反接編碼器的接地(GND)和供電(+)連接線來解決第一個(gè)問題,然后通過小心旋轉(zhuǎn)旋鈕、避免把旋轉(zhuǎn)編碼器轉(zhuǎn)得太快來解決第二個(gè)問題。但畢竟這治標(biāo)不治本,要從根本上解決這兩個(gè)(以及更多其它的)問題,可以通過自行編寫Arduino代碼來實(shí)現(xiàn)。
但是… 寫代碼令人望而生畏!
的確,寫代碼的工作令人望而生畏,尤其對(duì)于設(shè)計(jì)師來說更是如此。幸運(yùn)的是,網(wǎng)上有琳瑯滿目的Arduino代碼范例可供參考,在Arduino圈子里,我們把用于Arduino的成品代碼稱為Sketch代碼,實(shí)際上我寫的Sketch代碼很大程度上是基于[這篇文章](https://lastminuteengineers.com/rotary-encoder-arduino-tutorial/#:~:text=A rotary encoder is a,the knob is being rotated.)中學(xué)到的內(nèi)容來寫(chao)的。
其實(shí)不用太擔(dān)心!在這個(gè)教程中你并不需要寫任何代碼,這個(gè)教程的目的也并不是教你怎么寫代碼,直接用我已經(jīng)寫好的Sketch代碼就好了。這個(gè)教程的重點(diǎn)在于讓你了解如何用Arduino的Sketch代碼來與ProtoPie Connect一起工作,共同完成所需的設(shè)計(jì)。
學(xué)習(xí)內(nèi)容
在本教程中,我們會(huì)覆蓋以下知識(shí)點(diǎn):
與ProtoPie Connect進(jìn)行協(xié)同工作時(shí)需要留意的特定代碼細(xì)節(jié)
驗(yàn)證代碼正確性并上傳到Arduino開發(fā)板中
在ProtoPie Connect中配置并啟用Arduino插件
本教程約需15-20分鐘完成。
所需資源
按照上一課所教的方式,正確連接Arduino和兩個(gè)編碼器
下載并安裝Arduino軟件
下載并解壓以下Arduino Sketch代碼:
使用編碼器操作的空調(diào)遙控器.zip
啟動(dòng)Arduino軟件并將下載的Sketch代碼復(fù)制粘貼進(jìn)去:

我們開始吧!
如果以上步驟都完成了,那就跟隨以下視頻內(nèi)容進(jìn)行操作吧!

參考
在視頻中,我特意指出在編寫與ProtoPie Connect共同工作的Arduino Sketch代碼時(shí)需要記住的兩個(gè)要點(diǎn)?,F(xiàn)在我把這兩點(diǎn)單獨(dú)列在下面以便參考。
正確設(shè)置波特率
在Connect的Arduino插件中選擇的波特率(即串行連接上檢測(cè)數(shù)據(jù)更新的頻率)要與代碼中使用的波特率一致。

將消息發(fā)送到ProtoPie Connect
ProtoPie Connect不斷搜索寫入到串行連接上的消息,因此在代碼中使用Serial.print()
和Serial.println()
就可以將消息發(fā)回到Connect上。對(duì)于沒有值的消息,只需要按如下所示的方式將消息名稱輸出到串行連接上:
Serial.println(*<消息名>*)
,如:Serial.println("TEMP_UP");
對(duì)于帶有值的消息,需要用兩個(gè)豎線符號(hào)(|
)分隔消息名稱和消息值。
如:
Serial.println("SET_TEMP||21");
ProtoPie Connect會(huì)以同等模式識(shí)別和接收這條名為SET_TEMP
的消息,并得到21
這個(gè)消息值。
如果要在將變量作為消息值,在Arduino代碼中就不能將這兩者放在同一行里了。比如以下例子就不會(huì)起作用:
Serial.println("SET_TEMP||" + temp);
這種情況下需要用兩行代碼來實(shí)現(xiàn),先用Serial.print()
實(shí)現(xiàn)第一部分,再用Serial.println()
實(shí)現(xiàn)第二部分。例如:
Serial.print("SET_TEMP||");
Serial.println(temp);
這兩個(gè)語句的區(qū)別在于,Serial.print
只將指定內(nèi)容寫入到串行連接上,而Serial.println
除了寫入到串行連接上之外還在寫入內(nèi)容的末尾自動(dòng)添加了一個(gè)回車換行符以表示這是一行的結(jié)尾,或者說從ProtoPie Connect的視角來看,這才是一條已發(fā)送的完整消息。
ProtoPie Connect在對(duì)消息執(zhí)行操作之前會(huì)一直等待一個(gè)回車換行符輸出到串行接口上,基于這一點(diǎn),在編寫代碼時(shí)就可以將一條消息分為多個(gè)部分,分別用Serial.print()
語句來發(fā)出,發(fā)到最后一條消息時(shí)再使用Serial.println()
語句表示整個(gè)消息已經(jīng)完全發(fā)送到PotoPie Connect上。
例如:
Serial.print(message);
Serial.print(”||”);
Serial.println(value);