Arduino 按鈕控制LED

arduino按鈕控制LED

控制LED相關文章:

材料

材料名稱蝦皮連結
1.【傑森創工】Arduino Uno R3 開發板 原廠晶片 *限時特惠 附USB線
2.【傑森創工】665mm 輕觸開關 4腳 微動按鈕 按鍵 Arduino 5個一組
3.【傑森創工】20個 1/4W 220Ω 電阻DIP 插板電阻 碳膜電阻,1%電阻 8051 Arduino
3.【傑森創工】20個 1/4W 10KΩ 電阻DIP 插板電阻 碳膜電阻,1%電阻 8051 Arduino
4.【傑森創工】5mm 超高亮度LED 白光 10個一組 可用於Arduino 單晶片 汽機車 無人機
5.【傑森創工】170孔 迷你 彩色 麵包板 六色 白黑藍黃綠紅 Arduino (顏色隨機出貨)

電路連接

按鈕介紹

按鈕要注意的是,圖中同個紅色框內的針腳是連通的。

當按鈕按下時,左右的針腳就會導通。

上拉電阻

按鈕及LED線路連接圖

上拉電阻接10kΩ,主要是讓電流降低,避免燒壞板子。

按鈕狀態Arduin針腳讀取電壓
按下5V
放開0V

arduino內建上拉電阻

內建上拉電阻,按鈕連接方式

還有另外一個方式,就是使用Arduino內建上拉電阻,就不用再從外部接電阻。

但要注意,程式碼中要更改pinMode(buttonPin,INPUT_PULLUP),告訴Arduino這個pin腳要啟用內建上拉電阻。

 pinMode(buttonPin, INPUT_PULLUP);

使用內建上拉電阻,ardunio針腳讀取到的電壓動作會變相反,按下時0V,放開時5V。

按鈕狀態Arduin針腳讀取電壓
按下0V
放開5V

延伸閱讀: 三用電錶使用教學,檢查電路必備工具!!

arduino程式

LED按下開,放開關

我們可以直接使用arduino IDE 提供的範例程式。

Button範例程式路徑

const int buttonPin = 8;     // 按鈕連接的pin
const int ledPin =  2;      // LED pin

int buttonState = 0;      

void setup() {
  pinMode(ledPin, OUTPUT); 
  pinMode(buttonPin, INPUT); 
}

void loop() {
  //讀取按鈕狀態
  buttonState = digitalRead(buttonPin);
 
  if (buttonState == HIGH) {
    //LED點亮
    digitalWrite(ledPin, HIGH);
  } else {
    //LED熄滅
    digitalWrite(ledPin, LOW);
  }
}

LED按一下開,再按一下關

這裡可以參考懶番茄工作室的旗標技巧教學


const int buttonPin = 8;     // 按鈕連接的pin
const int ledPin =  2;      // LED pin

int buttonState = 0;      
boolean LedState = false; //LED狀態
boolean buttonUp = true;  //按鈕放開狀態

void setup() {
  pinMode(ledPin, OUTPUT); 
  pinMode(buttonPin, INPUT); 
}

void loop() {
  //讀取按鈕狀態
  buttonState = digitalRead(buttonPin);

  if (buttonState == HIGH && buttonUp == true) {  
    LedState=!LedState;
    digitalWrite(ledPin, LedState);
    buttonUp = false;
  } 
  
  else if(buttonState != HIGH && buttonUp != true){    
      buttonUp = true;
  }
  
  delay(100); //設置延遲100ms,防機械彈跳
  
}

在〈Arduino 按鈕控制LED〉中有 20 則留言

  1. 匿名 回覆

    請問可以教一個按鈕控制開關led跑馬燈,程式和電路嗎?最近想破頭都還是想不出來

  2. 匿名 回覆

    那當有人經過感測器使LED燈亮起不滅,然後再一次有人經過LED燈就會熄滅,想請問怎麼寫程式?最近一直想不出來求解?

    • Derek Wu 文章作者回覆

      其實跟本篇的按鈕按一下開,在按一下關,蠻類似的。
      下列大概寫一下:

      readSensor是讀取感測器的狀態結果
      stillStand是來表示是否有人在感測器前面。

      void loop{

      readSensor=digitalRead(sensorPin);

      if( readSensor==HIGH&& stillStand==0){
      ledState=!ledState;
      stillStand=1;
      }
      else if(readSensor==LOW&&stillStand==1){
      stillStand=0;
      }

      digitalWrite(ledPin, ledState);

      }
      1.一開始是感測器感應到HIGH,且stillStand=0,所以就把燈改成反向(亮起)。
      2.因為人還沒走,所以感應器還是HIGH,可是stillStand=1,所以兩個if都不會執行。
      3.當人走時,感應器變成LOW,stillStand=1,於是執行第二個if,把stillStand又改回0,這時燈還是亮著的。
      4.直到下次感測器變HIGH,才會再執行第一個if,把燈改成反向(暗掉)。

      思考一下這個程式的邏輯,自己試著把程式完成看看吧~
      如果還有問題的話可以在留言發問或發email,加油~

      • 匿名 回覆

        作者,抱歉我研究一下還是不知道怎麼繼續寫下去,寫出完整的程式,可以提供完整的程式嗎?

      • 匿名 回覆

        研究了一下還是有點不懂,雖然看的懂程式,卻不會寫完整的,求解?

  3. 匿名 回覆

    我有稍微研究出來程式,但是我發現他的第一次是恆亮的但是測第二次的時候,還是跟第一次一樣恆亮,第三次才慢慢熄滅,想不出來為甚麼,給你看程式:

    #define PIR_PIN 2 //感測器腳位
    #define LED_PIN 13 //LED燈腳位

    bool pirState = false; //宣告一個布林 用於儲存感人體感測器的狀態

    int led = 13; //設定led pin, PWM pin有~3,~5,~6,~9,~10,~11
    int brightness = 0; //LED亮度變數
    int fadeAmount = 5; //亮度變化變數

    void setup() {
    pinMode(PIR_PIN,INPUT);//設定人體感測器腳位為輸入
    pinMode(LED_PIN,OUTPUT);//設定LED燈腳位為輸出
    //設定led pin為OUTPUT
    pinMode(led, OUTPUT);
    }
    void loop() {
    pirState = digitalRead(PIR_PIN); //取得感測器狀態
    if(pirState == true){ //如果感測器偵測到人體點亮LED燈
    digitalWrite(LED_PIN,HIGH);
    }
    //PWM輸出
    analogWrite(led, brightness);

    if(pirState == true){ //如果感測器偵測到人體點亮LED燈
    digitalWrite(LED_PIN,HIGH);
    //在每次回圈brightness都會累加fadeAmount
    brightness = brightness + fadeAmount;

    //到最亮或最暗時反轉
    if (brightness = 255) {
    fadeAmount = -fadeAmount;
    }

    • Derek Wu 文章作者回覆

      你的兩個if條件都一樣,這樣兩個都會執行。
      LED_PIN 13 、led = 13 這兩個led腳位也是一樣,但其中一個你用digitalWrite,另一個又用analogWrite,這裡也怪怪的。

      我不太知道你的感測器是用甚麼,但我先用超音波感測器,依照你上次敘述的條件來做一個完整的給你參考,你可以再email到這個信箱derek@crazymaker.com.tw,敘述你的問題~

  4. 匿名 回覆

    你好,我傳過去了,我的email叫:F*******0@gmail.com

  5. 匿名 回覆

    想請教一下,若增加為4顆LED和4顆開關分別控制,那是否有比較快的寫法,還是只能土法煉鋼。

    • Derek Wu 文章作者回覆

      我想到的是用陣列的寫法,搭配for迴圈,可以精簡土法煉鋼的程式

      const int buttonPin[4] = {8,9,10,11}; // 按鈕連接的pin
      const int ledPin[4] = {2,3,4,5}; // LED pin

      boolean buttonState[4] = {0,0,0,0};
      boolean LedState[4] = {1,1,1,1}; //LED狀態
      boolean buttonUp[4] = {1,1,1,1}; //按鈕放開狀態

      void setup() {
      for(int i=0;i<4;i++){
      pinMode(ledPin[i], OUTPUT);
      pinMode(buttonPin[i], INPUT_PULLUP);
      }

      }

      void loop() {
      //讀取按鈕狀態
      for(int i=0;i<4;i++){
      buttonState[i] = digitalRead(buttonPin[i]);
      if (buttonState[i] == HIGH && buttonUp[i] == true) {
      LedState[i]=!LedState[i];
      digitalWrite(ledPin[i], LedState[i]);
      buttonUp[i] = false;
      }

      else if(buttonState[i] != HIGH && buttonUp[i] != true){
      buttonUp[i] = true;
      }

      //delay(100); //設置延遲100ms,防機械彈跳
      }

      }

  6. XXX 回覆

    可以寫一下按一下一顆亮,一顆暗,按第二下一顆暗,一顆亮嗎

  7. 匿名 回覆

    可以請問
    如果一個開關控制兩個led
    按按鈕第一次一亮一暗
    第二次全暗
    第三次另一個亮一暗
    第四次全暗
    的程式要怎麼寫嗎

    • Derek Wu 文章作者回覆

      可以設定變數,例如:按鈕只要按下,變數就+1,直到=4時再回到0。
      再用switch case來選擇如何讓Led亮。

  8. 回覆

    可以問一下怎麼讓他按2下亮按一下暗,要不管什麼狀態按兩下點燈都會亮按一下點燈都會暗

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *