合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
## 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)