通常情况下,我们在arduino上延时使用的都是自带的延时函数delay(),但是这个函数有很多弊端。比如占用定时器0,占用cpu资源等等。受网上帖子的启发,已经师兄的提示,我使用另外一种方式进行延时。
Arduino函数库中有一个micros()函数,其功能为返回Arduino底板的从开机到运行到当前代码行的时间,单位为微秒。我们可以利用这个函数进行定时。当然,如果你觉得微秒这个单位太小,你可以使用Arduino函数库中的另外一个函数millis(),这个函数的功能与micros()相同,单位为毫秒。
下面我们来写一个例子。功能为每过500ms改变灯的状态,实现灯的亮灭。
// 定义LED灯针脚号
int ledPin = 13;
// 定义LED灯点亮状态
int ledState = LOW;
// 定义上一次loop到当前loop的时间间隔,
unsigned long previousMillis = 0;
// 定义常量来表示固定的时间间隔,
long interval = 1000;
// 对Arduino电路板或相关状态进行初始化方法
void setup() {
// 设置LED针脚类型为状态输出针脚
pinMode(ledPin, OUTPUT);
}
// 系统调用,无限循环方法
void loop() {
// 记录程序执行到此处的时间,
unsigned long currentMillis = millis();
// 判断当前的时间与上一次记录时间的时间
// 间隔是否大于等于internal数值,
// 如果大于等于internal数值,则执行内部操作,
// 否则进入下一次loop循环。
if (currentMillis - previousMillis >= interval) {
// 更新previousMillis变量数值
previousMillis = currentMillis;
// 将LED状态变量的更改结果发送给LED灯元器件。
digitalWrite(ledPin, ledState);
//改变LED状态
ledState = !ledState;
}
}
这里需要注意的一点是,记录时间的变量一定要用长整型,因为Arduino底板运行时间会非常长,要确保变量可以放的下这个数据。
当然,这种延时方法也有弊端。那就是存储时间的变量溢出之后会导致不可控的错误。这里也请广大网友大神们来想出更好的方法。