Arduino 周期任务
介绍
在Arduino编程中,周期任务是指以固定时间间隔重复执行的任务。这种任务在许多应用中非常常见,例如定时读取传感器数据、控制LED闪烁、或定期发送数据到服务器。掌握周期任务的实现方法,是Arduino编程的基础之一。
本文将逐步讲解如何在Arduino中实现周期任务,并通过代码示例和实际案例帮助你理解其应用。
基本概念
1. 使用 delay()
函数
最简单的实现周期任务的方法是使用 delay()
函数。delay()
函数会暂停程序的执行,直到指定的时间(以毫秒为单位)过去。
void loop() {
// 执行任务
digitalWrite(LED_BUILTIN, HIGH); // 打开LED
delay(1000); // 等待1秒
digitalWrite(LED_BUILTIN, LOW); // 关闭LED
delay(1000); // 等待1秒
}
delay()
函数会阻塞程序的执行,这意味着在等待期间,Arduino无法执行其他任务。因此,delay()
适用于简单的任务,但在需要同时执行多个任务时,可能会出现问题。
2. 使用 millis()
函数实现非阻塞周期任务
为了在Arduino中实现非阻塞的周期任务,可以使用 millis()
函数。millis()
函数返回自Arduino启动以来的毫秒数,通过比较当前时间与上一次任务执行的时间,可以判断是否应该执行任务。
unsigned long previousMillis = 0; // 存储上一次任务执行的时间
const long interval = 1000; // 任务执行间隔,单位为毫秒
void loop() {
unsigned long currentMillis = millis(); // 获取当前时间
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // 更新上一次任务执行的时间
// 执行任务
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); // 切换LED状态
}
}
使用 millis()
函数可以实现非阻塞的周期任务,允许Arduino在等待期间执行其他任务。
实际案例
案例1:定时读取传感器数据
假设你需要每隔5秒读取一次温度传感器的数据,并将数据发送到串口监视器。以下是实现代码:
unsigned long previousMillis = 0;
const long interval = 5000; // 5秒
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// 读取温度传感器数据
float temperature = readTemperatureSensor();
// 发送数据到串口监视器
Serial.print("Temperature: ");
Serial.println(temperature);
}
}
float readTemperatureSensor() {
// 模拟读取温度传感器数据
return 25.0; // 假设温度为25度
}
案例2:多任务周期控制
假设你需要同时控制两个LED,一个每隔1秒闪烁一次,另一个每隔2秒闪烁一次。以下是实现代码:
unsigned long previousMillisLED1 = 0;
unsigned long previousMillisLED2 = 0;
const long intervalLED1 = 1000; // 1秒
const long intervalLED2 = 2000; // 2秒
void loop() {
unsigned long currentMillis = millis();
// 控制LED1
if (currentMillis - previousMillisLED1 >= intervalLED1) {
previousMillisLED1 = currentMillis;
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); // 切换LED1状态
}
// 控制LED2
if (currentMillis - previousMillisLED2 >= intervalLED2) {
previousMillisLED2 = currentMillis;
digitalWrite(2, !digitalRead(2)); // 切换LED2状态
}
}
总结
在Arduino中实现周期任务有两种主要方法:使用 delay()
函数和使用 millis()
函数。delay()
函数简单易用,但会阻塞程序的执行;而 millis()
函数可以实现非阻塞的周期任务,适合需要同时执行多个任务的场景。
通过本文的讲解和实际案例,你应该已经掌握了如何在Arduino中实现周期任务。接下来,你可以尝试将这些概念应用到自己的项目中。
附加资源与练习
- 练习1:修改案例1中的代码,使其每隔10秒读取一次湿度传感器的数据,并将数据发送到串口监视器。
- 练习2:尝试在案例2中添加第三个LED,使其每隔3秒闪烁一次。
- 附加资源:阅读Arduino官方文档中关于
millis()
和delay()
函数的详细说明,了解更多高级用法。
在使用 millis()
函数时,注意 unsigned long
类型的变量可能会在约49天后溢出。如果你的项目需要运行超过49天,请考虑使用其他方法处理时间溢出问题。