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