###### tags: `CPP` `Arduino` # 01 C++ 的基石:敘述 (statement) 與函式 (function) 在 Arduino IDE 中撰寫的程式是採用 **C++ 程式語言**, 以下我們以閃爍 LED 實驗的程式來說明 C++ 的基本語法: ```cpp= void setup() { // put your setup code here, to run once: pinMode(5, OUTPUT); } void loop() { // put your main code here, to run repeatedly: digitalWrite(5, LOW); delay(1000); digitalWrite(5, HIGH); delay(1000); } ``` 我們先來看看其中由 Arduino 提供功能的幾行程式: 1. 第 3 行是設定 **5** 號腳位的作用為**輸出 (OUTPUT)** 高低電位訊號。 :::info 不同板子內建的 LED 腳位不同, 請依照〈[00 前言](/1ay9LKa0T5GC2zzqBVxbAw)〉一文修改腳位。 ::: 3. 第 8 行是讓 **5** 號腳位輸出**低電位 (LOW)**, 由於 LOLIN D32 板子上的內部電路接法, 這會讓內建的 LED 亮起來。 :::info 不同板子的電路不一定一樣, 像是 Arduino Uno 的內建 LED 就是 13 號腳位輸出高電位時會亮, 請自行依照〈[00 前言](/1ay9LKa0T5GC2zzqBVxbAw)〉一文調整輸出的電位高低。 ::: 4. 第 9 行是讓程式暫停 1000 毫秒, 也就是 1 秒鐘。這會讓原本已經亮起的內建 LED 維持亮燈 1 秒鐘。 1. 第 10 行是讓 **5** 號腳位輸出**高電位**, 這會讓內建的 LED 熄掉。 2. 第 11 行和第 9 行一模一樣, 不過因為前一行已經熄掉 LED, 所以暫停的 1 秒鐘內 LED 就保持不亮。 這裡要特別說明幾個基本語法: 1. 除了有左右大括號 ('{' 與 '}') 的 1、4、6、12 行以外, 每一行都以**英文的分號 ';' 結尾**。這樣以分號結束的段落就稱為**敘述 (statement)**。 3. 以 "//" 開始的部分是**註解 (comment)**, 執行時會略過當成沒看到, 即使把註解刪除, 也不會影響執行結果。註解是**寫給人看**的, 方便說明程式的內容, 避免他人或是自己看不懂程式為什麼這樣寫。 5. [`pinMode`](https://www.arduino.cc/reference/en/language/functions/digital-io/pinmode/)、[`digitalWrite`](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/) 以及 [`delay`](https://www.arduino.cc/reference/en/language/functions/time/delay/) 是 Arduino 提供的功能, 稱為**函式 (functions)**, 不同名稱的函式具備不同的功能。 6. 使用函式的敘述稱為**呼叫 (call)**, 寫法是先寫出函式名稱, 再加上一對小括號, 小括號中依照函式的需要填入相關的資訊, 稱為**參數 (parameters)**, 像是 `pinMode` 就需要腳位的編號以及運作模式兩個參數, 在本例中就是 `5` 和 `OUTPUT`, 參數之間要用**英文逗號 (',')** 隔開。 7. `delay` 函式需要指定暫停的時間, 單位是毫秒, 也就是 1/1000 秒, 如果把時間改短如下, 閃爍的速度就會變得比較急促: ```cpp= void setup() { // put your setup code here, to run once: pinMode(5, OUTPUT); } void loop() { // put your main code here, to run repeatedly: digitalWrite(5, LOW); delay(200); digitalWrite(5, HIGH); delay(200); } ``` :::info 修改程式後請記得重新上傳, 程式才會生效, 控制板才會執行新的程式。 ::: 1. 敘述的開頭以及敘述內的括號、逗號前後可以自由地加入空格甚至斷行寫成多行, 讓程式的結構更清楚, 越容易分辨個別參數, 但並不影響程式執行結果。像是第 3 行也可以寫成這樣: ```cpp pinMode( 5, OUTPUT ); ``` C++ 會在看到英文分號才當成敘述的結尾。不過通常除非必要, 單一敘述都會寫成一行。 1. [OUTPUT](https://www.arduino.cc/reference/en/language/variables/constants/constants/)、[HIGH](https://www.arduino.cc/reference/en/language/variables/constants/constants/)、[LOW](https://www.arduino.cc/reference/en/language/variables/constants/constants/) 是 Arduino 預先定義好的名稱, 如同前面的說明, 這些不同的名稱各自代表特殊的意義。 :::info 你可以看到不同名稱的函式功用不同, 執行時所需的參數數量與參數的意義也不相同, 如果想要知道有那些函式可用、執行時又需要提供那些參數, 就必須查閱 [Arduino 的文件](https://www.arduino.cc/reference/en/)。 ::: 接下來, 我們會進一步瞭解 [C++ 的其他語法以及 Arduino 程式的結構](/JBjOJFf_TIqJUHsXNUoSaw)。