本章主要有三:Arduino digital output,Arduino多工作業,多粒LED控制
讓一粒LED閃爍,每隔一秒開關一次。
x1byte LED = 13;
2
3void setup() {
4 pinMode(LED, OUTPUT); //set as output
5
6}
7
8void loop() {
9 digitalWrite(LED, HIGH); //turn on the LED
10 delay(1000); //wait for 1 sec
11 digitalWrite(LED, LOW); //turn off the LED
12 delay(1000); //wait for 1 sec
13}
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()
的好處是簡單易用,一句指令就可以做到延時,對於簡單的程式和應用來說,已經夠用。但在大多數的情況下,尤其是千變萬化,需要同時處理多項任務的智能式機械人,明顯是不夠用。
本節會繼續用上一節的電路,但會改變一下程式,令閃燈在閃動的期間,可以同時處理其他任務。
xxxxxxxxxx
211byte 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
,那我的格式應該是:
xxxxxxxxxx
51if(millis() - timer >= 500){
2 i = i+1;
3
4 timer = millis();
5}
又例如,一個變數 j
每1.5秒累加2
,那就應是:
xxxxxxxxxx
51if(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走馬燈閃爍。
xxxxxxxxxx
151byte 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
。
xxxxxxxxxx
31for(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
, 只有藍燈亮。