1.前言
你是否因为大一迷惘而焦虑??
这个实验教程献给所有大一想努力的新手
2.欣赏成果
Arduino 多个LED闪烁实验成果
3.安装对应软件
首先先安装对应软件Arduino
网址arduino.cc/en/software
4.学习软件的使用
安装结束,我们进入首页选择我们对应的开发板Arduino UNO

选择之后就会将UNO开发板作为默认**(UNO开发板适合初学者简单易上手)

并将开发板连接到电脑**(注意:后面一定带有后缀,我前面买的盗版无法识别就没有后缀)**
如果没有出现开发板(com)请检查链接器是否连接好或者开发板是否接触不良
5.准备道具
准备面包板
UNO开发板
4个220v电阻
4个LED灯

LED灯长的一端为正极,短的一端为负极(如图)电阻在家用电(220V)用220欧姆,接着用杜邦线连接到开发板的8,9,10,11GND接口(如图)
6.代码
void setup()
{
for(int i=8;i<=11;i++)
{
pinMode(i,OUTPUT);
}
}
void loop()
{
for(int x=8;x<=11;x++)
{
digitalWrite(x,HIGH);
delay(500);
digitalWrite(x,LOW);
delay(500);
}
}
代码解释
delay(1000)是延迟1000毫秒(1秒)
digitalWrite(2, LOW(HIGH))是将数字引脚写HIGH(高电平)或LOW(低电平),2是开发板的几接口
pinMode(2, OUTPUT)是通过pinMode()函数,你可以将Arduino的引脚配置为以下三种模式:
输出(OUTPUT)模式
输入(INPUT)模式
输入上拉(INPUT_PULLUP)模式
接下验证 ,左上角的勾是验证符号

查看是否验证成功,然后上传

上传成功就可以欣赏到开头的结果了
7.心得
我认为这是个新的开始我也遇到了很多问题(见下面),但是当我成功做出来了后感到非常自豪,所以我认为在这个时代人类要不断走出自己的舒适圈,才能前进。最后点一下赞,一起加油吧,,我是FOX,励志做一个博学的萌新。
8.花絮
在看到代码的时候,我就已经在想代码有什么可以修改的了,于是这些问题就诞生了
我可不可以更简单一点??
于是我一开始直接定义起始引脚和终止引脚,用常量代替硬编码,让循环更简单方便
// 1. 定义宏常量,替代魔法数字
#define LED_START_PIN 8 // LED起始引脚
#define LED_END_PIN 11 // LED结束引脚
#define DELAY_TIME 500 // 延时时间(毫秒)
void setup() {
// 2. 用常量替代硬编码,循环逻辑更清晰
for (int pin = LED_START_PIN; pin <= LED_END_PIN; pin++) {
pinMode(pin, OUTPUT);
}
}
void loop() {
// 3. 遍历LED引脚,实现依次亮灭
for (int pin = LED_START_PIN; pin <= LED_END_PIN; pin++) {
digitalWrite(pin, HIGH);
delay(DELAY_TIME);
digitalWrite(pin, LOW);
// 4. 移除多余延时,避免非必要等待(可选优化,保持原功能则保留)
// 若需和原代码完全一致,保留下方delay即可
delay(DELAY_TIME);
}
}
核心优化核心是消除魔法数字、提升语义化、封装复用逻辑,让代码更易读、易维护、易扩展;
基础优化(宏常量 + 语义化变量)已能满足大部分场景,进阶优化(封装函数)适合后续功能扩展;
优化后的代码不仅保留了原有的 LED 依次亮灭功能,还降低了后期修改和维护的成本,更符合工程化编程规范。
还有面包板为什么中间不连电??
因为一些面包板中间并不会通电,注意区分中间线路是否断裂

代码报错应该怎么检查??
针对性排查方法:① 从代码开头逐行回溯,优先核查宏定义、硬件初始化函数(如 setup ())、变量类型声明是否与后续逻辑匹配;② 注释掉后续可疑代码,仅运行排头初始化代码,通过串口打印或硬件指示灯验证初始化是否生效;③ 检查库引用、引脚映射是否存在冲突(如重复定义引脚),这类排头问题常导致后续代码隐性失效。
因为代码执行具有「顺序性」和「关联性」,排头代码(如宏定义、引脚初始化、变量声明、库引用)往往是后续代码的执行基础,若排头存在疏漏,错误可能不会在本行暴露,反而在后续调用时触发异常。例如:宏定义的引脚号写错,后续引脚控制代码本身无语法错误,但实际硬件无法响应;引脚初始化时遗漏某路输出配置,后续数字写入代码也会失效。
接下来,我们来调试for()循环
void setup()
{
// for循环开始
for(int i=8;i<=11;i++)
{
pinMode(i,OUTPUT); // 循环体:将引脚i设置为输出模式(用于控制LED)
}
}
逐部分拆解:
初始化表达式:int i=8
定义一个临时循环变量i,初始值设为 8(对应第一个 LED 引脚 8),这个操作只执行 1 次。
条件判断表达式:i<=11
判断变量i是否小于等于 11(对应最后一个 LED 引脚 11),满足就执行循环体,不满足就退出循环。
更新表达式:i++
等价于i = i + 1,每次循环体执行完后,让i的值加 1,切换到下一个引脚。
循环体:pinMode(i,OUTPUT)
把当前i对应的引脚设置为输出模式(只有输出模式才能通过digitalWrite控制 LED 亮灭)。
这个 for 循环的运行流程(共执行 4 次):
初始化:i=8 → 判断8<=11(满足)→ 执行pinMode(8,OUTPUT)(引脚 8 设为输出)→ i++(i 变成 9);
判断9<=11(满足)→ 执行pinMode(9,OUTPUT)(引脚 9 设为输出)→ i++(i 变成 10);
判断10<=11(满足)→ 执行pinMode(10,OUTPUT)(引脚 10 设为输出)→ i++(i 变成 11);
判断11<=11(满足)→ 执行pinMode(11,OUTPUT)(引脚 11 设为输出)→ i++(i 变成 12);
判断12<=11(不满足)→ 退出 for 循环,setup()函数执行完毕。
void loop()
{
// for循环开始
for(int x=8;x<=11;x++)
{
digitalWrite(x,HIGH); // 让引脚x对应的LED点亮(高电平)
delay(500); // 保持点亮500毫秒(0.5秒)
digitalWrite(x,LOW); // 让引脚x对应的LED熄灭(低电平)
delay(500); // 保持熄灭500毫秒(0.5秒)
}
}
这里的 for 循环结构和setup()中一致,只是循环变量叫x(名字可自定义,和i功能一样),循环体是控制 LED 亮灭的逻辑。
这个 for 循环的运行流程(共执行 4 次,执行完后loop()会重复执行,所以 LED 会一直循环亮灭):
初始化:x=8 → 判断8<=11(满足)→ 执行digitalWrite(8,HIGH)(引脚 8 LED 亮)→ 延时 500ms → digitalWrite(8,LOW)(引脚 8 LED 灭)→ 延时 500ms → x++(x 变成 9);
判断9<=11(满足)→ 执行digitalWrite(9,HIGH)(引脚 9 LED 亮)→ 延时 500ms → digitalWrite(9,LOW)(引脚 9 LED 灭)→ 延时 500ms → x++(x 变成 10);
判断10<=11(满足)→ 执行digitalWrite(10,HIGH)(引脚 10 LED 亮)→ 延时 500ms → digitalWrite(10,LOW)(引脚 10 LED 灭)→ 延时 500ms → x++(x 变成 11);
判断11<=11(满足)→ 执行digitalWrite(11,HIGH)(引脚 11 LED 亮)→ 延时 500ms → digitalWrite(11,LOW)(引脚 11 LED 灭)→ 延时 500ms → x++(x 变成 12);
判断12<=11(不满足)→ 退出 for 循环;
总结
因为loop()函数会无限重复执行,所以会再次进入这个 for 循环,重新从 x=8 开始,实现 LED 循环依次亮灭。
for 循环的核心是「初始化→判断→执行循环体→更新变量」的循环流程,专门用于固定次数的重复操作;
你代码中的第一个 for 循环(setup () 内)仅执行一次,批量初始化引脚,替代了 4 次重复的 pinMode 语句;
第二个 for 循环(loop () 内)会无限重复,批量控制 LED 亮灭,实现了 4 个 LED 的依次循环闪烁效果,简化了重复的 digitalWrite 和 delay 语句。
1307

被折叠的 条评论
为什么被折叠?



