☛ 功能說明

利用一個按鍵開關控制四個 LED 移位方向。 每按一下按鍵開關,LED 的移位方向改變,若 LED 原來移動方向為右移,按一下按鍵開關時,改變為左移;若 LED 原來移動方向為左移,按一下按鍵開關時,改變為右移。

☛ 使用材料

Arduino UNO R3 開發板 × 1、電阻 220Ω × 4、紅色 LED × 4、按鍵開關 × 1。

☛ 電路圖及麵包板接線圖

☛ 程式碼

const int sw=2;                        //按鍵開關連線到數位接腳 2 。
const int led[]={10,11,12,13};         //LED 連接至數位接腳 10 ~ 13。
const int debounceDelay=20;            //按鍵開關穩定所需的時間。
int val;                               //按鍵開關狀態。
int i;                                 //索引值,指定第 i 個 LED。
int j=3;                               //索引值,指定第 j 個 LED。
int direct=0;

void setup()
{
     pinMode(sw,INPUT_PULLUP);         //設定數位接腳 2 為輸入模式,使用上拉電阻。
     for(i=0;i<4;i++)
         pinMode(led[i],OUTPUT);       //設定數位接腳 10~13 為輸出模式。
}

void loop()
{
     val=digitalRead(sw);              //讀取按鍵開關狀態。
     if(val==LOW)                      //按鍵被按下?
     {
        delay(debounceDelay);          //延遲 20ms,消除開關機械彈跳。
        while(digitalRead(sw)==LOW)    //按鍵已經放開?
              ;
        direct=!direct;                //改變移動方向。
     }

     for(i=0;i<4;i++)
         digitalWrite(led[i],LOW);     //設定四個 LED 狀態為 LOW。

     if(direct==0)                     //右移?
     {
        digitalWrite(led[j],HIGH);     //設定第 j 個 LED 狀態為 HIGH。
        delay(500);                    //延遲 0.5 秒。
        if(j==0)                       //已經右移至最右方?
           j=3;                        //重設 LED 位置在最左方。
        else
           j--;                        //右移。
     }
     else
     {
        digitalWrite(led[j],HIGH);     //設定第 j 個 LED 狀態為 HIGH。
        delay(500);                    //延遲 0.5 秒。
        if(j==3)                       //已經左移至最左方?
           j=0;                        //重設 LED 位置在最右方。
        else
           j++;                        //左移。
     }
}

 

☛ 練習

㈠ 設計 Arduino 程式,使用一個按鍵開關控制四個 LED 移位方向。 每按一下按鍵開關,LED 的移動方向改變,若 LED 原移動方向為閃爍右移,按一下按鍵開關時,改變為閃爍左移;若 LED 原移動方向為閃爍左移,按一下按鍵開關時,改變為閃爍右移。

const int sw=2;                        //按鍵開關連線到數位接腳 2 。
const int led[]={10,11,12,13};         //LED 連接至數位接腳 10 ~ 13。
const int debounceDelay=20;            //按鍵開關穩定所需的時間。
int val;                               //按鍵開關狀態。
int i;                                 //索引值,指定第 i 個 LED。
int j=3;                               //索引值,指定第 j 個 LED。
int direct=0;

void setup()
{
     pinMode(sw,INPUT_PULLUP);         //設定數位接腳 2 為輸入模式,使用上拉電阻。
     for(i=0;i<4;i++)
         pinMode(led[i],OUTPUT);       //設定數位接腳 10~13 為輸出模式。
}

void loop()
{
     val=digitalRead(sw);              //讀取按鍵開關狀態。
     if(val==LOW)                      //按鍵被按下?
     {
        delay(debounceDelay);          //延遲 20ms,消除開關機械彈跳。
        while(digitalRead(sw)==LOW)    //按鍵已經放開?
              ;
        direct=!direct;                //改變移動方向。
     }

     for(i=0;i<4;i++)
         digitalWrite(led[i],LOW);     //設定四個 LED 狀態為 LOW。

     if(direct==0)                     //右移?
     {
        flushing(led[j])               //設定第 j 個 LED 狀態為閃爍。
        if(j==0)                       //已經右移至最右方?
           j=3;                        //重設 LED 位置在最左方。
        else
           j--;                        //右移。
     }
     else
     {
        flushing(led[j]);              //設定第 j 個 LED 狀態為閃爍。
        if(j==3)                       //已經左移至最左方?
           j=0;                        //重設 LED 位置在最右方。
        else
           j++;                        //左移。
     }
}

void flushing(int flushLED)            //LED 閃爍副程式
{
     for(int i=0;i<3;i++)
     {
         digitalWrite(flushLED,HIGH);  //點亮 LED。
         delay(100);                   //延遲 0.1 秒
         digitalWrite(flushLED,LOW);   //關閉LED。
         delay(100);
     }
}

 

㈡ 設計 Arduino 程式,使用一個按鍵開關控制四個 LED 。 按一下按鍵開關,LED 單燈右移,再按一下按鍵開關,目前動作的 LED 閃爍。

const int sw=2;                        //按鍵開關連線到數位接腳 2 。
const int led[]={10,11,12,13};         //LED 連接至數位接腳 10 ~ 13。
const int debounceDelay=20;            //按鍵開關穩定所需的時間。
int val;                               //按鍵開關狀態。
int i;                                 //索引值,指定第 i 個 LED。
int j=3;                               //索引值,指定第 j 個 LED。
int direct=0;

void setup()
{
     pinMode(sw,INPUT_PULLUP);         //設定數位接腳 2 為輸入模式,使用上拉電阻。
     for(i=0;i<4;i++)
         pinMode(led[i],OUTPUT);       //設定數位接腳 10~13 為輸出模式。
}

void loop()
{
     val=digitalRead(sw);              //讀取按鍵開關狀態。
     if(val==LOW)                      //按鍵被按下?
     {
        delay(debounceDelay);          //延遲 20ms,消除開關機械彈跳。
        while(digitalRead(sw)==LOW)    //按鍵已經放開?
              ;
        direct=!direct;                //改變移動方向。
     }

     for(i=0;i<4;i++)
         digitalWrite(led[i],LOW);     //設定四個 LED 狀態為 LOW。

     if(direct==0)                     //右移?
     {
        digitalWrite(led[j],HIGH);     //設定第 j 個 LED 狀態為 HIGH。
        delay(500);                    //延遲 0.5 秒。
        if(j==0)                       //已經右移至最右方?
           j=3;                        //重設 LED 位置在最左方。
        else
           j--;                        //右移。
     }
     else
     {
        flushing(led[j]);              //設定第 j 個 LED 狀態為閃爍。
     }
}

void flushing(int flushLED)            //LED 閃爍副程式
{
     for(int i=0;i<3;i++)
     {
         digitalWrite(flushLED,HIGH);  //點亮 LED。
         delay(100);                   //延遲 0.1 秒
         digitalWrite(flushLED,LOW);   //關閉LED。
         delay(100);
     }
}