Arduino学习笔记 -自制延时函数,可以实现多线程

通常情况下,我们在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底板运行时间会非常长,要确保变量可以放的下这个数据。

当然,这种延时方法也有弊端。那就是存储时间的变量溢出之后会导致不可控的错误。这里也请广大网友大神们来想出更好的方法。

 

网上帖子参考地址:http://www.51hei.com/bbs/dpj-41331-1.html

你可能感兴趣的:(学习笔记)