2.6.12 智能语音风扇#

2.6.12.1 简介#

如今市面上有很多的语音控制风扇,再也不像以前需要手动去调节风扇了,你只需要对着它喊出它的名称并告诉它你要它执行的命令就可以了,比如开风扇关风扇,一档,二档,三档等操作。本次课程我们就是基于语音模块做一个语音控制风扇模块的实验。

2.6.12.2 控制指令表#

命令参数表:

命令码

命令词

命令回复

19

打开风扇

风扇已打开

20

风扇调到一档,风扇一档

风扇已调到一档

21

风扇调到二档,风扇二档

风扇已调到二档

22

风扇调到三档,风扇三档

风扇已调到三档

23

关闭风扇

风扇已关闭

2.6.12.3 接线图#

a98

2.6.12.4 代码#

// 引入SoftwareSerial库,用于创建软串口通信(模拟串口,可使用任意数字/模拟引脚)
#include <SoftwareSerial.h>

// 引入SoftPWM库,用于软件模拟PWM输出(适用于不支持硬件PWM的引脚)
#include <SoftPWM.h>

// 创建软串口对象,使用A5作为RX引脚接收数据,A4作为TX引脚发送数据
// 通常用于与语音模块进行串口通信
SoftwareSerial mySerial(A5, A4);

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

// 定义直流电机控制引脚
int IN_Pin = A3;  // 电机方向控制引脚
int EN_Pin = A2;  // 电机使能/PWM调速引脚

// 注意:以下setup()中使用了未声明的变量 myservo 和 servoPin,以及未初始化的SoftPWM库
void setup() {
  // 初始化硬件串口,波特率750(非标准值,需确保通信双方一致)
  Serial.begin(750);

  // 初始化软串口,用于与语音模块通信,波特率9600(标准值)
  mySerial.begin(9600);

  //配置模拟PWM
  SoftPWMBegin();
  SoftPWMSet(EN_Pin, 0);
  SoftPWMSetFadeTime(EN_Pin, 1000, 1000);
}

void loop() {
  // 持续检查软串口缓冲区是否有来自语音模块的数据
  while (mySerial.available()) {
    // 读取一个字节的数据(通常语音模块发送的是ASCII字符或字节值)
    Voice_Control = mySerial.read();
    // 将接收到的原始数据通过硬件串口打印到串口监视器,便于调试
    Serial.println(Voice_Control);
  }

  // 根据接收到的指令值(Voice_Control)执行电机控制
  if (Voice_Control == 19) {         // 指令19:最高速正转
    SoftPWMSet(EN_Pin, 255);         // 设置PWM占空比为255(最大速度)
    digitalWrite(IN_Pin, LOW);       // 设置方向引脚为低电平(假设低电平为正转)
  } else if (Voice_Control == 20) {  // 指令20:中低速正转(100/255 ≈ 39%)
    SoftPWMSet(EN_Pin, 100);
    digitalWrite(IN_Pin, LOW);
  } else if (Voice_Control == 21) {  // 指令21:中高速正转(175/255 ≈ 69%)
    SoftPWMSet(EN_Pin, 175);
    digitalWrite(IN_Pin, LOW);
  } else if (Voice_Control == 22) {  // 指令22:最高速正转
    SoftPWMSet(EN_Pin, 255);
    digitalWrite(IN_Pin, LOW);
  } else if (Voice_Control == 23) {  // 指令23:停止(PWM设为0)
    SoftPWMSet(EN_Pin, 0);
    digitalWrite(IN_Pin, LOW);
  }

  // 清除指令字符串,避免重复执行
  Voice_Control = 0;
}

2.6.12.5 代码说明#

① 添加库文件,设置模拟串口引脚为RX:A5,TX:A4,设置全局变量Voice_Control用于存放语模块发送过来的命令码,设置控制电机引脚

② 设置串口波特率为750以及模拟串口的波特率为9600,配置模拟PWM代码

③ 搭建接收命令码代码并将命令码复制给变量Voice_Control

④ 对变量Voice_Control进行判断等于19为打开风扇,等于20为风扇一档,等于21为风扇二档,等于22为风扇三档,等于23为关闭风扇,因为我们需要对电机的转速进行控制,所有我们使用到了一个软件模拟输出的代码块,这个代码块是可以给没有PWM输出功能的引脚输出模拟PWM信号达到控制效果。

2.6.12.6 代码结果#

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

打开风扇示例: 你:“小智小智” ,小智:“我在”,你:“打开风扇” ,小智:“风扇已打开”

风扇一档示例: 你:“小智小智” ,小智:“我在”,你:“风扇调到一档” 或 “风扇一档” ,小智:“风扇已调到一档”

风扇二档示例: 你:“小智小智” ,小智:“我在”,你:“风扇调到二档” 或 “风扇二档” ,小智:“风扇已调到二档”

风扇三档示例: 你:“小智小智” ,小智:“我在”,你:“风扇调到三档” 或 “风扇三档” ,小智:“风扇已调到三档”

关闭风扇示例: 你:“小智小智” ,小智:“我在”,你:“关闭风扇”,小智:“风扇已关闭”