相關推薦
您可能對下面課程感興趣
Arduino視頻教程基礎篇

75小節(jié)已有138527人學過

數(shù)字I/O的使用按鍵控制LED
發(fā)布時間:2022-03-10 09:57 [ 我要自學網原創(chuàng) ] 發(fā)布人: 小劉2175 閱讀: 2460
我們要結合數(shù)字輸入輸出功能,制作一個可控制的LED。實現(xiàn)按住按鍵時,點亮LED,放開按鍵后,熄滅LED的效果。
實驗中我們將用到按鍵或者按鍵模塊,常見的有2腳按鍵和4腳按鍵,其內部如圖2-25所示。當按下按鍵時,就會接通按鍵兩端,放開時,兩端會再次斷開。


所需材料
Arduino、面包板、LED一個、按鍵一個、220Ω電阻一個、10KΩ電阻一個

連接示意圖


原理圖


如上圖所示,我們使用了兩個電阻。LED的一端,我們使用了220Ω的電阻,按鍵一端,我們使用了10K的電阻,兩個電阻的作用分別如下:

------------------------------------------------------------
限流電阻
一般LED的最大能承受的電流為25mA,如若直接將LED連接到電路中,當其點亮時,如果電流過大,很容易燒毀。如圖2-24所示,我們在LED一端串聯(lián)了一個電阻R2,這樣做可以控制流過LED的電流,防止損壞LED。這個電阻我們稱之為限流電阻。

下拉電阻
在Arduino的2號引腳到GND之前,連接了一個阻值10K的電阻。如果沒有該電阻,當未按下按鍵時,2號引腳會一直處于懸空 狀態(tài),此時使用digitalRead() 讀取2號引腳狀態(tài),會得到一個不穩(wěn)定的值(可能是高,也可能是低)。添加這個R1電阻到地就是為了穩(wěn)定引腳的電平,當引腳懸空時,就會識別為低電平。而這種將某節(jié)點通過電阻接地的做法,叫做下拉,這個電阻叫做下拉電阻。
------------------------------------------------------------

實現(xiàn)方法分析
當未按下按鍵時,2號引腳檢測到的輸入電壓為低電平;當按下按鍵時,會導通2號引腳和VCC,此時2號引腳檢測到的輸入電壓為高電平。通過判斷按鍵是否被按下,來控制LED的亮滅。

示例程序
你可以在 Arduino IDE菜單>文件>示例>02.Digital>Button 中找到以下程序:

  1. /*
  2.   Button

  3. 通過2號引腳連接的按鍵,控制13號引腳連接的LED

  4. 備注:大多數(shù)Arduino的13號引腳上都連接了名為L的LED.
  5. created 2005
  6. by DojoDave <<a href="http://www.0j0.org" target="_blank">http://www.0j0.org</a>>
  7. modified 30 Aug 2011
  8. by Tom Igoe

  9. This example code is in the public domain.

  10. <a href="http://www.arduino.cc/en/Tutorial/Button" target="_blank">http://www.arduino.cc/en/Tutorial/Button</a>
  11. */

  12. // 設置各引腳別名
  13. const int buttonPin = 2;     // 連接按鍵的引腳
  14. const int ledPin =  13;      // 連接LED的引腳

  15. // 變量定義
  16. int buttonState = 0;         // 存儲按鍵狀態(tài)的變量

  17. void setup() {
  18.   // 初始化LED引腳為輸出狀態(tài)
  19.   pinMode(ledPin, OUTPUT);      
  20.   // 初始化按鍵引腳為輸入狀態(tài)
  21.   pinMode(buttonPin, INPUT);     
  22. }

  23. void loop(){
  24.   // 讀取按鍵狀態(tài)并存儲在變量中
  25.   buttonState = digitalRead(buttonPin);

  26.   // 檢查按鍵是否被按下
  27.   // 如果按鍵按下,那buttonState應該為高電平
  28.   if (buttonState == HIGH) {     
  29.     // 點亮LED
  30.     digitalWrite(ledPin, HIGH);  
  31.   }
  32.   else {
  33.     // 熄滅LED
  34.     digitalWrite(ledPin, LOW);
  35.   }
  36. }
復制代碼


編譯并上傳該程序后,按下按鍵,你會觀察到LED會被點亮,松開按鍵,LED又會熄滅。


項目進階
對于在以上項目,我們還可以做如下修改。

連接示意圖


如上,我們去掉了原來電路中2號引腳連接的下拉電阻,并將按鍵的一端連接到GND;

原理圖


同時,我們需要將原程序setup() 部分中的
  1. pinMode(buttonPin,INPUT);
復制代碼

修改為
  1. pinMode(buttonPin,INPUT_PULLUP);
復制代碼


這樣能使能該引腳上的內部上拉電阻,等效于在該引腳到VCC之間連接一個外部上拉電阻。

-----------------------------------------------------
上拉電阻
同下拉電阻一樣,可以穩(wěn)定I/O口電平,不同的是電阻連接到VCC,將引腳穩(wěn)定在高電位。這種電阻叫做上拉電阻。
-----------------------------------------------------

這里使用的是內部上拉電阻,也可以使用外部上拉電阻替代。穩(wěn)定懸空引腳的電平所用電阻應該選擇合適的阻值,例如10K。

示例程序
修改后的程序代碼如下:

  1. /*
  2. 按鍵控制LED - 1
  3. <a href="http://www.arduino.cn/" target="_blank">http://www.arduino.cn/</a>
  4. */

  5. int buttonPin = 2;
  6. int ledPin = 13;
  7. int buttonState = 0;

  8. void setup()
  9. {
  10.   // 初始化I/O口
  11.   pinMode(buttonPin,INPUT_PULLUP);
  12.   pinMode(ledPin,OUTPUT);
  13. }

  14. void loop()
  15. {
  16.   buttonState = digitalRead(buttonPin);
  17.   // 按住按鍵時,點亮LED;放開按鍵后,熄滅LED。
  18.   if(buttonState==HIGH)
  19.   {
  20.     digitalWrite(ledPin,LOW);
  21.   }
  22.   else
  23.   {
  24.     digitalWrite(ledPin,HIGH);
  25.   }
  26. }
復制代碼



接下來我們要對控制程序做一個升級,完成一個新的控制效果。按一下按鍵,點亮LED;再按一下按鍵,熄滅LED。

程序代碼如下:

  1. /*
  2. 按鍵控制LED - 2
  3. <a href="http://www.arduino.cn/" target="_blank">http://www.arduino.cn/</a>
  4. */

  5. int buttonPin = 2;
  6. int ledPin = 13;
  7. boolean ledState=false;  // 記錄LED狀態(tài)
  8. boolean buttonState=true;  // 記錄按鍵狀態(tài)

  9. void setup()
  10. {
  11. // 初始化I/O口
  12.   pinMode(buttonPin, INPUT_PULLUP);
  13.   pinMode(ledPin,OUTPUT);
  14. }

  15. void loop()
  16. {
  17. // 等待按鍵按下
  18. while(digitalRead(buttonPin)==HIGH){}

  19.   // 當按鍵按下時,點亮或熄滅LED
  20.   if(ledState==true)
  21.   {
  22.     digitalWrite(ledPin,LOW);
  23.     ledState=!ledState;
  24.   }
  25.   else
  26.   {
  27.     digitalWrite(ledPin,HIGH);
  28.     ledState=!ledState;
  29.   }
  30.   delay(500);
  31. }
復制代碼



編譯并上傳該程序后,每按一下按鍵,LED狀態(tài)都會改變。以上程序中,使用了
  1. while( digitalRead(buttonPin)==HIGH ) { }
復制代碼


因為在初始化時,我們已經將buttonPin引腳設為了輸入上拉狀態(tài)。如果沒有按下按鍵,使用digitalRead(buttonPin) 讀出的值始終為高電平,這個循環(huán)也將一直運行;當你按下按鍵后,digitalRead(buttonPin) 讀出了低電平,while循環(huán)的判斷條件為假,程序會退出這個循環(huán),并開始運行此后的語句。這樣我們就實現(xiàn)了一個等待用戶按下按鍵的效果。

程序末尾有一個delay(500) 的延時,它在這里是極其重要的。可以嘗試刪去這個延時操作,再上傳程序到Arduino。你會發(fā)現(xiàn)按鍵經常出現(xiàn)控制失靈的情況。這是因為程序運行的非?欤瑳]有了延時操作,你按下按鍵到放開按鍵的間隔時間雖然極短,但loop中的語句可能已經運行了很多次,很難確定你放開按鍵時正在運行的loop() 循環(huán)是點亮還是熄滅LED。正是這樣的原因,程序變得不那么好用了。
上面程序中,我們使用延時操作來使兩次按鍵間產生一定的間隔時間,在間隔時間內Arduino會忽略按鍵按下情況,從而達到區(qū)分兩次按鍵的目的。
Arduino視頻教程基礎篇
我要自學網商城 ¥40 元
進入購買
文章評論
0 條評論 按熱度排序 按時間排序 /350
添加表情
遵守中華人民共和國的各項道德法規(guī),
承擔因您的行為而導致的法律責任,
本站有權保留或刪除有爭議評論。
參與本評論即表明您已經閱讀并接受
上述條款。
V
特惠充值
聯(lián)系客服
APP下載
官方微信
返回頂部
相關推薦
您可能對下面課程感興趣
Arduino視頻教程基礎篇

75小節(jié)已有138527人學過

分類選擇:
電腦辦公 平面設計 室內設計 室外設計 機械設計 工業(yè)自動化 影視動畫 程序開發(fā) 網頁設計 會計課程 興趣成長 AIGC