Arduino 中 for 循环超详细教程(基于代码示例)

一、写在前面

如果你刚开始接触 Arduino 编程,for 循环可是个超好用的工具!它能帮你重复执行一段代码,让程序更聪明、更高效。今天咱们就结合实际代码,把 for 循环彻底搞明白 ,学会用它来玩转 Arduino !

二、先看代码长啥样

先瞧瞧这段会用到 for 循环的 Arduino 代码:

void setup() {
  // 初始化串口通信,设置波特率 9600,这样就能在串口监视器看输出啦
  Serial.begin(9600);  
  // for 循环来啦!下面详细讲每部分啥意思
  for (int i = 1; i < 5; i++) { 
    // 把变量 i 的值打印到串口监视器,每次循环都打印
    Serial.println(i);  
  }
  // 打印分隔线,方便区分循环的输出
  Serial.println("-----------------------");  
}

void loop() {
  // 这里暂时空着,循环主要在 setup 里演示
}

上传代码到 Arduino 后,打开串口监视器(Arduino IDE 里点“工具”→“串口监视器”),你会看到输出:

1
2
3
4
-----------------------

是不是很神奇?这就是 for 循环的功劳,接下来一步步拆解它!

三、for 循环的“骨架”解析

for 循环长这样:

for (初始化; 条件判断; 更新操作) {
  // 循环体:要重复执行的代码
}

对应咱们代码里的 for (int i = 1; i < 5; i++) ,挨个看:

1. 初始化(int i = 1

  • 作用:创建一个循环专用的变量(这里叫 i ),并给它一个初始值。
  • 咱们例子里:创建了整数变量 i ,让它从 1 开始。可以把 i 想成“计数器”,记录循环执行到第几次啦。

2. 条件判断(i < 5

  • 作用:每次执行循环体前,先检查这个条件。条件成立(结果为 true ),就执行循环体;不成立(结果为 false ),就跳出循环,不再执行啦。
  • 咱们例子里:判断 i 是否小于 5 。第一次循环时 i=11<5 成立,执行循环体;当 i 变成 5 时,5<5 不成立,循环就结束咯。

3. 更新操作(i++

  • 作用:每次循环体执行完,会自动执行这里的操作,通常用来改变计数器 i 的值。
  • 咱们例子里:i++ 是“自增”的意思,就是每次循环后,i 的值加 1 (比如第一次循环后 i12 ,第二次后变 3 ,依此类推 )。

4. 循环体(Serial.println(i);

  • 作用:放在 {} 里的代码,会被重复执行。
  • 咱们例子里:每次循环都执行 Serial.println(i); ,把当前 i 的值打印到串口监视器,所以能看到 1234 依次输出。

四、for 循环的执行流程(超关键!)

结合咱们的代码,走一遍流程:

  1. 第一步:初始化
    执行 int i = 1 ,创建变量 i ,赋值为 1
  2. 第二步:条件判断
    检查 i < 51 < 5 成立,进入循环体。
  3. 第三步:执行循环体
    执行 Serial.println(i); ,串口打印 1
  4. 第四步:更新操作
    执行 i++i 变成 2
  5. 回到第二步,重复判断→执行→更新
    • 第二次:i=22 < 5 成立 → 打印 2i3
    • 第三次:i=33 < 5 成立 → 打印 3i4
    • 第四次:i=44 < 5 成立 → 打印 4i5
    • 第五次:i=5 ,检查 5 < 5 ?不成立!跳出循环,执行后面的 Serial.println("-----------------------");

这样就清楚为啥串口会依次输出 1234 啦,就是按照“初始化→判断→执行→更新”的流程,重复跑了 4 次循环体!

五、灵活改代码,玩转 for 循环

明白原理后,咱们可以改改代码,试试不同效果,彻底掌握它!

1. 改变循环的“起点”(初始化值)

int i = 1 改成 int i = 0 ,代码变成:

void setup() {
  Serial.begin(9600);
  for (int i = 0; i < 5; i++) {
    Serial.println(i);
  }
  Serial.println("-----------------------");
}

void loop() {
}

串口输出会变成:

0
1
2
3
4
-----------------------

因为初始化 i0 开始,条件 i < 5 ,所以循环会执行 i=01234 ,共 5 次!

2. 改变循环的“终点”(条件判断)

i < 5 改成 i <= 5 ,代码:

void setup() {
  Serial.begin(9600);
  for (int i = 1; i <= 5; i++) {
    Serial.println(i);
  }
  Serial.println("-----------------------");
}

void loop() {
}

串口输出:

1
2
3
4
5
-----------------------

因为条件变成 i 小于等于 5 ,所以 i=5 时条件还成立,会多执行一次循环体,打印出 5

3. 改变“更新操作”(不只是 i++

i++ 改成 i += 2 (每次加 2 ),代码:

void setup() {
  Serial.begin(9600);
  for (int i = 1; i < 10; i += 2) {
    Serial.println(i);
  }
  Serial.println("-----------------------");
}

void loop() {
}

串口输出:

1
3
5
7
9
-----------------------

因为每次循环 i 增加 2 ,所以会打印 13579 ,直到 i=11 时(下次更新后),11 < 10 不成立,循环结束。这说明更新操作可以灵活改,不一定是 i++ ,只要能改变计数器的值就行!

4. 在循环体里做更多事

循环体里不止能打印,还能控制硬件(比如让 LED 闪烁、控制电机转 )。比如结合 LED ,让 LED 随着循环次数闪烁(假设 LED 接在引脚 13 ):

void setup() {
  Serial.begin(9600);
  // 设置引脚 13 为输出模式,控制 LED
  pinMode(13, OUTPUT);  
  for (int i = 1; i <= 3; i++) {
    // 点亮 LED
    digitalWrite(13, HIGH);  
    Serial.println("LED 亮");
    // 延迟 500 毫秒
    delay(500);  
    // 熄灭 LED
    digitalWrite(13, LOW);  
    Serial.println("LED 灭");
    delay(500);
  }
  Serial.println("-----------------------");
}

void loop() {
}

上传代码后,你会看到 LED 闪烁 3 次,同时串口打印:

LED 亮
LED 灭
LED 亮
LED 灭
LED 亮
LED 灭
-----------------------

这就是把硬件控制放进循环体,让代码重复执行“点亮→熄灭”的操作,超有趣!

六、常见问题 & 避坑指南

1. 忘记更新变量,导致“死循环”!

如果把 for (int i = 1; i < 5; i++) 里的 i++ 去掉,变成:

for (int i = 1; i < 5; ) {
  Serial.println(i);
}

这会发生啥?
变量 i 一直是 1 ,条件 i < 5 永远成立,循环体就会一直执行,串口疯狂打印 1 ,Arduino 也会“卡死”(因为程序一直在循环里出不来 )。所以一定要记得写更新操作,让条件能变成不成立,跳出循环!

2. 变量作用域:for 里的 i ,外面能用吗?

看代码:

void setup() {
  Serial.begin(9600);
  for (int i = 1; i < 5; i++) {
    Serial.println(i);
  }
  // 这里想打印 i 的值,能成功吗?
  Serial.println(i);  
  Serial.println("-----------------------");
}

编译会报错!因为 int i = 1 是在 for 循环里定义的,它的“作用域”只在循环体内部。出了循环,变量 i 就不存在啦。如果想在循环外用到类似的计数器,可以在循环外面定义变量:

void setup() {
  Serial.begin(9600);
  // 把 i 定义在循环外面
  int i;  
  for (i = 1; i < 5; i++) {
    Serial.println(i);
  }
  // 现在能打印啦,输出 5(因为循环结束后 i 变成 5 了 )
  Serial.println(i);  
  Serial.println("-----------------------");
}

这样就能在循环外访问 i 的值啦,不过要注意循环结束后 i 的值是多少哦(例子里循环结束后 i5 ,因为最后一次更新后 i 变成 5 ,条件 i < 5 不成立 )。

3. 搞混 i++++i

在咱们的例子里,i++++i 效果差不多(因为是单独的更新操作 )。但严格来说:

  • i++ :先使用 i 的当前值,再自增。
  • ++i :先自增 i ,再使用新值。

不过在 for 循环的更新操作里,i++++i 通常结果一样(因为更新操作是单独执行的,不影响循环体里对 i 的使用 )。但如果在循环体里同时用 i 的值,就有区别啦,比如:

void setup() {
  Serial.begin(9600);
  int i = 1;
  // 先打印 i=1,再自增 i 变成 2
  Serial.println(i++);  
  // 先自增 i 变成 3,再打印 3
  Serial.println(++i);  
}

串口输出:

1
3

不过在 for 循环的更新部分,用 i++ 就够啦,简单又常用~

七、总结一下

for 循环的核心就是“初始化→判断→执行→更新”的流程,能帮你重复执行代码,让程序更简洁高效。记住这几点:

  • 三个部分(初始化、条件、更新)要写全,别漏更新操作,不然会“死循环”。
  • 循环体里可以放各种代码,控制硬件、打印数据都行。
  • 多改改参数(起点、终点、更新方式),试试不同效果,很快就能熟练掌握!

现在你可以自己动手,用 for 循环做更多好玩的事啦——比如让舵机转不同角度、让传感器数据采集重复执行、做个流水灯效果 。快打开 Arduino IDE ,开始你的循环之旅吧,有问题评论区留言,咱们一起解决!

0 条评论

目前还没有评论...