本章主要有三:Arduino digital output,Arduino多工作業,多粒LED控制
讓一粒LED閃爍,每隔一秒開關一次。

x1byte LED = 13;2
3void setup() {4 pinMode(LED, OUTPUT); //set as output5
6}7
8void loop() {9 digitalWrite(LED, HIGH); //turn on the LED10 delay(1000); //wait for 1 sec11 digitalWrite(LED, LOW); //turn off the LED12 delay(1000); //wait for 1 sec13}byte LED = 13; : 設定一個變數,名稱叫LED,儲存格式為byte,Arduino的內存有限,可行的話盡可能減少沒必要的消耗,範圍用不著這樣大的就選擇最少的一個,常用變數列表牽參考這裡。
pinMode(LED, OUTPUT); : 用來設定腳位的模式(輸入/輸出)。
digitalWrite(LED, HIGH); : 用來設定腳位的輸出值,HIGH為5V,LOW為0V。
delay(1000); : 為延時函數,microsecond(毫秒=1/1000秒)為單位,delay(1000);就是延時一秒,但值得注意的是,用delay來延時的話,這一秒之內,Arduino不會作出任何回應。如果需要Arduino在同一時間之內執行多項任務,就需要用別的方法延時,下一節會詳談。
先聲明,我也不清楚這個是否應該叫做多工作業,如有你知道,請指正。
有些情況下,我們需要同一時間做多樣事情。
例如,要需要一粒LED閃爍,但又希望讀取另一個button的狀況;
又例如,Arduino小車撞到東西,觸發touch sensor,令其後褪,但後褪的同時又要確保小車車底的邊緣感應器edge sensor正常運作,令小車知道自己快要跌下平台,及時作出回應。
在這種情況下,我們不會用delay()來延時。
delay()的好處是簡單易用,一句指令就可以做到延時,對於簡單的程式和應用來說,已經夠用。但在大多數的情況下,尤其是千變萬化,需要同時處理多項任務的智能式機械人,明顯是不夠用。
本節會繼續用上一節的電路,但會改變一下程式,令閃燈在閃動的期間,可以同時處理其他任務。

xxxxxxxxxx211byte LED = 13; 2boolean LED_state = LOW; //紀錄現時LED的狀況,是開燈還是關燈3unsigned long timer;4
5void setup() {6 pinMode(LED, OUTPUT); 7}8
9void loop() {10 if(millis() - timer >= 1000){11 if (LED_state == LOW){12 LED_state = HIGH;13 }14 else {15 LED_state = LOW;16 }17 digitalWrite(LED, LED_state);18 19 timer = millis();20 }21}boolean LED_state = LOW; : 設定一個叫LED_state的變數,格式是boolean。boolean專門用來儲存邏輯變數,只有2個情況,不是HIGH就是LOW。
unsigned long timer; : unsigned long是另一種類型的變數,最大容量很大。設定一個叫timer的變數用以記錄時間。
millis(): 傳回Arduino開機之後的時間,單位為毫秒。例如Arduino開機一秒,就傳回數值1000。由於時間不停累加,所以要用一個很大容量的變數去記錄。
用以計時的格式是這樣的,例如我要一個變數 i 每0.5秒累加1,那我的格式應該是:
xxxxxxxxxx51if(millis() - timer >= 500){ 2 i = i+1;3 4 timer = millis();5}又例如,一個變數 j 每1.5秒累加2,那就應是:
xxxxxxxxxx51if(millis() - timer >= 1500){ 2 j = j+2;3 4 timer = millis();5}如此類推。
if (LED_state == LOW){LED_state = HIGH;} : 看清楚,if入面的比較是用兩個等號。
如果是 LED_state = HIGH; (一個等號)是輸入,只有一個等號,而且是右邊的HIGH輸入到左邊的LED_state,不能互換。
本節主要介紹array和for loop的用法,用以簡化多粒LED(和其他I/O)的程式碼。
讓一排LED走馬燈閃爍。

xxxxxxxxxx151byte LED[] = {13,12,11,10,9,8,7,6};2
3void setup(){4 for(byte i=0; i<=7; i++){5 pinMode(LED[i], OUTPUT);6 }7}8
9void loop(){10 for(int i=0; i<=7; i++){11 digitalWrite(LED[i], HIGH);12 delay(500);13 digitalWrite(LED[i], LOW);14 }15}byte LED[] = {13,12,11,10,9,8,7,6}; : LED[]是一個陣列,用以紀錄多個名稱相同但編號不同的變數。例如現在LED[0]即是13, LED[1]即是12, 如此類推,所以LED[7]就是6。
xxxxxxxxxx31for(byte i=0; i<=7; i++){2 pinMode(LED[i], OUTPUT);3 }: for是一個重覆執行的函數,在上面例子,i由0開始執行,i++即是i=i+1,所以執行一次後,i就加1,直到i = 7,所以,0至7,共執行8次。每執行一次時就累加i。
用Arduino 多LED控制 的陣列和Arduino 多工作業的millis()概念,試推動1粒RGB LED,紅燈每500ms閃一次,綠燈每750ms閃一次,藍燈每1s閃一次;負極串聯一粒1kohm電阻,其他接線請自行想像。

用Arduino 多工作業的多工概念,設定一個變數 i, 將 i 每一秒累加1, 當i>3, 亮紅燈, 當i>6, 只有綠燈亮, 當i>9, 只有藍燈亮。