跳到主要内容

Arduino 时序控制

时序控制是Arduino编程中的一个重要概念,它允许我们精确控制代码的执行时间,从而实现各种时间相关的功能。无论是控制LED灯的闪烁频率,还是定时读取传感器数据,时序控制都是不可或缺的工具。

什么是时序控制?

时序控制是指通过编程手段,控制代码在特定时间点执行特定的操作。在Arduino中,我们可以使用内置的函数和库来实现时序控制,例如 delay()millis()micros()

基本时序控制函数

  1. delay(): 暂停程序执行指定的毫秒数。
  2. millis(): 返回从Arduino启动以来的毫秒数。
  3. micros(): 返回从Arduino启动以来的微秒数。
备注

delay() 函数会阻塞程序的执行,因此在需要同时执行多个任务时,建议使用 millis()micros() 来实现非阻塞的时序控制。

使用 delay() 实现简单的时序控制

以下是一个简单的例子,使用 delay() 函数控制LED灯的闪烁频率。

cpp
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // 设置内置LED引脚为输出模式
}

void loop() {
digitalWrite(LED_BUILTIN, HIGH); // 打开LED
delay(1000); // 等待1秒
digitalWrite(LED_BUILTIN, LOW); // 关闭LED
delay(1000); // 等待1秒
}

在这个例子中,LED灯会每隔1秒钟闪烁一次。

使用 millis() 实现非阻塞时序控制

millis() 函数可以用于实现非阻塞的时序控制。以下是一个使用 millis() 控制LED灯闪烁的例子。

cpp
unsigned long previousMillis = 0; // 存储上一次LED状态改变的时间
const long interval = 1000; // 闪烁间隔时间(毫秒)
bool ledState = LOW; // LED的当前状态

void setup() {
pinMode(LED_BUILTIN, OUTPUT); // 设置内置LED引脚为输出模式
}

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

if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // 更新上一次状态改变的时间

// 切换LED状态
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}

digitalWrite(LED_BUILTIN, ledState); // 设置LED状态
}
}

在这个例子中,LED灯会每隔1秒钟闪烁一次,但程序不会因为 delay() 而阻塞,因此可以在 loop() 函数中执行其他任务。

实际应用案例

案例1:定时读取传感器数据

假设我们需要每隔5秒钟读取一次温度传感器的数据,并将其打印到串口监视器上。我们可以使用 millis() 来实现这一功能。

cpp
unsigned long previousMillis = 0;
const long interval = 5000; // 5秒

void setup() {
Serial.begin(9600); // 初始化串口通信
}

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

if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;

int sensorValue = analogRead(A0); // 读取模拟引脚A0的传感器数据
float voltage = sensorValue * (5.0 / 1023.0); // 将模拟值转换为电压
float temperature = voltage * 100; // 假设电压与温度成正比

Serial.print("Temperature: ");
Serial.println(temperature); // 打印温度值
}
}

案例2:多任务时序控制

在某些情况下,我们可能需要同时控制多个设备的时序。例如,控制两个LED灯以不同的频率闪烁。

cpp
unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;
const long interval1 = 1000; // LED1的闪烁间隔
const long interval2 = 500; // LED2的闪烁间隔
bool ledState1 = LOW;
bool ledState2 = LOW;

void setup() {
pinMode(8, OUTPUT); // LED1连接到引脚8
pinMode(9, OUTPUT); // LED2连接到引脚9
}

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

// 控制LED1
if (currentMillis - previousMillis1 >= interval1) {
previousMillis1 = currentMillis;
ledState1 = !ledState1;
digitalWrite(8, ledState1);
}

// 控制LED2
if (currentMillis - previousMillis2 >= interval2) {
previousMillis2 = currentMillis;
ledState2 = !ledState2;
digitalWrite(9, ledState2);
}
}

在这个例子中,LED1会每隔1秒钟闪烁一次,而LED2会每隔0.5秒钟闪烁一次。

总结

时序控制是Arduino编程中的核心概念之一。通过使用 delay()millis()micros() 等函数,我们可以实现各种时间相关的功能。对于简单的任务,delay() 是一个方便的选择,但在需要同时执行多个任务时,millis()micros() 提供了更灵活的非阻塞解决方案。

附加资源与练习

  • 练习1: 修改LED闪烁的例子,使LED灯以不同的频率闪烁(例如,1秒和2秒交替)。
  • 练习2: 尝试使用 micros() 函数实现更精确的时序控制,例如控制一个伺服电机的转动角度。
  • 附加资源: 阅读Arduino官方文档中关于 millis()micros() 的详细说明,了解更多高级用法。
提示

在实际项目中,时序控制的精度和可靠性非常重要。建议在编写代码时,充分考虑各种可能的边界情况,并进行充分的测试。