搜尋程式碼

第98-3課:點樣用Arduino同按鈕開關去開/閂一個切換式LED

第98-3課:點樣用Arduino同按鈕開關去開/閂一個切換式LED

按鈕開關周圍都係——遙控器、電器同控制面板——而當一個掣要負責多過一個功能嗰陣,你就需要切換邏輯。呢個項目會示範點樣令一個按鈕第一次撳就開着 LED,再撳就熄咗佢,咁燈就會保持喺你上次撳完嗰個狀態。嗰種「撳一下鎖定,再撳一下解除」嘅行為,就係你將來幾乎所有選單按鈕、電源開關同模式選擇器嘅基礎。

LED with resistor on breadboard connected to Arduino with a push button
LED with resistor on breadboard connected to Arduino with a push button

一旦你明白咗切換邏輯,同一套程式碼模式就可以擴展到真實硬件。你可以用佢嚟:

  • 用一個面板按鈕切換控制交流電燈或者枱燈嘅繼電器。
  • 用一個按鈕而唔係兩個嚟啟動同停止摩打或者水泵。
  • 喺裝置上循環切換運作模式(例如慢 / 快 / 關)。
  • 建立一個鎖定式警報,佢會一直開着直到有人確認。
  • 為音響項目整一個靜音按鈕,佢會記住自己嘅狀態。
  • 作為電池供電小工具嘅軟電源開關,取代機械開關。

導師喺影片入面直接指出呢一點(影片 19:52 位置):呢個項目其實完全唔係關於 LED——而係關於切換技巧,你可以將佢指向繼電器、摩打驅動器或者任何其他輸出。

LED-5mm-green

硬件同組件

零件清單刻意做到最精簡,所以如果你啱啱開始,呢個係一個好項目。你需要:

  • 一塊 Arduino 板——Uno、Nano 或者 Mega 都用到。
  • 一粒 LED,3 mm 或者 5 mm,任何顏色。
  • 一粒俾 LED 用嘅電阻,由 200 Ω 到 1000 Ω 都可以。逐字稿解釋咗原因(影片 03:49 位置):一粒 LED 大約降 2 V 並且食大約 10 mA,所以喺 5 V 供電下,剩低嗰 3 V 必須由電阻降走。歐姆定律得出 3 V ÷ 0.01 A = 300 Ω,而由 300 Ω 到 1000 Ω 之間任何值都行——數值越高只會令 LED 越暗。
  • 一個按鈕開關。影片展示咗細嘅四腳輕觸式型號同長腳版本(影片 12:43 位置)。如果你冇按鈕,普通開關都一樣得——只要搵到接通同斷開電路嗰兩個端子就得。
  • 一塊麵包板同幾條杜邦跳線。

影片入面一個實用貼士(影片 07:50 位置):四腳輕觸式按鈕有兩對內部相連嘅腳。用萬用錶嘅通斷模式搵出邊兩隻腳會一齊響——嗰啲就係開關嘅一邊。將一邊接到輸入腳,另一邊接到地。

接線指南

Arduino schematic for LED with a push button switch
Arduino schematic for LED with a push button switch
Arduino wiring for LED with a push button switch
Arduino wiring for LED with a push button switch

接線同簡單 LED 加按鈕電路一樣,只係加咗個按鈕喺上面。LED 嘅陽極(長腳)接到腳 3,而佢嘅陰極(短腳,喺外殼平嗰邊)透過電阻接到地。按鈕接喺腳 2 同地之間——唔需要其他嘢,因為程式碼會啟用 Arduino 嘅內部上拉電阻。

嗰個內部上拉值得了解一下:冇佢嘅話,浮空嘅輸入腳會讀到隨機雜訊。啟用 INPUT_PULLUP 會喺按鈕開路時將隻腳保持喺 5 V,而撳按鈕就會將佢拉低到 0 V。呢個就係點解程式碼會將 LOW 讀數當作「撳咗」——同一個普通接去地嘅開關加外部電阻相比,邏輯係反轉嘅。

程式碼解釋

完整 sketch 喺呢篇文章下面有得睇。呢度我哋會集中講你真正想改嘅部分。

喺檔案頂部,兩個腳位指派定義為常數。如果你將電線移到唔同腳位,呢度就係你唯一需要改嘅地方:

const int pushButtonPin = 2;//define a pin number for push button
const int LEDPin = 3;//define a pin that is connected to LED

跟住係三個狀態變數。你通常唔需要改呢啲,但知道佢哋做乜會有幫助:

int pushButtonStatus = 0; // push value from pin 2
int lightStatus = 0;//light status
int pushed = 0;//push status

pushButtonStatus 每次行迴圈嗰陣都會儲存按鈕引腳嘅原始讀數。lightStatus 就記住上一次按鈕引腳讀到嘅嘢,噉樣個 sketch 就可以偵測到啱啱撳落去嗰一刻,而唔係一路不停咁反應。pushed 就係真正嘅切換旗標 — 佢喺 0 同 1 之間跳嚟跳去,決定粒 LED 應該着定係熄。

個切換本身用咗一個好巧妙嘅算術技巧(喺影片 18:30 度)。用一減去個旗標就會將佢反轉:1 - 0 得出 1,而 1 - 1 就得出 0。所以每次偵測到新嘅一撳,一行就搞掂個狀態切換:

pushed = 1-pushed;//toggle the pushed value
delay(100);//give some time for finger to press

嗰 100 ms 嘅延遲係要畀你隻手指離開粒按鈕。冇咗佢嘅話,一次物理上嘅撳掣可能會被計好多次。如果你粒按鈕感覺唔可靠,或者你隻手指震震哋,就加大呢個數值(喺影片 40:39 度)。

觸發切換嘅條件就係成個 sketch 嘅關鍵。佢淨係喺按鈕唔係被撳住(HIGH,因為有上拉電阻)而且上一次讀數係 LOW 嗰陣先至會觸發 — 即係話粒按鈕啱啱撳完放開咗:

if(pushButtonStatus == HIGH && lightStatus == LOW){
  pushed = 1-pushed;//toggle the pushed value
  delay(100);//give some time for finger to press
}

最後,粒 LED 就由個切換旗標嚟驅動,而當前嘅按鈕讀數就會儲起留返下次比較用:

lightStatus = pushButtonStatus;
if(pushed == HIGH){
  Serial.println("Light ON");
  digitalWrite(LEDPin, HIGH); //turn the LED ON
}else{
  Serial.println("Light OFF");
  digitalWrite(LEDPin, LOW);//turn the LED OFF
}

你亦都可以開個 Serial Monitor,set 做 9600 baud,噉你就可以喺撳掣嗰陣睇住 "Light ON" 同 "Light OFF" 嘅訊息。

即場示範

喺影片度(喺影片 19:41 度)你可以睇到實際嘅行為:第一次撳會着咗粒 LED,而且放開手指之後佢都會繼續着住。下一次撳就會熄咗佢,而且佢會繼續熄住。唔需要㩒住粒按鈕,呢個就正正係呢個 project 同 Lesson 98-2: How to Turn On and Off an LED Using a Push Button with Arduino 入面講嗰個簡單啲嘅「㩒住先着」版本嘅分別。

影片亦都指出你可以將粒 LED 換做繼電器模組嚟切換市電供電嘅裝置,或者換做摩打驅動器嚟開同停一個摩打。個切換邏輯唔會變 — 淨係得個輸出裝置變咗。

同一條影片入面展示嘅其他變化 — 令 LED 漸變、搖搖板圖案、走馬燈、電壓條錶、同交通燈 — 每一個都喺佢自己嘅教學入面有講,下面有連結。

呢條影片嘅相關 project

章節

  • [00:00] 10 個 LED project 概覽
  • [01:00] Arduino 逐步教學課程簡介
  • [02:29] LED 基礎:符號、陽極、陰極、同電阻計算
  • [05:53] Project 1:着同熄一粒 LED
  • [12:43] Project 2:按鈕控制 LED
  • [17:13] Project 3:按鈕切換 LED 着同熄
  • [20:12] Project 4:令 LED 漸變
  • [23:20] Project 5:用按鈕令 LED 漸變
  • [27:32] Project 6:兩粒 LED 嘅搖搖板
  • [30:47] Project 7:五粒 LED 嘅走馬燈
  • [36:41] Project 8:用按鈕推進嘅走馬燈
  • [42:25] Project 9:用電位器嘅 LED 電壓電平錶
  • [49:25] Project 10:Arduino 交通燈

圖片

push-button-and-finger
push-button-and-finger
Arduino schematic for LED
Arduino schematic for LED
Arduino wiring for LED with a push button switch
Arduino wiring for LED with a push button switch
Arduino schematic for LED with a push button switch
Arduino schematic for LED with a push button switch
LED-5mm-green
LED-5mm-green
LED 連電阻喺麵包板上,連接到 Arduino 同一個按鈕
LED 連電阻喺麵包板上,連接到 Arduino 同一個按鈕
935-Lessson 98-LED-3: Arduino code push button toggles LED ON/OFF
語言: C++
This code has not been parsed yet. Please return to the admin panel to parse it.

文件📁

Arduino 函式庫 (zip)

用户手册