锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Arduino延迟函数delay(),以及为什么不应该使用它

时间:2022-11-29 09:30:00 继电器2864150mini

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执行多任务处理。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章