Arduino - 循环
Arduino - 控制结构:循环
Section titled “Arduino - 控制结构:循环”在编程中,循环是一种控制结构,允许你重复执行一段代码块。这对于多次读取传感器、闪烁 LED 或处理列表中的项等任务至关重要。Arduino 使用 C++,提供了几种强大的循环类型。
for 循环
Section titled “for 循环”当你知道要执行代码块的次数时,使用 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 循环
Section titled “while 循环”一个 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 循环
Section titled “do-while 循环”一个 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++:基于范围的 for 循环
Section titled “现代 C++:基于范围的 for 循环”现代 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()函数以非阻塞方式管理时间。(更多内容请参阅“时间”章节)。