## LED闪烁进阶
> 有时候你需要同时处理多件事情。比如:在按钮按下的时候让LED闪烁。
> 在这种情况下delay()函数就不好用了,因为Arduino在delay的时候会完全暂停运行的程序。如果按钮按下而Arduino正在delay,那么你的程序就无法觉察到按钮被按下了。
> 本例程向你展示如何不用delay()而让LED闪烁。具体方法是:把LED打开后记录一下当前时间。接着,每次loop()函数被调用,就检查一下是否距离上一次记录的时间已经过了想让LED点亮或关闭的时间。如果时间差足够,那么就将LED关闭或点亮,并且记录现在的时间……如此往复,LED就会照常闪烁,并且程序再也不会被LED的闪烁这样原先需要用delay函数的操作拖后腿了。
我们类比一下生活中的场景。假设你正在家里用微波炉加热披萨饼,可与此同时你还在网上等一封重要的电子邮件。如果你使用delay()来完成,就好比你在微波炉前坐等十分钟。眼睛紧紧盯着定时器直到指针转到0,等披萨饼热完了之后再做到电脑跟前去。如果真这样做,那么当重要邮件来的时候你就把它错过去了。
聪明人会怎么做呢:把微波炉定时10分钟,然后坐到电脑前等着邮件(或者可能去做其他耗时不那么长的事情)。每过一小段时间就回到微波炉跟前,看看定时器有没有走完,这样才可“工作”、“生活”两不误。
在本篇教程中,你将会学会如何设置一个类似的“定时器”。
### 所需硬件设备
Arduino板或Genuino板
LED灯
220Ω电阻
面包板线/杜邦线
### 电路
![图片来自官网](http://img.blog.csdn.net/20160419115943594)
连线方式如下:首先,连接电阻的一端到13号引脚。然后,将LED的长脚(表示阳极)连接到电阻的另一端。接着,连接LED的短脚(表示阴极)连接到板子上的GND接口,如上图所示。
大多数Arduino板或Genuino板已经有板载的LED连接到13号引脚了。如果你在Arduino上运行下面的代码,你应该也可以看到一个板载LED在闪烁。
### 原理图
![图片来自官网](http://img.blog.csdn.net/20160419120000206)
在你搭好电路之后,将板子连上电脑。在打开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