第 02 章 -初步了解 arduino IDE 基本語法
上次更新日期 2022/05/xx
上一章我們知道如何處理 arduino 與 IDE 整合開發環境的連結,也大致知道怎麼將程式碼燒錄到 arduino 上頭! 接下來,我們就先來玩一玩 arduino 開發環境的基本程式吧!不過,在搞定基本程式碼的運作之前, 可能需要了解一下透過 USB 的連接埠訊息傳遞方式,這樣才有辦法將 arduino 的輸出『互動』的傳送到 IDE 環境中。
學習目標:
- 應用 USB serial connection 方式傳輸訊息
2.1: 了解 USB 序列埠連接訊息傳遞方式
前一章我們已經大致了解如何燒錄程式到 arduino 上面,現在,讓我們來學習一下在 arduino IDE 上面的基本語法。 基本上,IDE 的語法是從 C 修改來的,而之前學的 PHP 也是有點 C 的影子,因此,同學們可能會覺得, 底下的語法都會有點似曾相似的感覺喔!無論如何,讓我們來學習學習!
不過,跟一般 PC 不一樣,一般 PC 已經設計好,所有的輸出,大致上都是從顯示卡傳送到螢幕來顯示, arduino 只是簡簡單單的一塊板子,原本就沒有接顯示卡...所以,如果你要取得從 arduino 來的訊號, 就得要先了解怎麼讓這些訊息透過 USB 傳送/接收到 arduino IDE 開發軟體中!
- 使用 Serial 函數
arduino 與 IDE 開發軟體之間的傳輸,最簡單的方法當然就是透過那條原本的 USB 傳輸線!在 arduino 裡面, 可以透過已經撰寫好的 Serial (注意大小寫) 函數來處理!而一開始要處理的,就是 arduino 與 IDE 之間的傳輸速率, 或稱為鮑率 (baud rate)。想像一下,你在大隊接力的時候,最終接棒時,傳棒與接棒的人,速度應該要一致才好! 後面的人太快就會撞在一起,前面的人太快就會無法接棒!所以在接棒區,應該速度要一致!同樣的道理, 你的 arduino 硬體與 IDE 軟體之間傳輸的速率 (鮑率) 也要相同,否則傳輸就會出問題!
現在,接上你的 arduino 到 USB 上,然後打開 IDE 軟體之後,點選小按鈕列最右邊的『序列埠監控視窗』, 或者透過『工具』、『序列埠監控視窗』來打開也行!打開之後,觀察一下右下角的按鈕,你會看到類似如下的畫面:

如上圖所示,你可以額外勾選『Show timestamp』項目,然後觀察一下傳輸速率,預設大部分都是 9600 baud, 這個鮑率在文末的維基百科解釋,其實是每秒鐘傳輸的符號資料量,再次強調,arduino 與 IDE 軟體,這兩者要相同比較好。 因為 IDE 軟體預設使用 9600 baud,那我們等等在 arduino 『初始化序列埠傳輸速率』時,也指定 9600 這樣即可。 指定的方法為,在 setup() 函數內,使用 Serial.begin(9600); 就好了!
現在,請打開 IDE 開發軟體,新增一個新的專案,然後處理序列埠的傳輸速率,有點像這樣:
void setup() {
Serial.begin(9600);
}
void loop() {
}
那如何將資料透過 USB 序列埠回傳到 IDE 的監控視窗當中呢?可以透過幾個常見的函數:
- Serial.print(資料);
可以是字串("字串")、數值(38.38)、十進位轉為二進位的數值(38,BIN),這個資料之間是相連的,不會主動斷行, 斷行可以加 ("\n") 處理。至於字串資料,建議使用雙引號來處理! - Serial.println(資料);
與 Serial.print 類似,只是資料結尾會主動加上斷行字元而已 - Serial.write(資料);
可以直接輸出字串 ("字串"),如果填寫數值時,則會輸出該數值代表的 ASCII 符號!
根據上面的說明,看起來還是 Serial.print 比較常用!當然,要主動斷行,直接使用 Serial.println 也是可以的。 現在,讓我們撰寫第一支自己寫的程式,讓 arduino 每 2 秒鐘輸出一次 hello Arduino 吧!這樣寫即可:
void setup() { Serial.begin(9600); } void loop() { Serial.print('hello Arduino\n'); delay(2000); }
寫完之後,請先自己編譯看看,按下編譯之後,系統會先要求你要儲存這個專案,如果不想寫專案名稱, 直接按下 enter 也沒關係。不過為了未來好管理,給個適當的專案檔名會比較好。因此,鳥哥這裡選擇使用 code-hello 作為專案的檔名囉。之後系統會經過一陣子的編譯,最終在左下角告知編譯的結果,如下圖所示:

如果一切順利,現在你有 IDE 的軟體、COM4 的監控視窗、已經插上 USB 連結到主機的 arduino,現在, 請將這個程式碼上傳到 arduino 上吧!燒錄完畢之後,你的 arduino 就會立刻處理這隻程式碼,然後,就會看到類似如下的畫面:

現在,去看一下工作中的 arduino nano,你會發現到每 2 秒鐘,那個 TX 的 LED 燈光會小小的閃光一次! TX 指的是傳送,因此,有傳送資料時,這個燈號就會閃爍!可以看得到吧!有閃爍的燈光喔!有趣吧!
2.2: 變數的宣告與運算子
在 arduino 裡面,使用變數還是很不錯的!變數要使用之前,最好先宣告,而變數的類型有底下幾種:
資料型態 | 佔用位元數 | 資料範圍 |
boolean (布林值) | 8 | true(定義!=0), false(定義=0) |
char (字元) | 8 | -128~+128 |
unsigned char (不帶符號字元) | 8 | 0~255(沒有前導字元的符號) |
int (整數) | 16 | -32768~+32768 |
unsigned int (不帶符號整數) | 16 | 0~65535 |
long (長整數) | 32 | -2147483648~+2147483648 |
float (小數,浮點數) | 32 | -3.4028235E+38~+3.4028235E+38 |
double (倍精數) | 32 | -3.4028235E+38~+3.4028235E+38 |
- char 字元、字串變數的宣告
比較需要注意的是, char 為字元宣告,其實就是 ASCII 字元編碼的概念~不過,如果後面的值使用雙引號時, 該資料就會變成字串了!這個要特別注意!亦即是:
char str1 = 'a'; // 宣告為字元 a char str2[] = "arduino"; // 宣告為一個字串 arduino
根據 arduino 官網 (請參考文末資料) 的解釋,因為 char 預設僅花 8 位元 (bit),亦即一個位元組 (byte) 做儲存, 所以,當你的資料超過一個字元時,甚至是一個字就佔用 2~3 個位元組的中文字,那 char 當然無法儲存! 就會變成空白了!所以,你需要額外開放一個空的、可以隨意填入資料的字串時,就需要在變數後面使用中括號 [] 加入位元數。 例如 str[16] 代表使用 16 位元 (兩個位元組) 進行儲存資料。如果不填寫數值,那就代表 arduino 編譯器會主動根據資料, 幫你計算足夠的位元數了!
你可能不懂差異在哪裡!沒關係,我們來指定一下輸出,你就知道了。假設 str1 與 str2 都要定義 arduino 這個字串內容, 如果沒有指定額外的儲存容量,看看會發生什麼事。請開啟新的專案,然後將專案名稱取為 code-char,輸入底下的資料:
void setup() {
Serial.begin(9600);
}
void loop() {
char str1 = "arduino";
char str2[] = "arduino";
Serial.print("str1 = ");
Serial.println(str1);
Serial.print("str2 = ");
Serial.println(str2);
delay(2000);
}
儲存後,上傳燒錄到 arduino 裡面,運作的結果會有點像底下這樣:

很明顯的發現到,有額外提供儲存空間的 str2 才會正確顯示資料,預設使用一個位元組儲存資料的 str1 就會變成空白! 這就是差異!要注意!要注意!
- 常見宣告方式
底下稍微說明一下,常見的變數宣告方式:
int myvar = 100; // 宣告一個整數,且數值為 100 int myi, myj, myk; // 宣告三個整數變數,不給初始值 float myf1 = 3.14159; // 宣告一個浮點數,並給予數值 3.14159 char mystr[] = "hello arduino"; // 宣告一個未特定儲存量的字串變數,內容為 hello arduino
- 算術運算子
常見的運算子就是在數值之間進行加減乘除的符號,常見的符號有底下這些:
運算子 | 行為 | 範本 | 說明 |
+ | 加法 | x+y | 兩者相加 |
- | 減法 | x-y | 兩者相減 |
* | 乘法 | x*y | 兩者相乘 |
/ | 除法 | x/y | 兩者相除 |
% | 整數取餘數 | x%y | x除以y的餘數 |
++ | 遞增 | x++ | 相當於 x=x+1 |
-- | 遞減 | x-- | 相當於 x=x-1 |
我們讓 arduino 笨笨的去算一下球體的體積~設計變數,然後帶入公式: V=(4/3)*π*r3, 其中 V 為體積, r 為球體的半徑。先自己設計一下,然後在嘗試輸出看看。現在,請在開新的專案, 專案名稱取 code-ball 看看!
void setup() { Serial.begin(9600); } void loop() { float V; float r = 5.0; V = 4/3*3.14159*r*r*r; Serial.print("半徑為"); Serial.print(r); Serial.print("的球體的體積是: "); Serial.println(V); delay(2000); }

執行成果如上圖所示。你會發現到,預設的 float 浮點數的輸出,應該就是兩位數!問題是,如果你想要輸出較長的小數點位數, 就得要透過特殊的寫法!將上面的 V 的輸出改成這樣就好:
Serial.println(V, 4); // 代表浮點數後面接 4 個小數點位數!
然後重新編譯、上傳到 arduino 之後,輸出的體積就會是小數點後 4 位的輸出了!查詢看看呦!
- 變數型態轉換
常見的變數型態轉換如下:
int(var); char(var); long(var); float(var);
- 數值運算與輸出
數值運算相對簡單!我們先說說
2.x: 參考資料
- 關於鮑率 (baud rate) 的介紹:https://zh.wikipedia.org/zh-hant/波特率
- 關於字元、字串的用法:https://www.arduino.cc/reference/en/language/variables/data-types/string/
...