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

摘要: 本文将手把手教你打造一只名为 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);// 连接 WiFiWiFi.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.mzph.cn/pingmian/39157.shtml

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

相关文章

RS232、RS485与RS422初步学习

目录 电平 传输方式 共模和差模干扰 ps&#xff1a;双绞线 485总线结构 ps&#xff1a;终端电阻 RS232接口&#xff08;DB9&#xff09; 优缺点 RS232优缺点 RS485较RS232的优点 为什么RS232还在使用&#xff1f; 电平 RS232、RS485与RS422的电平 区间逻辑备注RS232…

巧用Fiddler中的Comments提升接口测试效率

有没有同学在使用Fiddler时跟我遇到了同样的问题&#xff0c;就是想给某个抓包的请求进行注释&#xff01;&#xff01;&#xff01;但是奇怪的是&#xff0c;根本没有Comments相关信息呀&#xff1f; 设置Comments 设置Comments非常容易&#xff0c;选中一个请求&#xff0c…

基于ESP32 IDF的WebServer实现以及OTA固件升级实现记录(一)

webserver即运行在esp32上的web服务&#xff0c;相当于esp32作为web服务器&#xff0c;它可以处理web浏览器等客户端的http相关请求&#xff08;常见的get/post/put等http方法&#xff09;。 ota即在线固件升级&#xff0c;idf已经提供了丰富的官方ota示例&#xff0c;不过主要…

Golang-context理解

golang-context笔记整理 golang为何设计context&#xff1f;代码上理解原理空context类cancelCtx类.withcancelctx方法 timerCtx类valueCtx类 golang为何设计context&#xff1f; 有并发特性的语言中&#xff0c;都会有一种说法&#xff1a;创建异步线程或者携程的时候&#x…

【TS】TypeScript 入门指南:强大的JavaScript超集

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 TypeScript 入门指南&#xff1a;强大的JavaScript超集一、TypeScript 简介1.1 …

SpringBoot实现图片添加水印(完整)

提示&#xff1a;昨天不是写了一个类似与图片添加水印的版本吗,今天来写一个带数据库&#xff0c;并且可以完整访问的版本 文章目录 目录 文章目录 引入库 配置文件 数据库配置 字段配置 索引配置 数据库表语句 启动文件 前端代码 整体代码目录 配置类AppConfig Contro…

用可视化的方式学统计学

本次分享一个统计学学习工具:看见统计。 看见统计致力于用数据可视化 (使用D3.js完成) 让统计概念更容易理解,源于布朗大学几位作者👇 看见统计共有6个章节, 下面来看看具体内容, 中心极限定理 对于一个(性质比较好的)分布,如果我们有足够大的独立同分布的样本,其…

Java高级重点知识点-19-Lambda

文章目录 Lambda表达式函数式编程思想Lambda表达式写法代码讲解 Lambda表达式 函数式编程思想 强调做什么&#xff0c;而不是以什么形式做。 以函数式接口Runnable为例讲解&#xff1a; public class LambdaDemo {public static void main(String[] args) {Runnable runnab…

C语言实现简单的minishell

探索开源项目&#xff1a;MiniShell 引言 在计算机编程的世界里&#xff0c;Shell 是一个至关重要的组成部分&#xff0c;它允许用户与操作系统交互&#xff0c;执行命令和程序。MiniShell 是一个简化版的 Shell 程序&#xff0c;通常用于教学和学习目的。在本文中&#xff0…

《梦醒蝶飞:释放Excel函数与公式的力量》8.2 COUNTA函数

8.2 COUNTA函数 COUNTA函数是Excel中用于统计指定区域内所有非空单元格数量的函数。它能够统计数值、文本、错误值以及公式返回的结果&#xff0c;是数据分析中常用的统计工具。 8.2.1 函数简介 COUNTA函数用于统计指定区域中所有非空单元格的数量。它与COUNT函数不同&#…

创新校园服务模式 跑腿小程序平台源码构建与实践 前后端分离 带完整的安装代码包以及部署教程

系统概述 本项目是一个集任务发布、接单、支付、评价于一体的跑腿服务小程序平台&#xff0c;专为高校校园设计。系统采用前后端分离架构&#xff0c;前端负责用户界面展示和交互逻辑&#xff0c;后端处理业务逻辑、数据存取等&#xff0c;两者通过API接口进行通信&#xff0c…

二叉树的右视图-二叉树

199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 层序遍历&#xff0c;广度优先 queue先进后出&#xff0c;每层从左往右进树&#xff0c;最后一个就是最右边的数&#xff1b;pop掉这层的。push下一层&#xff1b; class Solution { public:vector<int> r…

楼层分户项目分析

文章目录 1. 区域绘制2. 户型切分3. 楼房分层4. 编辑房户信息5. 查看房户信息6. 数据库6.1. 楼栋数据库6.2. 单位数据库 7. 房户数据库 1. 区域绘制 点击绘制图形&#xff0c;激活画笔&#xff0c;右键结束绘制。 输入框可以更换地址前缀。 分户坐标是由绘制的多个点组成的&…

深度学习笔记: 最详尽解释混淆矩阵 Confusion Matrix

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 混淆矩阵 假设我们有包含临床测量数据的医疗数据&#xff0c;例如胸痛、良好的血液循环、动脉阻塞和体重…

如何将音频文件发送至摄像头

目前再很多互联互通的场景下&#xff0c;如AI盒子再从摄像头上取视频分析&#xff0c;分析出发生某个事件&#xff0c;需要反向通过摄像头的喇叭播放语音&#xff0c;发出告警提示&#xff0c;使用场景如下 盒子上对于此类场景的需求往往不能满足&#xff0c;或者为这个需求需要…

APP性能测试

1、性能测试分类&#xff1a;&#xff08;CPU&#xff0c;内存&#xff0c;流量&#xff0c;时间&#xff08;启动耗时计算&#xff09;&#xff0c;电量&#xff0c;流畅度&#xff08;帧率&#xff09;&#xff09;&#xff0c;稳定性&#xff08;崩溃&#xff0c;闪退&#…

感动的短视频:成都柏煜文化传媒有限公司

感动的短视频&#xff1a;瞬间触动心灵的温暖力量 在这个快节奏、高压力的时代&#xff0c;我们常常在忙碌与喧嚣中穿梭&#xff0c;心灵深处那份最纯粹的感动似乎变得愈发珍贵而难得。然而&#xff0c;就在这样一个数字化盛行的今天&#xff0c;短视频以其独特的魅力&#xf…

二百四十二、Hive——Hive的动态分区表出现day=__HIVE_DEFAULT_PARTITION__分区

一、目的 Hive的DWD层动态分区表的分区出现day__HIVE_DEFAULT_PARTITION__&#xff0c;有点懵&#xff0c;而且表中数据的day字段也显示__HIVE_DEFAULT_PARTITION__ 1、DWD层动态分区表的分区 __HIVE_DEFAULT_PARTITION__ 2、DWD层分区字段day数据 __HIVE_DEFAULT_PARTITION…

农业气象监测仪:现代农业的“守护神”

随着科技的不断进步&#xff0c;农业生产也逐渐迈入了智能化的新时代。在众多的农业科技产品中&#xff0c;农业气象监测仪以其独特的优势&#xff0c;成为了现代农业不可或缺的一部分。本文将从多个角度探讨农业气象监测仪在农业中的优势&#xff0c;以及它如何助力农业生产实…

事务的概念-事务的概念、事务的定义(BEGIN TRANSACTION、COMMIT、ROLLBACK)

数据库系统中的事务&#xff0c;是保证系统在发生故障后或存在并发操作的情况下&#xff0c;数据库中的数据与企业业务结果相一致 一、事务的概念 在许多数据库应用系统中&#xff0c;数据库用来存储现实世界中一些企业的状态信息或其管理的数据 1、概念一 &#xff08;1&a…