回顧基礎應用,我們曾用IS shield上的RGB按鈕控制相應的LED,按下亮,放手關。程式如下:
int buttonpin_R=2,buttonpin_G=3,buttonpin_B=6;
int LEDpin_R=11,LEDpin_G=9,LEDpin_B=10;
int State;
void ButtonControl(int button, int led){
State=digitalRead(button);
if (State == 1){
digitalWrite(led,0);} //因State的結果決定代表Output腳位的LED輸出0或1
else {
digitalWrite(led,1);}
}
void setup(){
pinMode(LEDpin_R,OUTPUT);
pinMode(LEDpin_G,OUTPUT);
pinMode(LEDpin_B,OUTPUT);
}
void loop(){
ButtonControl(buttonpin_R, LEDpin_R);
ButtonControl(buttonpin_G, LEDpin_G);
ButtonControl(buttonpin_B, LEDpin_B);
}
你對一些同類的變數,我們可以用Array陣列的型式來設定。Array的格式如下:
int myInts[6]; //設定一個包含6個變數的陣列
int myPins[] = {2, 4, 8, 3, 6}; //設定一個包含6個變數的陣列,第一個myPins[0]的值是2,第二個值myPins[0]是4...
int mySensVals[5] = {2, 4, -8, 3, 2};
char message[6] = "hello";
把上面的RGB按鈕控制例子改改,可以變成
int buttonpin[3]={2,3,6};
int LEDpin[3]={11,9,10};
int State;
void ButtonControl(int order){
State=digitalRead(buttonpin[order]);
if (State == 1){
digitalWrite(LEDpin[order],0);}
else {
digitalWrite(LEDpin[order],1);}
}
void setup(){
pinMode(LEDpin[0],OUTPUT);
pinMode(LEDpin[1],OUTPUT);
pinMode(LEDpin[2],OUTPUT);
}
void loop(){
ButtonControl(0); //對比本來要輸入2個參數,現在只輸入第幾組
ButtonControl(1);
ButtonControl(2);
}
對比原本的程式碼
int buttonpin_R=2,buttonpin_G=3,buttonpin_B=6;
int LEDpin_R=11,LEDpin_G=9,LEDpin_B=10;
int State;
void ButtonControl(int button, int led){
State=digitalRead(button);
if (State == 1){
digitalWrite(led,0);}
else {
digitalWrite(led,1);}
}
void setup(){
pinMode(LEDpin_R,OUTPUT);
pinMode(LEDpin_G,OUTPUT);
pinMode(LEDpin_B,OUTPUT);
}
void loop(){
ButtonControl(buttonpin_R, LEDpin_R);
ButtonControl(buttonpin_G, LEDpin_G);
ButtonControl(buttonpin_B, LEDpin_B);
}
在基礎應用,我們會用delay()來使某動作維持一段時間,可以這個方法在有個缺點就是等待的中途不會執行其他的任何指令。
比如我想設定IS shield上的RGB按鈕一旦按下後相應的LED就會亮5秒。用delay()的話程式如下:參考
int buttonpin[3]={2,3,6};
int LEDpin[3]={11,9,10};
int State;
void ButtonControl(int order){
State=digitalRead(buttonpin[order]);
if (State == 0){ //一旦按鈕按下維持亮燈5秒
digitalWrite(LEDpin[order],1);
delay(5000);
digitalWrite(LEDpin[order],0);
}
}
void setup(){
pinMode(LEDpin[0],OUTPUT);
pinMode(LEDpin[1],OUTPUT);
pinMode(LEDpin[2],OUTPUT);
}
void loop(){
ButtonControl(0);
ButtonControl(1);
ButtonControl(2);
}
你會發現一旦按下R按鈕控制R燈亮後的3秒間,按G按鈕和B按鈕都沒有任何反應。因為在執行delay(3000)的3秒間Arduino會接收不到其他的指令。作為替代,我們可以用millis()這個指令代替delay();millis()就像時鐘,由Arduino通電的一刻就開始紀錄過了多少時間(單位是毫秒ms)。參考
int buttonpin[3]={2,3,6};
int LEDpin[3]={11,9,10};
int State;
unsigned long Starttime[3]={0,0,0}; //記錄開始按下按鈕的時間
void ButtonControl(int order){
State=digitalRead(buttonpin[order]]);
if (State == 0){
Starttime[order]=millis(); //記錄開始按下按鈕的時間同時亮燈
digitalWrite(LEDpin[order],1);
}
if (millis()-Starttime[order] >= 3000){ //一旦現在時間-按下時間超過3秒就關燈
digitalWrite(LEDpin[order],0);
}
}
void setup(){
pinMode(LEDpin_R,OUTPUT);
pinMode(LEDpin_G,OUTPUT);
pinMode(LEDpin_B,OUTPUT);
}
void loop(){
ButtonControl(0);
ButtonControl(1);
ButtonControl(2);
}
以圖示比較delay()和millis()的分別如下: