导航

Blink Without Delay: 不使用 delay() 函数而使 LED 闪烁

Posted on 2016-12-26 02:42  硬创联盟  阅读(2018)  评论(0编辑  收藏  举报

不使用 delay() 函数而使 LED 闪烁

有些时候你需要同时做两件事。例如,你可能希望在读取按键按下状态同时让LED闪烁。 在这种情况下,你不能使用 delay(),因为Arduino程序会在delay()中停顿。 如果按键被按下的同时,Arduino正在暂停等待 delay()结束 ,你的程序也将会错过按键的按下.

这个演示展示了如何闪烁LED而不使用 delay()它点亮了LED,然后记录下时间。然后,每一次通过 loop()循环, 检查闪烁设置时间是否到达。 如果是,它的点亮或熄灭LED, 并且刷新时间。以这种方式让LED不断闪烁, 而代码的执行不会因一个指令而滞后.

类似的,你用微波炉热比萨,并同时等待一些重要的电子邮件。你把比萨放进微波炉10分钟。使用 delay()的类比,你坐在微波炉前面看着定时器计数,倒计时10分钟直到定时器达到零为止。如果在这期间重要的邮件到达,你将会错过它。

在现实生活中你会做的是开始热萨饼,然后检查你的电子邮件,然后可能再做别的事情(不太长时间的事!)偶尔你会回到微波炉,看看定时器是否已经达到零,即你的比萨饼是否已经完成。

在本教程中,你将学会如何建立一个类似的计时器 .

硬件需求

  • Arduino 开发板
  • LED (非必要)
  • 220欧电阻(非必要)

电路

要构建这电路,请把电阻的一端连接到板子的pin13,电阻的另一端连接到LED的长引脚(长的引脚,称为阳极),LED的短引脚连接到(短的引脚,称为阴极)板子的GND,如上图所示和下面的原理图。

大多数Arduino和Genuino板子已经将板上的LED附加在板子本身的pin13。如果你不附加任何硬件中运行这个例子,您应该看到,LED闪烁。

原理图

点击图片放大

图像使用fritzing.开发。电路的例子, 看到fritzing项目页面

构建电路后将板子插入到你的电脑,开始Arduino软件(IDE),输入下面的代码。

代码

下面的代码使用millis() 函数,从板子开始运行时,就会返回很多个毫秒的命令。当前的演示,是使LED闪烁.

/* 不使用 delay() 函数而使 LED 闪烁 

点亮和熄灭一个连接到数字引脚的发光二极管(LED),不使用delay()延迟函数。
这意味着其他代码可以同时运行而不被LED代码干扰

电路
* LED 连到引脚13 和 地
* 注:大部分 Arduino 已经有板上的LED并且是连到引脚13,所以此示例无需额外硬件 


created 2005
by David A. Mellis
modified 8 Feb 2010
by Paul Stoffregen
modified 11 Nov 2013
by Scott Fitzgerald


这个示例代码是在公共领域.

http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
*/

//一个不会改变的常量。这里用来定义一个引脚: 
const int ledPin =  13;      // LED引脚号 

// 一个会变化的变量: 
int ledState = LOW;             //ledState将LED置低电平 

//一般来说,应该使用 "unsigned long" 类型的变量来保存时间
// 如果用int类型来存储值,它很快就会变得过大而该类似无法储存
unsigned long previousMillis = 0;        // 将存储的LED值最后一次更新 

//一个不会改变的常量: 
const long interval = 1000;           // 闪烁的时间间隔(毫秒)

void setup() {
  // 设置数字引脚作为输出:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // 在这里,你放置的代码需要一直运行.

  // 检查闪烁的时间,就是if
  // 当前时间和上次闪烁的时间
  //设置你想要的 LED更大的时间间隔
  // LED闪烁.
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // 保存上次LED闪烁时间
    previousMillis = currentMillis;

    // 如果LED是点亮的,反之亦然:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // 设置LED的电平为ledState值:
    digitalWrite(ledPin, ledState);
  }
}

 

参考