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

news2024/12/23 13:11:20

摘要: 本文将手把手教你打造一只名为 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 通信功能。你可以根据自己的需求修改代码,例如添加更多语音指令、控制其他智能家居设备,甚至设计更复杂的动作和交互逻辑,打造独一无二的智能宠物猫。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1885644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

独立开发者系列(15)——git的使用

上一篇14文章触发了敏感话题&#xff0c;直接未过审核&#xff0c;看来技术博客也有敏感点。 大部分情况下&#xff0c;独立项目是你一个人开发&#xff0c;但是当你接的项目比较大的时候&#xff0c;你需要其他人的帮忙&#xff0c;这个时候你要把代码分享给别人。因为如果你…

跨境业务经验推荐:三大优秀的IP代理服务商

作为一名多年从事跨境业务的老手&#xff0c;今天我要给大家介绍几款绝对靠谱的IP代理服务商&#xff0c;保证让你的全球业务更加顺畅&#xff01; 1. 711Proxy 711Proxy以其优秀的性能和覆盖范围广而著称。对于跨境电商和国际业务来说&#xff0c;快速稳定的网络连接至关重要…

容器技术-docker5

一、docker-compose 常用命令和指令 1. 概要 默认的模板文件是 docker-compose.yml&#xff0c;其中定义的每个服务可以通过 image 指令指定镜像或 build 指令&#xff08;需要 Dockerfile&#xff09;来自动构建。 注意如果使用 build 指令&#xff0c;在 Dockerfile 中设置…

Canvas:掌握贝塞尔曲线与封装路径

想象一下&#xff0c;用几行代码就能创造出如此逼真的图像和动画&#xff0c;仿佛将艺术与科技完美融合&#xff0c;前端开发的Canvas技术正是这个数字化时代中最具魔力的一环&#xff0c;它不仅仅是网页的一部分&#xff0c;更是一个无限创意的画布&#xff0c;一个让你的想象…

QT中QDomDocument读写XML文件

一、XML文件 <?xml version"1.0" encoding"UTF-8"?> <Begin><Type name"zhangsan"><sex>boy</sex><school>Chengdu</school><age>18</age><special>handsome</special>&l…

Android自动化测试实践:uiautomator2 核心功能与应用指南

Android自动化测试实践&#xff1a;uiautomator2 核心功能与应用指南 uiautomator2 是一个用于Android应用的自动化测试Python库&#xff0c;支持多设备并行测试操作。它提供了丰富的API来模拟用户对App的各种操作&#xff0c;如安装、卸载、启动、停止以及清除应用数据等。此外…

maven设置阿里云镜像源(加速)

一、settings.xml介绍 settings.xml是maven的全局配置文件&#xff0c;maven的配置文件存在三个地方 项目中的pom.xml&#xff0c;这个是pom.xml所在项目的局部配置文件用户配置&#xff1a;${user.home}/.m2/settings.xml全局配置&#xff1a;${M2_HOME}/conf/settings.xml 优…

3.js - 纹理的 magfilter、minFilter、各向异性过滤(各项异性解决倾斜模糊问题)

效果图&#xff0c;就是一个PlaneGeometry&#xff0c;加了一个贴图&#xff0c;再设置下面这些属性&#xff0c;你就放大缩小着看吧&#xff0c;反正我看不出什么来 代码 // ts-nocheck // 引入three.js import * as THREE from three // 导入轨道控制器 import { OrbitContro…

4、音视频封装格式---FLV

FLV FLV是一种容器封装格式&#xff0c;是由Adobe公司发布和维护的&#xff0c;用于将视频编码流与音频编码流进行封装。对于任意一种封装格式&#xff0c;都有其头部区域与数据区域&#xff0c;在FLV中&#xff0c;称之为FLV Header与Body。 对于FLV Header&#xff0c;一个FL…

31 C++11

本节目标 c11简介列表初始化变量类型推导范围for循环新增加容器右值新的类功能可变参数模板 1. c11简介 在2003年标准委员会提交了一份计数勘误表&#xff08;简称TC1&#xff09;&#xff0c;使得c03这个名字已经取代了c98称为c11之前的最新的c标准名称。不过由于c03&#x…

【桌面微信多开】

桌面微信多开 步骤一&#xff1a;新建txt步骤二&#xff1a;保存修改为.bat步骤三&#xff1a;双击运行程序步骤四&#xff1a;多次点击微信 步骤一&#xff1a;新建txt echo offstart /d "D:\program\WeChat\" WeChat.exestart /d "D:\program\WeChat\" …

Xilinx FPGA:vivado利用单端RAM/串口传输数据实现自定义私有协议

一、项目要求 实现自定义私有协议&#xff0c;如&#xff1a;pc端产生数据&#xff1a;02 56 38 &#xff0c;“02”代表要发送数据的个数&#xff0c;“56”“38”需要写进RAM中。当按键信号到来时&#xff0c;将“56”“38”读出返回给PC端。 二、信号流向图 三、状态…

MessageBox的作用与用法

在C# &#xff08; Windows Forms &#xff09;中&#xff0c;MessageBox 的所有常用用法如下&#xff1a; 1. 显示一个简单的消息框 MessageBox.Show("这是一个简单的消息框。");2. 显示带标题的消息框 MessageBox.Show("这是一个带标题的消息框。", &…

美国服务器租用详细介绍与租用流程

在数字化时代&#xff0c;服务器租用已成为许多企业和个人拓展业务、存储数据的重要选择。美国作为全球科技发展的前沿阵地&#xff0c;其服务器租用服务也备受瞩目。下面&#xff0c;我们将详细介绍美国服务器租用的相关知识及租用流程。 一、美国服务器租用简介 美国服务器租…

PDI-kettle工具连接本地虚拟机Ubuntu上的数据库

PDI 配置ubuntu数据库配置Kettle工具 PDI版本&#xff1a;9.4 Ubuntu2204&#xff1a;10.11.8-MariaDB-0ubuntu0.24.04.1 Ubuntu 24.04 配置ubuntu数据库 安装 apt install -y mariadb-server配置监听地址 cat > /etc/mysql/mariadb.conf.d/99-kettle.cnf << EOF …

结构体------“成绩排序”---冒泡----与“输出最高成绩”区别

从大到小或者从小到大排序----冒泡排序---双重循环i,j 比较的时候用的是 排序的时候用的是整体 stu [ j1 ] 和 stu [ j ] 我写错为下面这个&#xff0c;交换的只是学生的出生日期&#xff0c;没有交换整体 #include<stdio.h> #include<string.h>struct student{ch…

MySQL 8.0新特性INTERSECT和EXCEPT用于集合运算

MySQL8.0.31 新版本的推出&#xff0c;MySQL增加了对SQL标准INTERSECT和EXCEPT运算符的支持。 1、INTERSECT INTERSECT输出多个SELECT语句查询结果中的共有行。INTERSECT运算符是ANSI/ISO SQL标准的一部分(ISO/IEC 9075-2:2016(E))。 我们运行两个查询&#xff0c;第一个会列…

仰邦BX.K协议对接

背景 使用BX 6K控制卡控制诱导屏显示剩余车位数&#xff0c;由于控制卡和服务端不在一个局域网内&#xff0c;所以不能使用官网提供的案例&#xff0c;官网提供的案例为控制卡为TCP Server&#xff0c;服务端为TCP Client&#xff0c;因此需要开发此程序&#xff0c;服务端左右…