1.1 digital output

本章主要有三:Arduino digital output,Arduino多工作業,多粒LED控制

Arduino digital Output

效果

讓一粒LED閃爍,每隔一秒開關一次。

電路圖

螢幕快照 2015-03-31 下午12.44.10

程式碼

說明

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在同一時間之內執行多項任務,就需要用別的方法延時,下一節會詳談。

Arduino 多工作業

先聲明,我也不清楚這個是否應該叫做多工作業,如有你知道,請指正。

有些情況下,我們需要同一時間做多樣事情。

例如,要需要一粒LED閃爍,但又希望讀取另一個button的狀況;

又例如,Arduino小車撞到東西,觸發touch sensor,令其後褪,但後褪的同時又要確保小車車底的邊緣感應器edge sensor正常運作,令小車知道自己快要跌下平台,及時作出回應。

在這種情況下,我們不會用delay()來延時。

delay()的好處是簡單易用,一句指令就可以做到延時,對於簡單的程式和應用來說,已經夠用。但在大多數的情況下,尤其是千變萬化,需要同時處理多項任務的智能式機械人,明顯是不夠用。

效果

本節會繼續用上一節的電路,但會改變一下程式,令閃燈在閃動的期間,可以同時處理其他任務。

電路圖

螢幕快照 2015-03-31 下午12.44.10

程式碼

說明

boolean LED_state = LOW; : 設定一個叫LED_state的變數,格式是booleanboolean專門用來儲存邏輯變數,只有2個情況,不是HIGH就是LOW

unsigned long timer; : unsigned long是另一種類型的變數,最大容量很大。設定一個叫timer的變數用以記錄時間。

millis(): 傳回Arduino開機之後的時間,單位為毫秒。例如Arduino開機一秒,就傳回數值1000。由於時間不停累加,所以要用一個很大容量的變數去記錄。 用以計時的格式是這樣的,例如我要一個變數 i 每0.5秒累加1,那我的格式應該是:

又例如,一個變數 j 每1.5秒累加2,那就應是:

如此類推。

if (LED_state == LOW){LED_state = HIGH;} : 看清楚,if入面的比較是用兩個等號。 如果是 LED_state = HIGH; (一個等號)是輸入,只有一個等號,而且是右邊的HIGH輸入到左邊的LED_state,不能互換。

Arduino 多LED控制

本節主要介紹arrayfor loop的用法,用以簡化多粒LED(和其他I/O)的程式碼。

效果

讓一排LED走馬燈閃爍。

電路圖

螢幕快照 2015-04-02 下午06.26.16

程式碼

說明

byte LED[] = {13,12,11,10,9,8,7,6}; : LED[]是一個陣列,用以紀錄多個名稱相同但編號不同的變數。例如現在LED[0]即是13, LED[1]即是12, 如此類推,所以LED[7]就是6

: for是一個重覆執行的函數,在上面例子,i0開始執行,i++即是i=i+1,所以執行一次後,i就加1,直到i = 7,所以,07,共執行8次。每執行一次時就累加i

動動腦

  1. Arduino 多LED控制 陣列Arduino 多工作業millis()概念,試推動1粒RGB LED,紅燈每500ms閃一次,綠燈每750ms閃一次,藍燈每1s閃一次;負極串聯一粒1kohm電阻,其他接線請自行想像。

    rgbled

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