摘要: 本文将手把手教你打造一只名为 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_server
,mqtt_port
,mqtt_user
,mqtt_password
: MQTT 服务器的相关信息,包括地址、端口号、用户名和密码。你需要设置好自己的 MQTT 服务器,并将这些信息填写到代码中,以便 MeowBot 与服务器进行通信。
-
定义引脚:
headServoPin
,tailServoPin
,pirSensorPin
: 定义了头部舵机、尾巴舵机和人体红外传感器分别连接到 ESP32 开发板的哪些引脚。你需要根据实际连接情况修改这些引脚号。
-
定义语音指令:
openLightCommand
,closeLightCommand
: 定义了 MeowBot 能够识别的语音指令,例如 "小猫,帮我打开灯" 和 "小猫,帮我关灯"。 你可以根据自己的喜好修改这些指令,甚至添加更多指令来控制不同的智能家居设备。
-
创建对象:
voiceRecognition
: 创建 LD3320 对象,用于控制 LD3320 语音识别模块。espClient
: 创建 WiFiClient 对象,用于 ESP32 连接到 WiFi 网络。mqttClient
: 创建 PubSubClient 对象,用于 MQTT 通信,需要传入 WiFiClient 对象作为参数。headServo
,tailServo
: 创建 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 通信功能。你可以根据自己的需求修改代码,例如添加更多语音指令、控制其他智能家居设备,甚至设计更复杂的动作和交互逻辑,打造独一无二的智能宠物猫。