☛ 功能說明

利用一個按鍵開關控制一個 LED 亮與暗。 每按一下按鍵開關,LED 狀態將會改變。 若 LED 原來狀態為暗,按一下按鍵開關時,LED 亮,若 LED 原來狀態為亮,按一下按鍵開關時,LED 暗。

按鍵開關有兩種接線方式,分別如下:

⑴ 正脈波產生電路

按下開關時,輸出電壓 Vo 為 +5V,放開開關時,輸出電壓為 0V。

⑵ 負脈波產生電路

按下開關時,輸出電壓 Vo 為 0V,放開開關時,輸出電壓為 +5V。

使用按鍵開關時,理想上是每按一下開關,輸出會產生一個脈波輸出,實際上開關會有機械彈跳的問題存在。 一般機械彈跳的時間約在 10ms ~ 20ms 之間,可以使用延遲時間的方法來解決機械彈跳的問題,來避免錯誤動作產生。

☛ 使用材料

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

☛ 電路圖及麵包板接線圖

☛ 程式碼

const int sw=2;                        //按鍵開關連接至數位接腳第 2 腳。
const int led=13;                      //LED 連接至數位接腳第 13 腳。
const int debounceDelay=20;            //按鍵開關穩定所需的時間。
int ledStatus=LOW;                     //LED 初始狀態為 LOW。
int val;                               //按鍵開關狀態。

void setup()
{
     pinMode(sw,INPUT_PULLUP);        //設定數位第 2 腳為輸入模式 ( 使用內部上拉電阻 )。
     pinMode(led,OUTPUT);             //設定數位第 13 腳為輸出模式。
}

void loop()
{
     val=digitalRead(sw);              //讀取按鍵狀態。
     if(val==LOW)                      //按鍵開關被按下?
     {
        delay(debounceDelay);          //消除按鍵開關的不穩定狀態 (機械彈跳 )。
        while(digitalRead(sw)==LOW)    //按鍵開關已放開?
              ;                        //等待放開按鍵開關。
        ledStatus=!ledStatus;          //改變LED狀態。
        digitalWrite(led,ledStatus);   //設定 LED 狀態。
     }
}

 

 ☛ 練習

㈠ 設計 Arduino 程式,使用一個按鍵開關控制一個 LED 閃爍與暗。 每按一下開關,LED 狀態將會改變。 若 LED 原來狀態為暗,按一下開關時,LED 閃爍,若 LED 原來狀態為閃爍,按一下開關時,LED 為暗。

const int sw=2;                        //按鍵開關連接至數位接腳第 2 腳。
const int led=13;                      //LED 連接至數位接腳第 13 腳。
const int debounceDelay=20;            //按鍵開關穩定所需的時間。
int ledStatus=LOW;                     //LED 初始狀態為 LOW。
int val;                               //按鍵開關狀態。

void setup()
{
     pinMode(sw,INPUT_PULLUP);        //設定數位第 2 腳為輸入模式 ( 使用內部上拉電阻 )。
     pinMode(led,OUTPUT);             //設定數位第 13 腳為輸出模式。
}

void loop()
{
     val=digitalRead(sw);              //讀取按鍵狀態。
     if(val==LOW)                      //按鍵開關被按下?
     {
        delay(debounceDelay);          //消除按鍵開關的不穩定狀態 (機械彈跳 )。
        while(digitalRead(sw)==LOW)    //按鍵開關已放開?
              ;                        //等待放開按鍵開關。
        ledStatus=!ledStatus;          //改變LED狀態。
     }
     if(ledStatus==LOW)                //判斷 LED 狀態為關閉? 還是閃爍?
        digitalWrite(led,ledStatus);   //設定 LED 關閉狀態。
     else
        flushing();                    //設定 LED 閃爍狀態
}

void flushing()                        //LED 閃爍副程式
{
     digitalWrite(led,HIGH);           //點亮 LED。
     delay(500);                       //延遲 0.5 秒
     digitalWrite(led,LOW);            //關閉LED。
     delay(500);
}

 

㈡ 設計 Arduino 程式,使用一個按鍵開關控制二個 LED 。 按一下開關時,LED 重複快閃 3 次再將 LED 關閉 1 秒,再按一下按鍵開關時,LED 暗。

const int sw=2;                        //按鍵開關連接至數位接腳第 2 腳。
const int led1=13;                     //LED1 連接至數位接腳第 13 腳。
const int led2=12;                     //LED2 連接至數位接腳第 12 腳。
const int debounceDelay=20;            //按鍵開關穩定所需的時間。
int ledStatus=LOW;                     //LED 初始狀態為 LOW。
int val;                               //按鍵開關狀態。

void setup()
{
     pinMode(sw,INPUT_PULLUP);        //設定數位第 2 腳為輸入模式 ( 使用內部上拉電阻 )。
     pinMode(led1,OUTPUT);            //設定數位第 13 腳為輸出模式。
     pinMode(led2,OUTPUT);            //設定數位第 12 腳為輸出模式。
}

void loop()
{
     val=digitalRead(sw);              //讀取按鍵狀態。
     if(val==LOW)                      //按鍵開關被按下?
     {
        delay(debounceDelay);          //消除按鍵開關的不穩定狀態 (機械彈跳 )。
        while(digitalRead(sw)==LOW)    //按鍵開關已放開?
              ;                        //等待放開按鍵開關。
        ledStatus=!ledStatus;          //改變LED狀態。
     }
     if(ledStatus==LOW)                //判斷 LED 狀態為關閉? 還是閃爍?
     {
        digitalWrite(led1,ledStatus);  //設定 LED1 關閉狀態。
        digitalWrite(led2,ledStatus);  //設定 LED2 關閉狀態。
     }
     else
        flushing();                    //設定 LED 閃爍狀態
}

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