Skip to content

Arduino - 循环

在编程中,循环是一种控制结构,允许你重复执行一段代码块。这对于多次读取传感器、闪烁 LED 或处理列表中的项等任务至关重要。Arduino 使用 C++,提供了几种强大的循环类型。

当你知道要执行代码块的次数时,使用 for 循环。它将初始化、条件检查和增量/减量表达式结合到一行紧凑的代码中。

语法:

for (initialization; condition; increment) {
// 要执行的代码
}

示例: 让一个 LED 闪烁 5 次。

const int ledPin = 13; // 对于现代开发板,可以使用 LED_BUILTIN
void setup() {
pinMode(ledPin, OUTPUT);
// 循环 5 次。'i' 从 0 到 4。
for (int i = 0; i < 5; i++) {
digitalWrite(ledPin, HIGH); // 打开 LED
delay(200);
digitalWrite(ledPin, LOW); // 关闭 LED
delay(200);
}
}
void loop() {
// 主循环是空的,因为所有操作都在 setup() 中完成
}

一个 while 循环只要指定条件为 true,就执行一段代码块。条件在循环体执行之前被检查。如果条件最初就为 false,则循环将永不运行。

语法:

while (condition) {
// 要执行的代码
}

示例: 等待直到 A0 引脚上的模拟传感器读数超过 500。

const int sensorPin = A0;
const int ledPin = 13;
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
Serial.println("Waiting for sensor value to exceed 500...");
// 当传感器读数低于阈值时,持续循环
while (analogRead(sensorPin) <= 500) {
// 这里是添加一个短延迟的好地方,以防止串口监视器被刷屏
// 或者在更复杂的代码中允许处理器处理其他任务。
delay(50);
}
Serial.println("Threshold reached! Lighting up the LED.");
digitalWrite(ledPin, HIGH); // 一旦条件满足,就点亮 LED
}
void loop() {
}

一个 do-while 循环与 while 循环类似,但条件在循环体执行之后被检查。这保证了代码块至少会运行一次。

语法:

do {
// 要执行的代码
} while (condition);

示例: 从串口读取一个字符并回显,直到接收到字符 ‘q’。

char receivedChar;
void setup() {
Serial.begin(9600);
Serial.println("Enter characters. Type 'q' to quit.");
}
void loop() {
do {
// 等待数据可用
while (Serial.available() == 0) {
// 什么也不做,只是等待
}
// 读取字符并打印它
receivedChar = Serial.read();
Serial.print("You typed: ");
Serial.println(receivedChar);
} while (receivedChar != 'q');
Serial.println("--- Program Halted ---");
while(true) {
// 无限循环以阻止进一步执行
}
}

现代 C++(由 Arduino 工具链支持)引入了一种更简单的 for 循环,用于迭代数组或其他集合的所有元素。它更不容易出错且更易读。

示例: 按顺序点亮一系列 LED。

// 一个 LED 引脚号数组
const int ledPins[] = {2, 3, 4, 5};
void setup() {
// 使用基于范围的 for 循环将每个引脚设置为 OUTPUT
// 'int pin' 声明一个临时变量来保存每个元素
for (int pin : ledPins) {
pinMode(pin, OUTPUT);
}
}
void loop() {
// 依次点亮每个 LED
for (int pin : ledPins) {
digitalWrite(pin, HIGH);
delay(250);
digitalWrite(pin, LOW);
}
}

循环控制:‘break’ 和 ‘continue’

Section titled “循环控制:‘break’ 和 ‘continue’”
  • break:立即退出当前循环(for、while、do-while),并在循环后的语句处继续执行。
  • continue:跳过当前循环迭代的其余部分,并进入下一次迭代。

示例: 计算 1 到 20 之间数字的和,但跳过数字 13,如果和超过 100 则停止。

void setup() {
Serial.begin(9600);
int sum = 0;
for (int i = 1; i <= 20; i++) {
if (i == 13) {
Serial.println("Skipping unlucky 13!");
continue; // 跳到下一次迭代
}
sum += i;
Serial.print("Current number: ");
Serial.print(i);
Serial.print(", Current sum: ");
Serial.println(sum);
if (sum > 100) {
Serial.println("Sum exceeded 100. Breaking loop.");
break; // 完全退出 for 循环
}
}
Serial.print("Final Sum: ");
Serial.println(sum);
}
void loop() {}
  • 无限循环:忘记更新 while 循环条件中的变量将导致你的程序永远停滞。
  • 差一错误:在 for 循环中,使用 < 与 <= 可能会导致循环多运行或少运行一次。对于大小为 N 的数组,有效索引是 0 到 N-1,因此条件通常是 i < N。
  • 使用 delay() 造成的阻塞:虽然在这些简单示例中使用,但在循环中大量使用 delay() 会阻止你的 Arduino 执行其他任何操作。对于需要响应性的项目,请学习使用 millis() 函数以非阻塞方式管理时间。(更多内容请参阅“时间”章节)。