Arduino 極速入門系列 - 光控燈(2) - 關於開關,上拉、下拉電阻那些事


接上篇,這次繼續講解光控燈的另外兩個組成部分 - 開關和光敏電阻,光控燈里面將會有自鎖開關按鈕和光敏電阻。這此主要給新玩電子的朋友解釋一下開關按鈕的做法。

開關按鈕的引腳電平讀取問題 - 新手專用

IMG_20161226_210811

我們搭一個超簡單的電路,如上圖。Arduino Mini Pro 的 9 號引腳,接到一個按鈕,但注意看,這按鈕后面沒有接任何東西。我們運行一下以下代碼:

void setup() {
  Serial.begin(9600);
  pinMode(9, INPUT);
}

void loop() {
  delay(500);
  int val = digitalRead(9);
  if(val != 0){
    Serial.println("LOW");
  } else {
    Serial.println("HIGH");
  }
}

代碼很簡單,每 500ms (半秒)讀取一次 9 引腳的電平,輸出到串口。上傳讓它運行,在不碰任何東西情況下,你覺得有什么輸出到串口窗口 ?

結果如下圖:

A_@(TU)~PY@_4R_DD2)NU29

你會看到一些類似隨機的值,高高低低的變化着。這是完全懸空的狀態,按鈕也沒有被按下(按下也沒區別,因為按鈕另一端沒有接任何東西),也是這樣的結果。

引腳作為輸入用,處於「高阻抗」(High-impedance )狀態,對電壓變化極度敏感。外界的干擾比如旁邊引腳的電平變化,或者其他干擾來源,都有可能影響到從引腳讀取的電平值。作為一個按鈕使用,我們不希望它在沒有按下的情況下發生變化的。這時候我們會使用芯片功能或者電路,是它在沒有按下的情況下,牢牢地固定在一個值(高,或者低),而不是隨着干擾噪音而浮動。

首先我們看看搭電路能怎樣做,然后再看看芯片的功能怎樣用。

下拉電阻原理 - 新手專用

LK[I)Y2H47E6(]RZ[~MP6KW

假設另一端就是接 Arduino 引腳來讀取電平,我們已經知道這是不行的,按鈕沒按下時候雖然開路,但因各種電子噪音干擾,讀出來是浮動的電平。

 

我們想個辦法,把按鈕在沒按下時候,所有丁點的電都全流向地,比如這樣?

]RN73V{KW(`{10CY@@]QQ[6

H]L`$U(H95(V}40VTS6FCKG

 

這樣就不再浮動了吧,有多少噪音全都流向地,引腳電平牢牢地是 0V,好像行啊?但你按下按鈕的話……. Oh my lady Gaga !

TRVVU4~5$JHNTRA1Y[AT(90

 

記得上一篇我們說的短路的話,這就是了。短路是因為沒有負載,那我們加個電阻作為負載:

GMQF6DQ1{FZ3Z)99E[A]UN8

這個電阻,就叫做下拉電阻。它的作用是在按鈕開路時候,引腳以及相連導線等等全部有丁點的電壓都拉到地端去。按鈕按下時候也不會造成短路。下拉電阻,其實事情就這么簡單。

上拉電阻

反過來,上拉電阻,這樣:

0JGF8CR7S{(KG4PZK64RTIL

用上拉電阻,按鈕開路時候,電流流向引腳產生高電平信號。按鈕按下,全部電流流向地,引腳將會讀到低電平。

到底用上拉還是下拉,那看你希望按鈕開路時候讀到的是高電平,還是低電平了。

Arduino 內置的上拉電阻

很多的單片機,包括一般 Arduino 所用的芯片,都有內置上拉電阻功能,內置的不用大家像上面原理圖等等自己搭。啟用的做法就是在 pinMode 那里設置。

這樣啟用:

pinMode(9, INPUT_PULLUP)

然后實物就這樣接就好了:

%T{SLN4HP2B(R0[2_~5AB1U

就是上拉電阻的電路,已經在芯片里面,你接個按鈕再接地端,就妥妥的。

 

然后你或許會問,哎,我想默認低電平那怎么辦?這樣:

int raw = digitalRead(9);

int result = !(raw);  // 用這個值做你需要做的判斷

 

歡迎加入我們的大家庭  點擊加入 Arduino 硬創聯盟,群號 8580606


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM