Arduino IDE 內建的超強大人機互動工具:序列埠監控視窗 是您交換資料、提示訊息與排除錯誤的必備良藥!
在按鈕特輯的系列影片中,我們已經掌握了硬體與軟體的搭配使用技巧。今天,我們要介紹一個內建在 Arduino IDE 裡面,功能超強大的人機互動工具!首先,我們要打開 Arduino IDE。在 IDE 視窗的右上角,有一個叫做「序列埠監控視窗」,或稱作「Serial Monitor」的按鈕。
請先確定 Arduino 已經連接在電腦上面,而且也做好了板子與序列埠的設定,你才可以點選這顆按鈕,開啟一個很酷炫的白色視窗。如果忘記接上 Arduino 就按下按鈕,是會出現錯誤訊息的唷!
這個視窗,其實非常類似一般的即時通訊軟體,你可以在這個白色區域,看到 Arduino 留言給你的訊息,當然,你也可以在上面的文字方塊輸入訊息,傳送給 Arduino。
小專案:印出單行字串
這樣說起來,我能用這個視窗跟 Arduino 聊天囉?事實上,Arduino 所有的對話內容,包含它收到什麼訊息,然後用什麼句子來回應你,都是要先在程式當中把他們設定好才行。我們先來看一個最簡單的例子:今天我希望在 Arduino 剛啟動時,就在監控視窗上顯示一行打招呼的句子。這個程式要怎麼設計呢?
首先在 setup() 當中,我們要使用指令 Serial.begin(115200); 來開啟 Arduino 與電腦之間的溝通模式,這個 S 記得使用大寫。括號中的 115200 是什麼東西呢?它有個專有名詞,叫做「Baud rate 鮑率」,是一種資料傳輸的速率單位。簡單來說,設定 115200,就代表 Arduino 與電腦之間,每一秒鐘能傳輸 11 萬 5 千 2 百個位元的資料。
接下來,我們要使用指令 Serial.println(),把要顯示在監控視窗裡的文字,透過括號中的兩個雙引號包圍起來。這個雙引號的用途,就是告訴 Arduino 這段被包圍的句子,是給「人類」看的句子,也就是所謂的「字串(String)」,而不是程式碼的一部份。
然後就完成了耶!現在我們把程式上傳到 Arduino 當中,然後開啟監控視窗。什麼?怎麼會是一串亂碼呢?
別緊張,這是因為「鮑率設定」不一致造成的結果。你可以把 Arduino 跟電腦,想像成兩個在說話的人。Arduino 用每一秒 11 萬 5 千 2 百個字的速度在說話,但電腦每一秒鐘卻只聽得到 9 千 6 百個字,它當然只能收到一大堆沒有意義的內容囉!
要解決這個問題,你只需要把監控視窗右下角的鮑率,調整成跟 Serial.begin() 指令中一模一樣的 115200,然後在左邊的選單點選「沒有行結尾」,防止資料傳送時自動加上換行符號,Arduino 留言的訊息就能正確地顯示出來了。
小專案:印出多行字串
好了,那如果我想讓程式在印出第一行句子以後,等待一秒鐘,再印出第二個句子,我該怎麼修改程式呢?這時候,我們只需要在第一個 println() 指令下面,加上一個 1000 毫秒的 Delay,然後印出第二個句子就行了。
小專案:印出字串與數字
當然,除了基本的字串顯示,我們還可以搭配之前學到的宣告技巧 ,讓監控視窗顯示某一個我們預先儲存的數字。比如說,我在程式的最一開始先宣告一個整數型態的 universe,並設定為 42。接下來,我先印出一段文字:The answer to life, the universe, and everything,然後印出 universe 所儲存的整數。這樣一來,我們就能直接在監控視窗上,看到當初宣告的 universe,儲存的是 42 這個數字。
這邊請特別注意!因為我要印出的,是 universe 儲存的數字,所以在 Serial.println() 的括號當中,不可以使用雙引號把 universe 包起來,不然監控視窗裡印出來的東西,就會是 universe 這個英文單字,而不是 42 這個數字囉!
關於排版方面,我們還可以美化一下:如果你希望印出來的文字不要換行,你可以把 Serial.println(),替換成 Serial.print() 指令。最後,我們再印出一個句號。這樣看起來好多了!
小專案:攝氏轉華氏溫度
暸解怎麼把訊息印在監控視窗裡之後,緊接著就要來學習如何在監控視窗裡輸入文字,讓 Arduino 跟你進行互動。比如說,我想製作一個溫度轉換器,當我輸入了攝氏溫度以後,Arduino 就會幫我運算並回傳對應的華氏溫度。
要完成這個小專案,我們會用到一個新的指令,叫做 Serial.available()。這個指令通常會跟 if 判斷式 搭配使用,它的功能就是檢查 Arduino 有沒有收到從序列埠監控視窗傳送進來的訊息;換句話說,這個放在 loop() 當中的 if 判斷式,會不斷地檢查序列埠的狀態,一旦我們在監控視窗裡輸入文字並按下傳送,這個 if 判斷式就會成立,然後執行大括號裡的工作。
那大括號裡要做什麼事呢?首先,我們要宣告一個整數叫作 num;然後使用 Serial.parseInt(); 指令,把序列埠輸入的文字存進 num 當中。接下來,使用 Serial.print() 輸出一行說明文字:“The temperature is:”,然後印出溫度轉換的結果。
要把攝氏溫度轉換為華氏溫度,我們必須把輸入的數字 num 乘上 9、除以 5,再加上 32。在大多數的程式語言當中,數學運算符號都有先乘除、後加減,由左而右的特性,所以這行運算式會先進行乘法跟除法的運算,然後才是加法的運算。最後,我們再印出溫度的單位「°F」,整個專案就完成了。
小專案:輸入字元控制 LED 亮滅
除了進行純文字方面的互動之外,我們也可以透過自訂的指令,來進行硬體或是電路的控制。例如:當我傳送大寫的 O 時,Arduino 上面的 LED 就會亮起來;當我傳送大寫的 C,LED 就會熄滅。如果我傳送了大寫 O 或 C 以外的字母,Arduino 就會在監控視窗印出 Invalid character(字元無效)的提示。
這個專案不一樣的地方,在於我輸入的資料不是數字,而是代表字母或符號的「字元」。所以,在 loop() 當中放上 if(Serial.available()) 判斷式以後,我們要宣告一個用來儲存「字元」,也就是 char 的變數,叫作 ch,然後使用 Serial.read() 指令,讀取從序列埠輸入的英文字元。
拿到輸入的字元以後,我們就可以使用 if-else 判斷式進行檢查。而剛剛我們有提到,對於「字串」,我們要使用雙引號把它們夾起來;那對單一個字母或字元來說呢?這時候,我們就要使用單引號,把這個字母定義為「字元」才可以使用 if-else 進行比較。
如果輸入的字元是大寫的 O,我就將第 13 腳設定為高電位,點亮 LED;如果輸入的字元是大寫的 C,我就將第 13 腳設定為低電位,把 LED 熄滅。如果輸入的字母不是大寫的 O,也不是大寫的 C,我就在 else 的大括號當中印出 Invalid character 這個句子。當然,在 setup() 當中,千萬別忘記將接腳 13 設定為輸出模式,並預設為低電位唷!
ONE LAST THING
今天一口氣介紹了四個小專案,把最常見的 Serial monitor 使用技巧,通通送給你啦!在未來的實作課程裡,我們也將大量使用 Serial monitor 來作為資料交換、訊息提示、甚至是錯誤排除的用途,請一定要實作並熟悉今天的課程內容喔!
這一集的 Arduino SpeedUp 在這裡告一個段落!我們下一堂課程再與各位見面,掰掰!