基于Arduino UNO实现串口指令点亮LED灯实验
摘要:本文介绍了一个基于Arduino的串口控制LED灯实验。通过电脑端串口监视器发送字符指令(a-e),可分别控制5个LED灯的开关状态。文章详细讲解了硬件接线方法(LED连接2-6号引脚)、程序流程图设计,以及核心代码实现(使用Serial.available()和Serial.read()函数)。同时提供了扩展实验(3秒自动熄灭功能)和常见问题解决方案(波特率设置、接线检查等)。该实验帮助初
【Arduino实战】串口“遥控”LED灯:从基础控制到自动延时熄灭(附流程图与源码)
一、 实验效果展示
在开始代码讲解之前,先看看我们今天的实验成果!
我们将通过电脑端的“串口监视器”发送指令,控制Arduino板子上连接的5盏LED灯。
- 输入
'a':点亮第1盏灯 - 输入
'b':点亮第2盏灯 - …以此类推

二、 硬件准备与接线
本次实验我们不再只控制一个灯,而是尝试控制一排“流水灯”(共5个),这对引脚的分配和接线提出了新要求。
- Arduino Uno 开发板 x 1
- LED发光二极管 x 5
- 220Ω 限流电阻 x 5
- 面包板 & 杜邦线 若干
1. 接线原理图
请严格按照下图连接电路。
注意:LED的长脚(正极)通过电阻连接到数字引脚 2, 3, 4, 5, 6,短脚(负极)全部连接到 GND。

三、 程序流程与逻辑设计
1. 逻辑流程图
程序的运行逻辑非常清晰:Arduino一直在“倾听”串口有没有数据发过来。
一旦检测到数据,就读取数据并进行字符匹配(Switch Case),根据不同的字母执行不同的点灯操作。

2. 核心代码实现
注意:本代码根据上述流程图编写,实现了通过串口字符
'a', 'b', 'c', 'd', 'e'分别控制5路LED的功能。
// 定义LED连接的引脚
// 根据接线图,LED分别接在 2, 3, 4, 5, 6 号引脚
void setup() {
// 1. 初始化串口通信,设置波特率为9600
Serial.begin(9600);
// 2. 循环初始化引脚模式
// 使用for循环,一次性将2到6号引脚全部设为输出模式
for (int pin = 2; pin <= 6; pin++) {
pinMode(pin, OUTPUT);
}
// 打印提示信息
Serial.println("System Ready!");
Serial.println("Please input 'a', 'b', 'c', 'd', 'e' to control LEDs.");
}
void loop() {
// 3. 检查串口是否有数据输入
if (Serial.available() > 0) {
// 4. 读取一个字节的数据
char inByte = Serial.read();
// 5. 判断读到的字符是什么 (对应流程图的Switch结构)
switch (inByte) {
case 'a':
digitalWrite(2, HIGH); // 点亮2号引脚LED
Serial.println("LED 1 is ON");
break;
case 'b':
digitalWrite(3, HIGH); // 点亮3号引脚LED
Serial.println("LED 2 is ON");
break;
case 'c':
digitalWrite(4, HIGH); // 点亮4号引脚LED
Serial.println("LED 3 is ON");
break;
case 'd':
digitalWrite(5, HIGH); // 点亮5号引脚LED
Serial.println("LED 4 is ON");
break;
case 'e':
digitalWrite(6, HIGH); // 点亮6号引脚LED
Serial.println("LED 5 is ON");
break;
default:
// 如果输入的不是a-e,可以在这里处理,或者什么都不做
break;
}
}
}
四、 串口通信函数详解
在上面的代码中,有三个“串口三剑客”函数是本次实验的核心,初学者必须掌握:
1. Serial.begin(speed)
- 功能:初始化串口通信,相当于“打开电话线”。
- 参数:
speed表示波特率(通信速度)。Arduino和电脑必须使用相同的波特率才能正常对话,常用的值为 9600。 - 位置:必须放在
setup()函数中。
2. Serial.available()
- 功能:询问Arduino“邮箱”里有没有新邮件(数据)。
- 返回值:返回缓冲区中等待读取的字节数。
- 用法:
if (Serial.available() > 0)意思是“如果收到了数据,就开始处理;没收到就继续等待”。
3. Serial.read()
- 功能:从“邮箱”里取出一封信(读取一个字节的数据)。
- 特性:读完一个少一个。比如电脑发送了
abc,第一次调用read()得到a,第二次调用得到b。 - 注意:它一次只读一个字符(char)。
五、 扩展实验:智能楼道灯(亮3秒后自动灭)
在实际应用中(比如声控灯),我们希望灯亮一会儿自己灭掉。
需求:收到指令后,LED点亮3秒,然后自动熄灭。
代码修改思路:在 case 语句中加入 delay(3000) 和 digitalWrite(LOW)。
// 核心修改部分
switch (inByte) {
case 'a':
Serial.println("Light ON for 3 seconds...");
digitalWrite(2, HIGH); // 点亮
delay(3000); // 延时3000毫秒(3秒)
digitalWrite(2, LOW); // 熄灭
Serial.println("Light OFF");
break;
// 其他case同理修改...
}
注:使用 delay() 会阻塞程序运行,在这3秒内Arduino无法接收新的指令。
六、 常见问题与解决方法 (Troubleshooting)
如果在实验中遇到问题,请按以下步骤排查:
Q1: 发送了字符,但是灯没有任何反应?
- 检查波特率:看串口监视器右下角的数值是否为 9600?必须与代码中的
Serial.begin(9600)保持一致。 - 检查接线:LED是否接反?(长脚接正,短脚接GND)。电阻是否插稳?
- 检查RX灯:当你点击发送时,Arduino板上的
RX指示灯应该会闪烁一下。
Q2: 串口监视器显示乱码?
- 原因:波特率不匹配。
- 解决:将串口监视器的波特率调整为 9600 baud。
Q3: 为什么我发一个 ‘a’,灯闪烁了两次或者代码运行了两次?
- 原因:串口监视器的“结束符”设置问题。
- 解决:在串口监视器底部的下拉菜单中,选择 “没有结束符” (No line ending)。如果选择了“换行符”,电脑实际上发送的是
'a'+\n,程序会读取两次。
结语
通过本次实验,我们掌握了 Switch-Case 流程控制和 串口通信 的基本用法。这是实现“人机交互”的重要一步,以后我们就可以用电脑、手机蓝牙来控制各种设备了!
更多推荐



所有评论(0)