相關(guān)推薦
您可能對(duì)下面課程感興趣
Arduino視頻教程基礎(chǔ)篇

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

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


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

連接示意圖


原理圖


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

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

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

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

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

  1. /*
  2.   Button

  3. 通過2號(hào)引腳連接的按鍵,控制13號(hào)引腳連接的LED

  4. 備注:大多數(shù)Arduino的13號(hào)引腳上都連接了名為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. // 設(shè)置各引腳別名
  13. const int buttonPin = 2;     // 連接按鍵的引腳
  14. const int ledPin =  13;      // 連接LED的引腳

  15. // 變量定義
  16. int buttonState = 0;         // 存儲(chǔ)按鍵狀態(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)并存儲(chǔ)在變量中
  25.   buttonState = digitalRead(buttonPin);

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


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


項(xiàng)目進(jìn)階
對(duì)于在以上項(xiàng)目,我們還可以做如下修改。

連接示意圖


如上,我們?nèi)サ袅嗽瓉黼娐分?號(hào)引腳連接的下拉電阻,并將按鍵的一端連接到GND;

原理圖


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

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


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

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

這里使用的是內(nèi)部上拉電阻,也可以使用外部上拉電阻替代。穩(wěn)定懸空引腳的電平所用電阻應(yīng)該選擇合適的阻值,例如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.   // 按住按鍵時(shí),點(diǎn)亮LED;放開按鍵后,熄滅LED。
  18.   if(buttonState==HIGH)
  19.   {
  20.     digitalWrite(ledPin,LOW);
  21.   }
  22.   else
  23.   {
  24.     digitalWrite(ledPin,HIGH);
  25.   }
  26. }
復(fù)制代碼



接下來我們要對(duì)控制程序做一個(gè)升級(jí),完成一個(gè)新的控制效果。按一下按鍵,點(diǎn)亮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.   // 當(dāng)按鍵按下時(shí),點(diǎn)亮或熄滅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. }
復(fù)制代碼



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


因?yàn)樵诔跏蓟瘯r(shí),我們已經(jīng)將buttonPin引腳設(shè)為了輸入上拉狀態(tài)。如果沒有按下按鍵,使用digitalRead(buttonPin) 讀出的值始終為高電平,這個(gè)循環(huán)也將一直運(yùn)行;當(dāng)你按下按鍵后,digitalRead(buttonPin) 讀出了低電平,while循環(huán)的判斷條件為假,程序會(huì)退出這個(gè)循環(huán),并開始運(yùn)行此后的語句。這樣我們就實(shí)現(xiàn)了一個(gè)等待用戶按下按鍵的效果。

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

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

分類選擇:
電腦辦公 平面設(shè)計(jì) 室內(nèi)設(shè)計(jì) 室外設(shè)計(jì) 機(jī)械設(shè)計(jì) 工業(yè)自動(dòng)化 影視動(dòng)畫 程序開發(fā) 網(wǎng)頁設(shè)計(jì) 會(huì)計(jì)課程 興趣成長 AIGC