跳到主要内容

Arduino millis函数

在Arduino编程中,时间控制是一个非常重要的概念。无论是控制LED的闪烁频率,还是定时读取传感器数据,时间管理都是不可或缺的。Arduino提供了多种时间管理函数,其中最常用的是delay()函数。然而,delay()函数有一个明显的缺点:它会阻塞程序的执行,导致其他任务无法在延迟期间运行。为了解决这个问题,Arduino提供了millis()函数。

什么是millis函数?

millis()函数返回自Arduino板开始运行当前程序以来的毫秒数。这个值是一个无符号长整型(unsigned long),最大值为4,294,967,295毫秒(约49.7天)。之后,它会从0重新开始计数。

delay()不同,millis()不会阻塞程序的执行。它只是返回一个时间值,因此你可以在程序的其他部分继续执行任务。

如何使用millis函数?

使用millis()函数的基本思路是记录一个时间点,然后在未来的某个时间点检查是否已经过了指定的时间间隔。以下是一个简单的示例,展示了如何使用millis()来控制LED的闪烁频率。

cpp
const int ledPin = 13;  // LED连接到数字引脚13
unsigned long previousMillis = 0; // 存储上次LED状态改变的时间
const long interval = 1000; // 闪烁间隔为1秒

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

void loop() {
unsigned long currentMillis = millis(); // 获取当前时间

if (currentMillis - previousMillis >= interval) {
// 如果时间间隔已过,改变LED状态
previousMillis = currentMillis; // 更新上次改变的时间
digitalWrite(ledPin, !digitalRead(ledPin)); // 切换LED状态
}
}

在这个示例中,previousMillis变量存储了上次LED状态改变的时间。每次循环中,currentMillis变量获取当前时间,并与previousMillis进行比较。如果时间间隔(interval)已经过去,LED的状态将被切换,并且previousMillis被更新为当前时间。

实际应用场景

1. 多任务处理

millis()函数非常适合用于多任务处理。例如,你可以在一个Arduino项目中同时控制多个LED的闪烁频率,而不会因为一个LED的闪烁而阻塞其他LED的控制。

cpp
const int ledPin1 = 13;
const int ledPin2 = 12;
unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;
const long interval1 = 1000;
const long interval2 = 500;

void setup() {
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
}

void loop() {
unsigned long currentMillis = millis();

if (currentMillis - previousMillis1 >= interval1) {
previousMillis1 = currentMillis;
digitalWrite(ledPin1, !digitalRead(ledPin1));
}

if (currentMillis - previousMillis2 >= interval2) {
previousMillis2 = currentMillis;
digitalWrite(ledPin2, !digitalRead(ledPin2));
}
}

在这个示例中,两个LED分别以1秒和0.5秒的间隔闪烁,互不干扰。

2. 定时读取传感器数据

另一个常见的应用场景是定时读取传感器数据。例如,你可以每隔5秒读取一次温度传感器的数据,而不影响其他任务的执行。

cpp
const int sensorPin = A0;
unsigned long previousMillis = 0;
const long interval = 5000;

void setup() {
Serial.begin(9600);
}

void loop() {
unsigned long currentMillis = millis();

if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
int sensorValue = analogRead(sensorPin);
Serial.println(sensorValue);
}
}

在这个示例中,温度传感器的数据每隔5秒被读取一次,并通过串口输出。

总结

millis()函数是Arduino中一个非常强大的工具,它允许你在不阻塞程序执行的情况下进行时间控制。通过使用millis(),你可以轻松实现多任务处理、定时读取传感器数据等功能。

提示

提示:在使用millis()时,务必注意unsigned long类型的溢出问题。虽然溢出后millis()会重新从0开始计数,但在某些情况下,你可能需要处理这种溢出情况。

附加资源与练习

  1. 练习:尝试使用millis()函数控制三个LED,分别以不同的频率闪烁。
  2. 扩展阅读:了解Arduino的micros()函数,它与millis()类似,但返回的是微秒数。
  3. 挑战:设计一个Arduino项目,使用millis()函数实现一个简单的定时器,每隔一段时间执行一次特定任务。

通过掌握millis()函数,你将能够编写更加高效和灵活的Arduino程序。继续探索和实践,你会发现它在各种项目中的广泛应用。