## LED閃爍進階
> 有時候你需要同時處理多件事情。比如:在按鈕按下的時候讓LED閃爍。?
> 在這種情況下delay()函數就不好用了,因為Arduino在delay的時候會完全暫停運行的程序。如果按鈕按下而Arduino正在delay,那么你的程序就無法覺察到按鈕被按下了。?
> 本例程向你展示如何不用delay()而讓LED閃爍。具體方法是:把LED打開后記錄一下當前時間。接著,每次loop()函數被調用,就檢查一下是否距離上一次記錄的時間已經過了想讓LED點亮或關閉的時間。如果時間差足夠,那么就將LED關閉或點亮,并且記錄現在的時間……如此往復,LED就會照常閃爍,并且程序再也不會被LED的閃爍這樣原先需要用delay函數的操作拖后腿了。
我們類比一下生活中的場景。假設你正在家里用微波爐加熱披薩餅,可與此同時你還在網上等一封重要的電子郵件。如果你使用delay()來完成,就好比你在微波爐前坐等十分鐘。眼睛緊緊盯著定時器直到指針轉到0,等披薩餅熱完了之后再做到電腦跟前去。如果真這樣做,那么當重要郵件來的時候你就把它錯過去了。
聰明人會怎么做呢:把微波爐定時10分鐘,然后坐到電腦前等著郵件(或者可能去做其他耗時不那么長的事情)。每過一小段時間就回到微波爐跟前,看看定時器有沒有走完,這樣才可“工作”、“生活”兩不誤。
在本篇教程中,你將會學會如何設置一個類似的“定時器”。
### 所需硬件設備
Arduino板或Genuino板?
LED燈?
220Ω電阻?
面包板線/杜邦線
### 電路
?
連線方式如下:首先,連接電阻的一端到13號引腳。然后,將LED的長腳(表示陽極)連接到電阻的另一端。接著,連接LED的短腳(表示陰極)連接到板子上的GND接口,如上圖所示。
大多數Arduino板或Genuino板已經有板載的LED連接到13號引腳了。如果你在Arduino上運行下面的代碼,你應該也可以看到一個板載LED在閃爍。
### 原理圖
?
在你搭好電路之后,將板子連上電腦。在打開Arduino IDE后,請鍵入以下代碼。
### 代碼
下列代碼運用了mills()函數。mills()函數返回一個時間值,這個值表示從程序的運行時間(從通電或復位開始),單位為**毫秒(milliseconds )**。
~~~
/* LED閃爍進階
讓13引腳連接的LED閃爍起來而不使用delay()函數。這樣就意味著其他的代碼可以不受LED閃爍的干擾,在“同一時間”(譯者注:其實應該是幾乎同一時間)運行。
電路這樣搭:
* LED連接到13引腳和GND。
* 注:絕大多數Arduino已經在13引腳連接了板載LED。因而這個例子可能不需要多余LED也能看到效果。
代碼是公開的。
*/
// 定義一個不會改變的整型常量。這里用來定義引腳號碼:
const int ledPin = 13; // LED連接的引腳
// 聲明并定義可變的變量 :
int ledState = LOW; // LED的狀態值
// 一般來說,用 "unsigned long"類型的變量來存儲時間值比較好。因為如果用int類型“裝不下”這么大的數字。
unsigned long previousMillis = 0; // 存儲上次LED狀態被改變的時間
// 又定義了一個常量 :
const long interval = 1000; // LED狀態應該被改變的間隔時間(單位毫秒)
void setup() {
// 將數字引腳定義為輸出模式:
pinMode(ledPin, OUTPUT);
}
void loop() {
//這里寫你想要不斷運行的代碼。
// 檢查看看LED是否到了應該打開或關閉的時間; 就是說,檢查下現在時間離開記錄的時間是否超過了要求LED狀態改變的間隔時間。
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// 更新時間標記
previousMillis = currentMillis;
// 如果LED關閉則打開它,如果LED打開則關閉它:
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
// 用以下代碼設置LED狀態:
digitalWrite(ledPin, ledState);
}
}
~~~
## 相關資料
[setup()](https://www.arduino.cc/en/Reference/Setup)?
[loop()](https://www.arduino.cc/en/Reference/Loop)?
[millis()](http://www.arduino.cc/en/Reference/Millis)?
- 說明
- 系統示例文件目錄結構及說明
- 01.Basics
- AnalogReadSerial
- BareMinimum
- Blink
- DigitalReadSerial
- Fade
- ReadAnalogVoltage
- 02.Digital
- BlinkWithoutDelay
- Button
- Debounce
- DigitalInputPullup
- StateChangeDetection
- toneKeyboard
- toneMelody
- toneMultiple
- tonePitchFollower
- 03.Analog
- AnalogInOutSerial
- AnalogInput
- AnalogWriteMega
- Calibration
- Fading
- Smoothing
- 04.Communication
- ASCIITable
- Dimmer
- Graph
- Midi
- MultiSerial
- PhysicalPixel
- ReadASCIIString
- SerialCallResponse
- SerialCallResponseASCII
- SerialEvent
- SerialPassthrough
- VirtualColorMixer
- 05.Control
- Arrays
- ForLoopIteration
- IfStatementConditional
- switchCase
- switchCase2
- WhileStatementConditional
- 06.Sensors
- ADXL3xx
- Knock
- Memsic2125
- Ping
- 07.Display
- barGraph
- RowColumnScanning
- 08.Strings
- CharacterAnalysis
- StringAdditionOperator
- StringAppendOperator
- StringCaseChanges
- StringCharacters
- StringComparisonOperators
- StringConstructors
- StringIndexOf
- StringLength
- StringLengthTrim
- StringReplace
- StringStartsWithEndsWith
- StringSubstring
- StringToInt
- 09.USB
- Keyboard
- KeyboardLogout
- KeyboardMessage
- KeyboardReprogram
- KeyboardSerial
- KeyboardAndMouseControl
- Mouse
- ButtonMouseControl
- JoystickMouseControl
- 10.StarterKit_BasicKit (與特定硬件相關,暫無)
- p02_SpaceshipInterface
- p03_LoveOMeter
- p04_ColorMixingLamp
- p05_ServoMoodIndicator
- p06_LightTheremin
- p07_Keyboard
- p08_DigitalHourglass
- p09_MotorizedPinwheel
- p10_Zoetrope
- p11_CrystalBall
- p12_KnockLock
- p13_TouchSensorLamp
- p14_TweakTheArduinoLogo
- p15_HackingButtons
- 11.ArduinoISP(暫無)
- ArduinoISP