Arduino 之 for 循环学习笔记教程

一、前言

在 Arduino 编程里,for 循环是让程序实现重复操作的得力工具,就像工厂里不断重复加工零件的机器,能帮我们高效完成有规律的任务,比如让 LED 渐变、按顺序输出数字等。接下来咱们一步步搞懂它!

二、for 循环基本结构

(一)语法格式

for (表达式1; 表达式2; 表达式3) {
  循环体; // 要重复执行的代码
}
  • 表达式 1:一般用来创建循环变量,还会给它设置初始值 ,而且在整个循环里只执行一次,就像给跑步比赛的选手确定起始位置。比如 for (int i = 1; ... 里,int i = 1 就是创建了一个整型变量 i ,并把它初始化为 1 。
  • 表达式 2:是循环的条件判断 ,每次执行循环体之前都会检查这个条件。要是条件成立(结果为真 ),就执行循环体;要是不成立(结果为假 ),就跳出循环。好比跑步比赛里的终点线,到了就不跑啦,像 i <= 5 就是判断 i 是不是小于等于 5 。
  • 表达式 3:在每次循环体执行完后运行 ,通常用来改变循环变量的值,比如让变量增加或者减少,像 i++ 就是让 i 的值每次加 1 ,把它想象成跑步时每跑一步就前进一段距离。
  • 循环体:大括号 {} 里的代码,会跟着循环条件的判断结果重复执行,这就是咱们要让电脑重复做的事儿,比如串口打印数字、控制 LED 亮度变化。

(二)执行流程

  1. 先执行 表达式 1,完成循环变量的初始化。
  2. 接着判断 表达式 2
    • 要是条件成立(为真 ),就执行 循环体 里的代码,然后执行 表达式 3 改变循环变量,之后回到步骤 2 再次判断 表达式 2
    • 要是条件不成立(为假 ),直接跳出 for 循环,接着执行循环后面的代码。

举个简单例子感受下:

void setup() {
  Serial.begin(9600);
  // 表达式1:创建变量i并初始化为1;表达式2:i <= 5时继续循环;表达式3:i每次加1
  for (int i = 1; i <= 5; i++) { 
    Serial.println(i); // 循环体:串口输出i的值,会输出1、2、3、4、5
  }
}
void loop() {
  // 这里暂时没内容
}

执行流程:

  • 第一步,int i = 1 初始化变量 i 为 1 。
  • 第二步,判断 i <= 5 ,1 小于 5 ,条件成立,执行 Serial.println(i) ,串口输出 1 ;然后执行 i++i 变成 2 。
  • 第三步,又判断 i <= 5 ,2 小于 5 ,执行 Serial.println(i) 输出 2 ,再 i++ 变成 3 。
  • 就这样一直重复,直到 i 变成 6 ,判断 i <= 5 不成立,循环结束。

三、for 循环在 Arduino 里的常用场景

(一)控制 LED 渐变(结合 analogWrite )

想让 LED 从暗慢慢变亮,再从亮慢慢变暗,用 for 循环就很方便,代码如下:

const int ledPin = 3; // 定义LED连接的引脚

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

void loop() {
  // 让LED慢慢变亮的循环
  // i从0开始,到255结束,每次加1,因为analogWrite的范围是0-255
  for (int i = 0; i <= 255; i++) { 
    analogWrite(ledPin, i); // 控制LED亮度,i越大越亮
    delay(20); // 延时20毫秒,让变化能看清
  }

  // 让LED慢慢变暗的循环
  // i从255开始,到0结束,每次减1
  for (int i = 255; i >= 0; i--) { 
    analogWrite(ledPin, i); // 控制LED亮度,i越小越暗
    delay(20); // 延时20毫秒
  }
}

这里有两个 for 循环:

  • 第一个循环,i 从 0 增加到 255 ,analogWrite 输出的数值越来越大,LED 就慢慢变亮;delay(20) 是为了让我们能看清亮度变化的过程,不然变化太快肉眼看不清。
  • 第二个循环,i 从 255 减少到 0 ,analogWrite 输出的数值越来越小,LED 就慢慢变暗,同样靠 delay(20) 控制节奏。然后 loop 函数会不断重复这两个循环,LED 就一直渐变啦。

(二)串口输出有规律的数字

1. 递增输出(从 3 到 8 ,空格分隔 )

void setup() {
  Serial.begin(9600);
  // i从3开始,到8结束,每次加1
  for (int i = 3; i <= 8; i++) { 
    Serial.print(i); // 串口输出i的值,不换行
    Serial.print(" "); // 输出空格,让数字之间有间隔
  }
}
void loop() {
  // 无内容
}

在这个 for 循环里:

  • 表达式1int i = 3 ,初始化变量 i 为 3 。
  • 表达式2i <= 8 ,只要 i 小于等于 8 就继续循环。
  • 表达式3i++ ,每次循环后 i 加 1 。
  • 循环体里用 Serial.print 输出 i 的值,因为 Serial.print 不会自动换行,所以数字会在同一行显示,再用 Serial.print(" ") 输出空格分隔开,最后串口会显示 3 4 5 6 7 8

2. 递减输出(从 10 到 1 )

void setup() {
  Serial.begin(9600);
  // i从10开始,到1结束,每次减1
  for (int i = 10; i >= 1; i--) { 
    Serial.println(i); // 串口输出i的值,每次换行,会输出10、9、…、1
  }
}
void loop() {
  // 无内容
}

这里:

  • 表达式1 初始化 i 为 10 。
  • 表达式2i >= 1 ,判断 i 是不是大于等于 1 。
  • 表达式3i-- ,每次循环后 i 减 1 。
  • 循环体用 Serial.println 输出 i 的值,每次输出会自动换行,所以串口会依次显示 10 、9 、8 一直到 1 。

(三)配合传感器数据处理(以光照传感器为例 )

当我们用光照传感器获取数据,并且想多次读取或者做一些有规律的处理时,for 循环也能派上用场,不过下面这个例子是结合之前的知识,持续读取并处理数据,其实也可以在循环里做多次读取(比如为了取平均值减少误差 ),简单示例:

const int guangPin = A0; // 光照传感器引脚
const int ledPin = 3;   // LED引脚
int val;

void setup() {
  Serial.begin(9600);
  pinMode(guangPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // 这里可以加for循环,比如多次读取传感器数据取平均
  int sum = 0;
  // 循环5次读取传感器数据
  for (int i = 0; i < 5; i++) { 
    val = analogRead(guangPin); // 读取光照传感器值(0-1023)
    sum += val; // 把每次读取的值累加
    delay(10); // 稍作延时
  }
  val = sum / 5; // 计算平均值
  val = map(val, 0, 1023, 0, 255); // 映射到0-255
  Serial.println(val); 
  analogWrite(ledPin, val); // 控制LED亮度
  delay(100); 
}

在这个例子里,for 循环用来多次读取光照传感器的数据,把 5 次的结果累加后求平均值,这样能让获取的数据更稳定,减少偶然因素的影响,然后再把处理后的数据用来控制 LED 亮度,让控制更精准。这就是 for 循环在传感器数据处理里的一个小应用,当然实际项目里还能有更多花样。

四、总结

  • for 循环的结构是 for (表达式1; 表达式2; 表达式3) { 循环体; } ,按照“初始化 - 判断条件 - 执行循环体 - 更新变量”的流程重复执行。
  • 在 Arduino 里,它能帮我们做很多事,像控制 LED 渐变实现炫酷效果,有规律地输出数字方便调试,还能配合传感器多次读取数据优化结果。
  • 关键是要理解三个表达式和循环体的作用,然后根据实际需求去调整,比如改变循环变量的初始值、条件判断规则、变量更新方式,还有循环体里执行的具体操作。多动手写代码试试不同的循环逻辑,就能越来越熟练啦,比如自己改改循环的次数、变量的变化步长,看看程序运行结果有啥不一样,这样学习效果会更好!

0 条评论

目前还没有评论...