arduino 官網 arduino uno

Arduino 物聯網應用 - 上課教材

動畫互動網頁程式設計 > 課程內容 > 第 02 章 -初步了解 arduino IDE 基本語法

第 02 章 -初步了解 arduino IDE 基本語法

上次更新日期 2022/05/xx

上一章我們知道如何處理 arduino 與 IDE 整合開發環境的連結,也大致知道怎麼將程式碼燒錄到 arduino 上頭! 接下來,我們就先來玩一玩 arduino 開發環境的基本程式吧!不過,在搞定基本程式碼的運作之前, 可能需要了解一下透過 USB 的連接埠訊息傳遞方式,這樣才有辦法將 arduino 的輸出『互動』的傳送到 IDE 環境中。

學習目標:

  1. 應用 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 作為專案的檔名囉。之後系統會經過一陣子的編譯,最終在左下角告知編譯的結果,如下圖所示:

第一支自己寫的 hello 程式

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

第一支自己寫的 hello 程式

現在,去看一下工作中的 arduino nano,你會發現到每 2 秒鐘,那個 TX 的 LED 燈光會小小的閃光一次! TX 指的是傳送,因此,有傳送資料時,這個燈號就會閃爍!可以看得到吧!有閃爍的燈光喔!有趣吧!

2.2: 變數的宣告與運算子

在 arduino 裡面,使用變數還是很不錯的!變數要使用之前,最好先宣告,而變數的類型有底下幾種:

資料型態佔用位元數資料範圍
boolean (布林值)8true(定義!=0), false(定義=0)
char (字元)8-128~+128
unsigned char (不帶符號字元)80~255(沒有前導字元的符號)
int (整數)16-32768~+32768
unsigned int (不帶符號整數)160~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%yx除以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: 參考資料

...