当前位置: 代码网 > it编程>编程语言>C/C++ > MeowBot:ESP32 语音控制宠物猫 DIY 教程——玩转语音识别与 MQTT 智能家居控制 (附代码解析)

MeowBot:ESP32 语音控制宠物猫 DIY 教程——玩转语音识别与 MQTT 智能家居控制 (附代码解析)

2024年08月05日 C/C++ 我要评论
当你靠近 MeowBot 时,它会通过舵机控制头部和尾巴摆动,并发出喵叫声,萌化你的心。MeowBot 能听懂你的指令,例如“小猫,帮我打开灯”,然后通过 MQTT 协议发送控制指令给智能家居设备。MeowBot 还可以根据你的创意扩展其他功能,例如播放音乐、语音播报天气等。

摘要: 本文将手把手教你打造一只名为 meowbot 的智能宠物猫!它不仅可以通过舵机灵动地打招呼,还能听懂你的语音指令,帮你控制智能家居设备。让我们一起开启这段充满乐趣的 diy 之旅吧!

关键词: esp32、语音识别、mqtt、智能家居、宠物机器人

一、 引言

厌倦了冰冷的智能音箱?渴望一只既能陪伴你,又能帮你控制家居的萌宠?今天就来教你 diy 一只基于 esp32 的智能宠物猫 meowbot!它能够识别你的语音指令,并通过 mqtt 协议控制智能家居设备,为你的生活增添乐趣和科技感。

二、 meowbot 功能介绍

meowbot 具备以下功能:

  • 打招呼: 当你靠近 meowbot 时,它会通过舵机控制头部和尾巴摆动,并发出喵叫声,萌化你的心。
  • 语音控制: meowbot 能听懂你的指令,例如“小猫,帮我打开灯”,然后通过 mqtt 协议发送控制指令给智能家居设备。
  • 扩展功能: meowbot 还可以根据你的创意扩展其他功能,例如播放音乐、语音播报天气等。

三、 meowbot 系统设计

meowbot 的系统架构图如下所示:

 

3.1 硬件部分

meowbot 的硬件清单如下:

  • esp32 开发板: 作为 meowbot 的大脑,负责接收传感器数据、处理语音指令、控制舵机和发送 mqtt 消息。
  • ld3320 语音识别模块: 用于识别用户的语音指令,将其转换为文本信息。
  • mg995 舵机 (x2): 用于控制 meowbot 的头部和尾巴动作,使其更加生动形象。
  • hc-sr501 人体红外传感器: 用于检测是否有人靠近 meowbot,触发打招呼动作。
  • 其他模块 (可选): oled 显示屏、扬声器、led 灯等,可以根据需要添加。
3.2 软件部分

meowbot 的软件部分主要包括:

  • arduino ide: 用于编写和上传 esp32 代码。
  • ld3320 库: 用于驱动 ld3320 语音识别模块。
  • pubsubclient 库: 用于 esp32 连接 mqtt 服务器。
  • servo 库: 用于控制舵机的转动角度。

四、 meowbot 制作步骤

4.1 硬件连接

按照以下电路图连接各个硬件模块:

注意: 具体的引脚连接需要根据你使用的硬件模块进行调整。

4.2 软件编写
4.2.1 安装库文件

在 arduino ide 中,依次点击“项目”->“加载库”->“管理库”,搜索并安装以下库文件:

  • ld3320
  • pubsubclient
  • servo
4.2.2 代码示例

 

#include <ld3320.h>
#include <wifi.h>
#include <pubsubclient.h>
#include <servo.h>

// wifi 和 mqtt 设置
const char* ssid = "你的wifi名称";
const char* password = "你的wifi密码";
const char* mqtt_server = "你的mqtt服务器地址";
const int mqtt_port = 1883;
const char* mqtt_user = "你的mqtt用户名";
const char* mqtt_password = "你的mqtt密码";

// 定义引脚
const int headservopin = 12;  // 头部舵机引脚
const int tailservopin = 14;  // 尾巴舵机引脚
const int pirsensorpin = 27; // 人体红外传感器引脚

// 定义语音指令
const char* openlightcommand = "小猫,帮我打开灯";
const char* closelightcommand = "小猫,帮我关灯";

// 创建对象
ld3320 voicerecognition;
wificlient espclient;
pubsubclient mqttclient(espclient);
servo headservo;
servo tailservo;

// mqtt 主题
const char* lighttopic = "home/light";

// 初始化函数
void setup() {
  serial.begin(115200);
  // 初始化语音识别模块
  voicerecognition.init();
  voicerecognition.setinterrupt(false);
  // 初始化舵机
  headservo.attach(headservopin);
  tailservo.attach(tailservopin);
  // 初始化人体红外传感器
  pinmode(pirsensorpin, input);
  // 连接 wifi
  wifi.begin(ssid, password);
  while (wifi.status() != wl_connected) {
    delay(1000);
    serial.println("正在连接wifi...");
  }
  serial.println("wifi连接成功!");
  // 连接 mqtt 服务器
  mqttclient.setserver(mqtt_server, mqtt_port);
  mqttclient.setcallback(mqttcallback);
  while (!mqttclient.connected()) {
    if (mqttclient.connect("meowbot", mqtt_user, mqtt_password)) {
      serial.println("mqtt连接成功!");
    } else {
      serial.print("mqtt连接失败,错误码:");
      serial.println(mqttclient.state());
      delay(2000);
    }
  }
}

// 主循环函数
void loop() {
  // 处理 mqtt 连接
  mqttclient.loop();
  // 检测是否有人靠近
  if (digitalread(pirsensorpin) == high) {
    greet();
  }
  // 语音识别
  if (voicerecognition.available()) {
    string command = voicerecognition.readvoice();
    serial.print("识别到的指令:");
    serial.println(command);
    // 处理语音指令
    handlecommand(command);
  }
}

// 打招呼函数
void greet() {
  // 头部和尾巴摆动
  for (int i = 0; i < 3; i++) {
    headservo.write(60);
    tailservo.write(120);
    delay(500);
    headservo.write(120);
    tailservo.write(60);
    delay(500);
  }
  // 发出喵叫声 (可选)
}

// 处理语音指令函数
void handlecommand(string command) {
  if (command == openlightcommand) {
    // 发送 mqtt 消息控制灯打开
    mqttclient.publish(lighttopic, "on");
    serial.println("已发送打开灯的指令");
  } else if (command == closelightcommand) {
    // 发送 mqtt 消息控制灯关闭
    mqttclient.publish(lighttopic, "off");
    serial.println("已发送关闭灯的指令");
  } else {
    // 未识别到的指令
    serial.println("未识别到的指令");
  }
}

// mqtt 回调函数
void mqttcallback(char* topic, byte* payload, unsigned int length) {
  // 处理接收到的 mqtt 消息
}

4.3 代码解析
  • 头文件: 代码开头的 #include 部分引入了程序所需库文件的头文件。

    • <ld3320.h>: ld3320 语音识别模块库,用于控制和读取 ld3320。
    • <wifi.h>: esp32 wifi 库,用于连接 wifi 网络。
    • <pubsubclient.h>: mqtt 客户端库,用于 esp32 与 mqtt 服务器进行通信。
    • <servo.h>: 舵机控制库,用于控制 meowbot 的头部和尾巴舵机。
  • wifi 和 mqtt 设置:

    • ssid 和 password : 存储你的 wifi 网络名称和密码,确保 meowbot 能够连接到你的家庭网络。
    • mqtt_servermqtt_portmqtt_usermqtt_password: mqtt 服务器的相关信息,包括地址、端口号、用户名和密码。你需要设置好自己的 mqtt 服务器,并将这些信息填写到代码中,以便 meowbot 与服务器进行通信。
  • 定义引脚:

    • headservopintailservopinpirsensorpin: 定义了头部舵机、尾巴舵机和人体红外传感器分别连接到 esp32 开发板的哪些引脚。你需要根据实际连接情况修改这些引脚号。
  • 定义语音指令:

    • openlightcommandcloselightcommand: 定义了 meowbot 能够识别的语音指令,例如 "小猫,帮我打开灯" 和 "小猫,帮我关灯"。 你可以根据自己的喜好修改这些指令,甚至添加更多指令来控制不同的智能家居设备。
  • 创建对象:

    • voicerecognition: 创建 ld3320 对象,用于控制 ld3320 语音识别模块。
    • espclient: 创建 wificlient 对象,用于 esp32 连接到 wifi 网络。
    • mqttclient: 创建 pubsubclient 对象,用于 mqtt 通信,需要传入 wificlient 对象作为参数。
    • headservotailservo: 创建 servo 对象,分别控制 meowbot 的头部和尾巴舵机。
  • mqtt 主题:

    • lighttopic: 定义了控制灯光状态的 mqtt 主题,例如 "home/light"。 你可以根据实际控制的设备修改主题名称。
  • 初始化函数 setup():

    • serial.begin(115200): 初始化串口通信,用于调试输出信息。
    • voicerecognition.init(): 初始化 ld3320 语音识别模块。
    • voicerecognition.setinterrupt(false): 设置语音识别模块为非中断模式,即程序会一直等待识别结果,不会被其他任务打断。
    • headservo.attach(headservopin): 将头部舵机对象与对应的引脚关联起来。
    • tailservo.attach(tailservopin): 将尾巴舵机对象与对应的引脚关联起来。
    • pinmode(pirsensorpin, input): 将人体红外传感器引脚设置为输入模式。
    • wifi.begin(ssid, password): 连接 wifi 网络。
    • mqttclient.setserver(mqtt_server, mqtt_port): 设置 mqtt 服务器地址和端口号。
    • mqttclient.setcallback(mqttcallback): 设置 mqtt 消息回调函数,当收到订阅主题的消息时,会调用该函数进行处理。
    • mqttclient.connect("meowbot", mqtt_user, mqtt_password): 连接 mqtt 服务器。
  • 主循环函数 loop():

    • mqttclient.loop(): 处理 mqtt 连接状态,保持与服务器的连接。
    • digitalread(pirsensorpin) == high: 检测人体红外传感器是否检测到有人靠近。
    • greet(): 如果检测到有人靠近,则调用 greet() 函数让 meowbot 打招呼。
    • voicerecognition.available(): 检查语音识别模块是否识别到语音指令。
    • voicerecognition.readvoice(): 读取识别到的语音指令。
    • handlecommand(command): 调用 handlecommand() 函数处理识别到的语音指令。
  • 打招呼函数 greet():

    • 通过控制头部和尾巴舵机的角度,模拟 meowbot 打招呼的动作。
  • 处理语音指令函数 handlecommand():

    • 该函数接收一个字符串类型的参数 command,表示识别到的语音指令。
    • 首先,使用 if (command == openlightcommand) 判断指令是否为打开灯的指令。
      • 如果是,则调用 mqttclient.publish(lighttopic, "on") 向 mqtt 服务器发送打开灯的指令。
      • lighttopic 是预先定义的控制灯光状态的 mqtt 主题,"on" 表示打开灯。
      • 最后,通过串口打印 "已发送打开灯的指令",方便调试。
    • 接着,使用 else if (command == closelightcommand) 判断指令是否为关闭灯的指令。
      • 如果是,则调用 mqttclient.publish(lighttopic, "off") 向 mqtt 服务器发送关闭灯的指令。
      • "off" 表示关闭灯。
      • 最后,通过串口打印 "已发送关闭灯的指令",方便调试。
    • 最后,如果指令既不是打开灯也不是关闭灯,则进入 else 分支,表示未识别到有效指令。
      • 此时,程序会通过串口打印 "未识别到的指令",提示用户重新输入指令。
  • mqtt 回调函数 mqttcallback():

    • 该函数在 esp32 从订阅的 mqtt 主题接收到消息时被调用。
    • 你可以根据需要编写该函数,例如,当接收到控制灯光状态的反馈消息时,可以通过串口打印出来,或者控制 led 灯指示灯状态等。

总结:

meowbot 的代码清晰易懂,主要实现了语音识别、舵机控制和 mqtt 通信功能。你可以根据自己的需求修改代码,例如添加更多语音指令、控制其他智能家居设备,甚至设计更复杂的动作和交互逻辑,打造独一无二的智能宠物猫。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com