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

时间:2021-10-12 23:44:40

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

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

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

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

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

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

硬件需求

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

电路

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

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

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

原理图

点击图片放大

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

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

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

代码

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

/* 不使用 delay() 函数而使 LED 闪烁 点亮和熄灭一个连接到数字引脚的发光二极管(LED),不使用delay()延迟函数。这意味着其他代码可以同时运行而不被LED代码干扰电路* LED 连到引脚13 和 地* 注:大部分 Arduino 已经有板上的LED并且是连到引脚13,所以此示例无需额外硬件 created 2005by David A. Mellismodified 8 Feb 2010by Paul Stoffregenmodified 11 Nov 2013by 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);  }}

 

参考