Arduino 时序控制
时序控制是Arduino编程中的一个重要概念,它允许我们精确控制代码的执行时间,从而实现各种时间相关的功能。无论是控制LED灯的闪烁频率,还是定时读取传感器数据,时序控制都是不可或缺的工具。
什么是时序控制?
时序控制是指通过编程手段,控制代码在特定时间点执行特定的操作。在Arduino中,我们可以使用内置的函数和库来实现时序控制,例如 delay()
、millis()
和 micros()
。
基本时序控制函数
delay()
: 暂停程序执行指定的毫秒数。millis()
: 返回从Arduino启动以来的毫秒数。micros()
: 返回从Arduino启动以来的微秒数。
delay()
函数会阻塞程序的执行,因此在需要同时执行多个任务时,建议使用 millis()
或 micros()
来实现非阻塞的时序控制。
使用 delay()
实现简单的时序控制
以下是一个简单的例子,使用 delay()
函数控制LED灯的闪烁频率。
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灯闪烁的例子。
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()
来实现这一功能。
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灯以不同的频率闪烁。
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()
的详细说明,了解更多高级用法。
在实际项目中,时序控制的精度和可靠性非常重要。建议在编写代码时,充分考虑各种可能的边界情况,并进行充分的测试。