本文作者:默 & 铁熊。
开源电子平台兴起以来,诞生了不少的创客们,他们用天马行空的想象力,创造出各种新鲜有趣的作品,他们热衷于改变千篇一律的生活,享受科技创造带来的乐趣。其中与我们的生活息息相关的就包括智能家居相关的作品,在这方面国内外大牛们各显神通,纷纷创造出自己独特的智能家居作品,例如智能窗帘、智能宠物投食机、家庭气象站、智能小夜灯等居家必备的实用项目。
我自己也喜欢改造家里的电器,赋予传统家具新鲜的活力,让它们知冷暖,变成真正的生活小帮手。但随着改造或者是创造出的智能家居项目越来越多,他们的控制变得越来越困难:往往需要切换到不同 App 去控制不同的设备,这变得相当繁琐,而且它们之间是相互独立的。那有没有办法使他们有机结合在一起呢?
语音控制就是一个非常理想的控制方法,我们只需要一句话就可以获取各种传感器的信息,也可以控制各种执行器完成我们的操作。本期教程就教大家打造一个智能家居语音助理,通过语音识别享受智能家居带来的便捷与乐趣。
先来看一下演示视频,对本期教程实现的效果有一个大致的了解。视频中演示了如何用语音控制灯的开关、查询灯的状态以及获取室内温度。
DIY 智能家居语音助理 — 语音控制万物
作品效果图
可以通过继电器将本项目中的 LED 灯换成普通的灯泡,视觉效果更佳,如下图所示。利用这种方式,我们可以控制的设备就不仅仅是模拟的 LED 灯了,而是智能家居里的各种设备。
设计思路
下面开始详细讲解程序设计过程,项目框架如下:
语音助理控制端,我们采用 M5StickC 开发板来编程,因为 M5StickC 开发板集成了电池、麦克风以及屏幕,可以实现方便地实现语音识别,是一个比较理想的测试模块。
智能小灯与传感器受控端,我们采用 ESP8266 结合各种传感器来制作,ESP8266 是一款性价比很高的开发板,性能强大,同时又可以连接 WiFi,接入各种物联网平台。
物联网方面,我们采用 Blynk 物联网框架,因为 Blynk 是一个相对简单实用的物联网平台,拥有丰富的控制组件,仅需少量代码即可完成复杂的物联网开发,又因其具有开放 API,故而可以轻松的集成到种物联网项目或者是自己 DIY 的 App 当中。
准备工作
我们使用 Arduino 软件来编写本项目的程序,开发板选择 ESP8266 及 ESP32 类型。至于如何在 Arduino 中配置 ESP8266 及 ESP32 的开发环境,不在本文的介绍范围,请自行查阅相关资料。
要完成本课程的项目,需准备如下材料:
- M5StickC 开发板;
- ESP8266 开发板;
- DHT11 温湿度传感器。
电路接线
DHT11 温湿度传感器连接 ESP8266 开发板的 GPIO5 接口。注意视频中使用的开发板与下图不同。视频中采用了一块集成的 ESP8266 开发板,自带 DHT11 温湿度传感器,省去了接线的烦恼。但是掌握了接线原理,使用任何 ESP8266 开发板都是可以的。
语音助理程序设计(控制端)
第一步:获取语音助理项目及授权码
此处我使用的 Blynk 服务器是国内第三方搭建的免费服务器,地址是:blynk.mixly.org。
使用 Blynk App 扫描下面的二维码,就可以克隆智能家居助理项目,并且复制 Blynk 授权码备用。(对 Blynk 不熟悉的朋友,可以参考裘炯涛和陈众贤老师编写的《物联网So Easy!》这本书,上面有很多 Blynk 物联网的基础知识及案例,可以帮助大家快速入门。
第二步:获取 M5 语音识别授权码
我们先去 M5 官方网站(https://m5stack.com/pages/download)下载并安装 M5Burner 烧录软件。如下图所示,打开 M5Burner 软件插入 M5StickC 开发板,选择自己的端口号,然后选择 ATOM 模块看到 EchoSTT 点击 Get Token 获取语音识别授权码,获取到授权码后复制该授权码备用。完成这些步骤之后就可以关闭 M5Burner 软件了。
第三步:修改程序
使用 Arduino IDE 软件选择本教程附录的 voice_assistant 程序并打开(程序下载方法见文末)。主要代码如下:
// Blynk与联网相关库
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
// 语音识别相关库
#include <driver/i2s.h>
#include <HTTPClient.h>
#include "BaiduRest.h"
// M5StickC相关库(含TFT彩屏库)
#include <M5StickC.h>
#include "image.h" // 图片取模数据
#include "Function_wrapper.h" // 函数封装
// -------------------------- 用户设置开始 ------------------------------ //
// -------------------------------------------------------------------- //
// WiFi账号与密码
char ssid[] = "********";
char pass[] = "********";
// 语音识别授权码
#define voiceAuth "f008d1c88064c8c38084de074b73b823"
// Blynk授权码
char auth[] = "SDzbDasOYxRDYqr7NdZiSIk2VSI52e6b";
// -------------------------------------------------------------------- //
// -------------------------- 用户设置结束 ------------------------------ //
BaiduRest rest;
uint8_t microphonedata0[1024 * 80]