【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: 发送了字符,但是灯没有任何反应?

  1. 检查波特率:看串口监视器右下角的数值是否为 9600?必须与代码中的 Serial.begin(9600) 保持一致。
  2. 检查接线:LED是否接反?(长脚接正,短脚接GND)。电阻是否插稳?
  3. 检查RX灯:当你点击发送时,Arduino板上的 RX 指示灯应该会闪烁一下。

Q2: 串口监视器显示乱码?

  • 原因:波特率不匹配。
  • 解决:将串口监视器的波特率调整为 9600 baud

Q3: 为什么我发一个 ‘a’,灯闪烁了两次或者代码运行了两次?

  • 原因:串口监视器的“结束符”设置问题。
  • 解决:在串口监视器底部的下拉菜单中,选择 “没有结束符” (No line ending)。如果选择了“换行符”,电脑实际上发送的是 'a' + \n,程序会读取两次。

结语

通过本次实验,我们掌握了 Switch-Case 流程控制和 串口通信 的基本用法。这是实现“人机交互”的重要一步,以后我们就可以用电脑、手机蓝牙来控制各种设备了!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐