# 2.3.2 语音控制开灯

## 2.3.2.1 简介

使用小智语音模块接收到的语音指令控制UNO板连接的LED灯，我们可以将LED灯设置成卧室，厨房，阳台等。用户只需说出“打开客厅灯”或“关闭客厅灯”等指令，系统便能快速响应，实现精准的本地化控制。该方案不仅提供了便捷的交互体验，也为后续集成更多智能设备（如风扇、窗户）奠定了坚实基础，是迈向全屋智能的低成本入门实践。

## 2.3.2.2 控制指令表

| 命令码 |          命令词          | 命令回复 |
| :----: | :----------------------: | :------: |
|   3    | 开白灯，开灯，打开客厅灯 |  已打开  |
|   4    | 关白灯，关灯，关闭客厅灯 |  已关闭  |

## 2.3.2.3 接线图

![a6](./media/a6.png)

## 2.3.2.4 代码

```c
// 引入SoftwareSerial库，用于创建软串口
#include <SoftwareSerial.h>

// 创建软串口对象：RX引脚为A5，TX引脚为A4
// 用于连接语音识别模块
SoftwareSerial mySerial(A5, A4);
// 定义LED连接的引脚号（数字引脚3）
int ledPin = 3;

// 定义变量用于存储从语音模块接收到的控制码
volatile int Voice_Control = 0;  // 初始化为0，确保首次判断时不触发任何指令

void setup() {
  // 初始化硬件串口，用于调试输出，波特率9600
  Serial.begin(9600);
  // 初始化软串口，用于连接语音模块，波特率9600
  mySerial.begin(9600);
  // 将LED引脚设置为输出模式
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // 检查软串口是否有来自语音模块的数据可读
  if (mySerial.available()) {
    // 从软串口读取一个字节的数据
    Voice_Control = mySerial.read();
    // 将接收到的数据通过硬件串口输出到串口监视器，便于调试
    Serial.println(Voice_Control);
  }
  // 根据接收到的指令值执行相应操作
  if (Voice_Control == 3) {
    // 当接收到值3时，点亮LED（高电平）
    digitalWrite(ledPin, HIGH);

  } else if (Voice_Control == 4) {
    // 当接收到值4时，熄灭LED（低电平）
    digitalWrite(ledPin, LOW);
  }
  // 清除指令，避免重复执行
  Voice_Control = 0;
}
```



## 2.3.2.5 代码说明

① 导入模拟串口库文件；创建模拟串口对象并设置模拟串口引脚为：RX：A5，TX：A4  ；定义LED控制引脚为D3 ；创建一个`int`类型变量名称为`Voice_Control`用于存放语音模块发送过来的控制指令

```c
// 引入SoftwareSerial库，用于创建软串口
#include <SoftwareSerial.h>

// 创建软串口对象：RX引脚为A5，TX引脚为A4
// 用于连接语音识别模块
SoftwareSerial mySerial(A5, A4);
// 定义LED连接的引脚号（数字引脚3）
int ledPin = 3;

// 定义变量用于存储从语音模块接收到的控制码
volatile int Voice_Control = 0;  // 初始化为0，确保首次判断时不触发任何指令
```

② 设置串口波特率为`9600` ； 设置模拟串口波特率为`9600` ；将LED控制引脚设置为输出模式

```c
  // 初始化硬件串口，用于调试输出，波特率9600
  Serial.begin(9600);
  // 初始化软串口，用于连接语音模块，波特率9600
  mySerial.begin(9600);
  // 将LED引脚设置为输出模式
  pinMode(ledPin, OUTPUT);
```

③ 使用`if`判断模拟串口中是否有数据发送过来 ；如果有数据发送过来就读取数据并将数据赋值给变量`Voice_Control` ；使用串口换行打印变量`Voice_Control`的值（只能使用串口打印模拟串口不行）方便观察接收到的指令值

```c
  // 检查软串口是否有来自语音模块的数据可读
  if (mySerial.available()) {
    // 从软串口读取一个字节的数据
    Voice_Control = mySerial.read();
    // 将接收到的数据通过硬件串口输出到串口监视器，便于调试
    Serial.println(Voice_Control);
  }
```

③ 对变量`Voice_Control`进行判断（从控制指令表中可知指令码）我想要语音喊开灯与关灯控制led灯的亮灭，对照控制指令表，开灯的指令码为：`3`，关灯的指令码为：`4`，所以我们就使用判断模块进行判断如果变量`Voice_Control`等于3则控制led灯亮，否则如果`Voice_Control`等于4则led灯熄灭 ； 最后清除变量`Voice_Control`的值，避免重复执行。

```c
  // 根据接收到的指令值执行相应操作
  if (Voice_Control == 3) {
    // 当接收到值3时，点亮LED（高电平）
    digitalWrite(ledPin, HIGH);

  } else if (Voice_Control == 4) {
    // 当接收到值4时，熄灭LED（低电平）
    digitalWrite(ledPin, LOW);
  }
  // 清除指令，避免重复执行
  Voice_Control = 0;
```



## 2.3.2.6 代码结果

上传代码成功后，使用唤醒词“小智小智”唤醒小智语音模块，他会回答你“我在”然后你就可以使用命令词进行控制它了，如当我们教程是开灯教程，我们就可以这样.

**开灯示例：** 你：“小智小智” ，小智：“我在”，你：“开灯” 或 “开白灯” 或 “打开客厅灯”，小智：“已打开”

**关灯示例：** 你：“小智小智” ，小智：“我在”，你：“关灯” 或 “关白灯” 或 “关闭客厅灯”，小智：“已关闭”



