文章程式碼顯示

2017年10月22日 星期日

《入門》寫程式Arduino教學 - 08 : 變量命名 進一步簡潔



前一章我們介紹了"函數"的建立以及呼叫,目的是為了提升程式碼的可讀性以及版面的簡潔,這章我們則介紹 "變量命名" 來幫助我們進一步提升可讀性及變動性。

程式碼的部分沿用上一章,但在第一行多加了一行 int LED1 = 13; 我們將這行程式碼分為三個部份來解釋


1. int

int 代表資料為整數變量型態,這是最常使用的資料型態之一,僅可以儲存整數值(也就是1,2,3,4這種)

int 在 Arduino 內長度定義為 16 bits(若在 32bits 的處理器中, int 大多是定義為 32bits) ,16 bits 代表資料數值範圍為 -32768 到 +32767,超過此範圍的數值就不能使用 int 型態來進行儲存或表示。(此部分牽扯到計算機概論,16bits 代表由 16 位數的二進制所組成,暫不在此做過多的解釋)

而 char 亦為整數變量型態,其為 8bits 的整數變量型態。

而 flaot 為 32bits 的 浮點數變量型態,意指只有定義為 float 的變量可以儲存或表示小數點。

2. LED1

變量的名稱,可自行隨意命名。但如同函數的命名一樣不得與關鍵字強碰,以及不可以數字為開頭。

3. = 13;

= 代表賦值 意指將等號後方的值,賦值至前方的變量中。

這麼多似乎有點饒口,我們將整條程式碼再次寫出後一次念完。

int LED1 = 13;

口訣: 指定一個名為 LED1 的整數變量,並將 13 賦值給它
或更白話的說,指定一個名為 LED1 的整數變量,並將 13變成它。

最最白話: 整數 LED1 變成 13

這樣的寫法有什麼優點呢? 以上圖舉例來說原本 LED1 的地方都是填入 13 也就是下方的程式碼這樣

void setup(){
  pinMode(13,OUTPUT);  
}

void loop(){
  LED_ON();
  digitalWrite(13,LOW);
  delay(200);
}

void LED_ON(){
  digitalWrite(13,HIGH);
  delay(200);
}

假設我們要將 LED 在電路中的連接要更改至第 12 腳呢? 如果以原本的寫法就必須寫為

void setup(){
  pinMode(12,OUTPUT);  
}

void loop(){
  LED_ON();
  digitalWrite(12,LOW);
  delay(200);
}

void LED_ON(){
  digitalWrite(12,HIGH);
  delay(200);
}

那如果用這章教的變量命名方法呢? 我們就可以很快速的將 LED 腳位做變動,如下

int LED1 = 12;

void setup(){
  pinMode(LED1,OUTPUT);  
}

void loop(){
  LED_ON();
  digitalWrite(LED1,LOW);
  delay(200);
}

void LED_ON(){
  digitalWrite(LED1,HIGH);
  delay(200);
}

那如果我們要一次對三顆 LED 燈進行亮滅呢? 首先假設三顆 LED 燈分別接在電路上的 13、12及11腳,不用變量命名的方式則會寫成

void setup(){
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT); 
  pinMode(13,OUTPUT); 
}

void loop(){
  LED_ON();
  digitalWrite(11,LOW);
  digitalWrite(12,LOW);
  digitalWrite(13,LOW);
  delay(200);
}

void LED_ON(){
  digitalWrite(11,HIGH);
  digitalWrite(12,HIGH);
  digitalWrite(13,HIGH);
  delay(200);
}

用了這樣的方法後我們會發現,程式的可讀性會下降。例如過了一個禮拜後我們在打開這個程式,只看到了 11 、 12 及 13 腳位被設置成輸出模式,並且數位輸出 HIGH/LOW 高低電位交替。但我們並不知道 11 、 12 及 13 連接著什麼東西。倘若用變量命名的方式如

int LED1 = 13;
int LED2 = 12;
int LED2 = 11;

void setup(){
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT); 
  pinMode(LED3,OUTPUT); 
}

void loop(){
  led_on();
  digitalWrite(LED1,LOW);
  digitalWrite(LED2,LOW);
  digitalWrite(LED3,LOW);
  delay(200);
}

void led_on(){
  digitalWrite(LED1,HIGH);
  digitalWrite(LED2,HIGH);
  digitalWrite(LED3,HIGH);
  delay(200);
}

如此一來就算過了一段時間再回頭過來看這段程式碼,也曉得 11、12 及 13 腳位代表什麼意思,以及電路上是接了什麼東西。

PS:
除了用 int LED1 = 13; 來進行變量命名外,常見的還有使用 #define 的方式來進行。如

#define LED1 13

三個値之間以空格隔開,並不需要等號以及分號


↓↓↓ 連結到部落格方針與索引 ↓↓↓

Blog 使用方針與索引