delay()函数

delay()工作方式非常简单。它接受单个整数(或数字)参数。此数字表示时间(以毫秒为单位)。当程序遇到这个函数时,应该等到下一行代码。然而,问题是,delay()函数并不是让程序等待的好方法,因为它被称为阻塞(blocking)函数。

阻塞功能可以阻止程序在完成特定任务之前执行任何其他操作。如果您希望同时发生多个 action ,则根本无法使用 delay。

尤其是: 如果您的应用程序要求您执行以下操作:不断从连接的传感器获取数据,您应避免使用 delay()函数,因为它会绝对暂停所有内容。

幸运的是,delay()不是让程序在为Arduino编码时等待的唯一方法。

millis()函数

millis()函数执行单个任务。调用时,它返回(作为 long 数据类型)自程序首次启动以来经过的毫秒数。那么,为什么这样做有用呢?

由于使用了一些简单的数学运算,您可以轻松地“计时"程序的各个方面而不会影响程序的工作方式。以下是millis()工作原理的基本演示。如您所见,程序将LED灯点亮1000毫秒(一秒钟),然后将其关闭。但是至关重要的是,它以一种非阻塞的方式实现了它。
现在让我们看看它如何与Arduino一起工作。

const int ledPin=13;
int ledState=LOW;
long previousTime=0;
long interval= 2000;

void setup(){
  pinMode(ledPin,OUTPUT);
}

void loop(){
  unsigned long currentTime=millis();
  if(currentTime - previousTime > interval){
  previousTime=currentTime;
  if (ledState==LOW)
  ledState= HIGH;
  else
  LedState = LOW;
  digitalWrite(ledPin, ledState);
  }
}

该程序-很大程度上基于Arduino官方文档-通过从当前时间中减去先前记录的时间来工作。如果剩余时间(即自上次记录时间以来经过的时间)大于间隔(在这种情况下为1000毫秒),则程序会将 previousTime 变量更新为当前时间,并且由于它是非阻塞的,因此位于第一个 if语句之外的任何代码都应正常工作。

中断

到目前为止,我们已经了解了一种在Arduino程序中计时的方法,该方法比 delay()更好。但是还有另一种更好但更复杂的方法:中断。这些优点是允许您精确地计时Arduino程序,并以异步的方式快速响应外部输入。

这意味着它可以与主程序,不断等待事件发生,而不会中断代码流。这可以帮助您有效地响应事件,而不会影响Arduino处理器的性能。

触发中断时,它要么停止程序,要么调用一个函数,通常称为 Interrupt Handler。 或中断服务程序。一旦结束,程序便返回到原来的状态。

为Arduino提供动力的AVR芯片仅支持硬件中断。当输入引脚从高到低或由Arduino的内置计时器触发时,就会发生这种情况。

听起来有些神秘。甚至令人困惑。但事实并非如此。要了解它们的工作原理并查看它们在现实世界中的使用示例,请访问Arduino文档。

使用 millis()确实需要一些额外的工作与使用 delay()相比。但是请相信我,您的程序将对此表示感谢,没有它,您将无法在Arduino上执行多任务处理。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐