你需要做的第一件事是停止使用delay()。

使用delay()来控制时间可能是您在实验Arduino时学到的第一件事之一。使用delay()进行计时是简单而直接的,但是当您想要添加额外的功能时,它确实会导致问题。问题是delay()是一个独占处理器的“繁忙等待”。

在delay()调用期间,您不能响应输入,不能处理任何数据,也不能更改任何输出。delay()占用了100%的处理器。因此,如果代码的任何部分使用了delay(),那么在此期间,其他所有内容都是死水。

还记得眨眼吗?

/*闪烁将LED打开一秒钟,然后关闭一秒钟,重复。此示例代码属于公共领域。*/ //大多数Arduino板上的引脚13都有LED连接。//给它一个名字:int led = 13;//当你按下reset: void setup(){//初始化数字引脚作为输出时,设置例程运行一次。pinMode(领导、输出);} //循环例程永远地重复运行:void loop() {digitalWrite(led, HIGH);//打开LED (HIGH为电压级)延时(1000);//等待第二个digitalWrite(led, LOW);//通过设置电压低延时(1000)关闭LED; // wait for a second }

简单的Blink草图几乎把所有的时间都花在了delay()函数上。因此,处理器在闪烁时不能做任何其他事情。

还要扫吗?

Sweep使用delay()来控制扫描速度。如果您尝试将基本的闪烁草图与伺服扫描示例结合起来,您将发现它在闪烁和扫描之间交替。但它不会同时做到这两点。

#include  //在大多数Arduino板上,引脚13有一个LED连接。//给它一个名字:int led = 13;伺服myservo;//创建伺服对象来控制伺服//在大多数板上可以创建十二个伺服对象int pos = 0;//变量存储伺服位置void setup(){//初始化数字引脚作为输出pinMode(领导、输出);myservo.attach (9);//将引脚9上的伺服附加到伺服对象}void loop() {digitalWrite(led, HIGH);//打开LED (HIGH为电压级)延时(1000);//等待第二个digitalWrite(led, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second for(pos = 0; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees { // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } for(pos = 180; pos>=0; pos-=1) // goes from 180 degrees to 0 degrees { myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } }

那么,我们如何在不使用延迟函数的情况下控制时间呢?

本指南首次发布于2014年11月3日。最后更新于2014年10月27日。

本页(Ditch the delay())最后一次更新是在2014年10月27日。

文本编辑器tinymce