### 第16课 语音控制门窗系统

#### 16.1 项目介绍

语音控制门窗是一种基于智能语音识别技术的现代化家居控制系统，通过语音指令实现对门窗的开启、关闭等操作，为用户提供更便捷、智能的生活体验。

语音控制门窗系统代表了智能家居发展的重要方向，通过将传统的门窗控制与先进的语音识别技术相结合，不仅提升了用户的生活便利性，还为实现真正的智能家居生态奠定了基础。随着人工智能技术的不断进步，语音控制门窗将在安全性、智能化程度和用户体验方面持续优化，成为未来智能建筑的标准配置。

#### 16.2 实验组件

|![](media/esp32.png)|![](media/servo.png)|![](media/SU-03T-1.png)|
|-|-|-|
|ESP32 Plus主板 *1|180度舵机 *2|智能语音模块 *1|
|![](media/4p.png) |![](media/usb.png)|  |
|4P线 *1|USB线 *1|   |

#### 16.3 模块接线图

智能语音模块，窗户舵机和门舵机的控制引脚：

|窗户舵机（橙黄色线引脚）|io5|
|-|-|
|门舵机（橙黄色线引脚）|io13|
|智能语音模块（TXD引脚）|io16|
|智能语音模块（RXD引脚）|io27|

⚠️ **特别注意：智能家居已经组装好了，这里不需要把智能语音模块和舵机拆下来又重新组装和接线，这里再次提供接线图，是为了方便您编写代码！**

![](media/pjt21.png)

#### 16.4 代码流程图

![](media/project16.png)

#### 16.5 实验代码 

使用智能语音模块控制智能家居的门、窗开与关。

```c++
/*
 * 项目: voice_control_door_window
 * 描述: 智能语音模块控制2个舵机来模拟语音控制门窗系统
 * 编译IDE：ARDUINO IDE
 * 作者: http//www.keyes-robot.com
*/

//导入相关库文件
#include <SoftwareSerial.h>
#include <ESP32Servo.h>

// 定义引脚常量
const int RX_PIN = 27;    // 引脚 GPIO27 为 RX
const int TX_PIN = 16;    // 引脚 GPIO16 为 TX
const int servoPin1 = 5;  // 定义窗户上舵机引脚 GPIO5
const int servoPin2 = 13; // 定义门上舵机引脚 GPIO13
Servo windowServo;  // 窗户舵机
Servo doorServo;    // 门舵机

SoftwareSerial mySerial(RX_PIN, TX_PIN); // 定义软件串口引脚（RX, TX）

// 舵机角度参数
int windowOpenAngle = 100;   // 窗户打开角度
int windowCloseAngle = 0;   // 窗户关闭角度
int doorOpenAngle = 175;     // 门打开角度
int doorCloseAngle = 0;     // 门关闭角度

// 状态变量
bool windowState = false;   // 窗户状态：false-关闭, true-打开
bool doorState = false;     // 门状态：false-关闭, true-打开

void setup() {
  // 初始化硬件串口（用于调试）
  Serial.begin(9600);  
  // 初始化软件串口（连接语音模块）
  mySerial.begin(9600);
  
  // 初始化舵机
  windowServo.attach(servoPin1);
  doorServo.attach(servoPin2);
  
  // 初始位置：关闭状态
  windowServo.write(windowCloseAngle);
  doorServo.write(doorCloseAngle);
  
  Serial.println("智能语音门窗控制系统已启动");
  Serial.println("等待语音指令...");
  Serial.println("可用指令：开窗户、关窗户、开门、关门");
}

void loop() {
  // 检查语音模块是否有数据
  if (mySerial.available() > 0) {
    int yuyin = mySerial.read();
    
    Serial.print("收到语音指令: ");
    Serial.println(yuyin);
    
    // 处理语音指令
    processVoiceCommand(yuyin);
  }
  
  delay(100); // 短暂延迟，减少CPU占用
}

// 处理语音指令函数
void processVoiceCommand(int yuyin) {
  if (yuyin == 57) {
    openWindow();
  } 
  else if (yuyin == 58) {
    closeWindow();
  } 
  else if (yuyin == 59) {
    openDoor();
  } 
  else if (yuyin == 60) {
    closeDoor();
  }
  else {
    Serial.println("未知指令，请重试");
  }
}

// 打开窗户
void openWindow() {
  if (!windowState) {
    windowServo.write(windowOpenAngle);
    delay(1000);
    windowState = true;
    Serial.println("窗户已打开");
  } else {
    Serial.println("窗户已经是打开状态");
  }
}

// 关闭窗户
void closeWindow() {
  if (windowState) {
    windowServo.write(windowCloseAngle);
    delay(1000);
    windowState = false;
    Serial.println("窗户已关闭");
  } else {
    Serial.println("窗户已经是关闭状态");
  }
}

// 打开门
void openDoor() {
  if (!doorState) {
    doorServo.write(doorOpenAngle);
    delay(1000);
    doorState = true;
    Serial.println("门已打开");
  } else {
    Serial.println("门已经是打开状态");
  }
}

// 关闭门
void closeDoor() {
  if (doorState) {
    doorServo.write(doorCloseAngle);
    delay(1000);
    doorState = false;
    Serial.println("门已关闭");
  } else {
    Serial.println("门已经是关闭状态");
  }
}
```

#### 16.6 实验结果

按照接线图接好线，外接电源，选择好正确的开发板板型（ESP32 Dev Module）和 适当的串口端口（COMxx），然后单击按钮![](media/cou0.png)上传代码。上传代码成功后，可以通过智能语音模块来控制门和窗。

对着智能语音模块上的麦克风，使用唤醒词 “你好，小智” 或 “小智小智” 来唤醒智能语音模块，同时喇叭播放回复语 “有什么可以帮到您”；接下来即可通过串口监视器打印窗口查看智能语音模块接收到语音命令词所对应的命令参数 等。

智能语音模块唤醒后，对着麦克风说：“开窗” 或 “打开窗户”等命令词时，串口打印命令参数 “57”，同时喇叭播放对应的回复语 “已为您打开窗户”；

对着麦克风说：“关窗” 或 “关闭窗户” 等命令词时，串口打印命令参数 “58”，同时喇叭播放对应的回复语 “已为您关闭窗户”；

对着麦克风说：“开门” 或 “打开门”等命令词时，串口打印命令参数 “59”，同时喇叭播放对应的回复语 “已为您打开门”；

对着麦克风说：“关门” 或 “关闭门” 等命令词时，串口打印命令参数 “60”，同时喇叭播放对应的回复语 “已为您关闭门”。

![Img](../../media/image-16.gif)
