与 Arduino 对话并使用 Google 助理控制它
组件和用品
| × | 1 | ||||
| × | 1 |
应用和在线服务
| ||||
|
关于这个项目
在这个项目中,我们将学习如何在互联网服务和 Arduino 板之间建立连接。在本文结尾,您将:
- 了解如何从 Google 助理获取数据
- 知道如何使用IFTTT协议
- 熟悉 webhooks 和 http 请求
- 能够与您的 Arduino 通话
Google 助理和 IFTTT 小程序
Google Assistant 是由 Google 开发的人工智能虚拟助理,主要用于移动和智能家居设备。与该公司之前的虚拟助手 Google Now 不同,Google Assistant 可以进行双向对话。它比任何设备都能更好地识别您的文字,并快速正确地响应您的命令。用户主要通过自然语音与 Google Assistant 交互,但也支持键盘输入。与 Google Now 的性质和方式相同,Assistant 能够搜索互联网、安排事件和闹钟、调整用户设备上的硬件设置以及显示来自用户 Google 帐户的信息。谷歌还宣布,助手将能够通过设备的摄像头识别物体并收集视觉信息,并支持购买产品和汇款,以及识别歌曲。
If This Then That,也称为 IFTTT,是一种免费的基于 Web 的服务,用于创建称为小程序的简单条件语句链。小程序由其他 Web 服务(例如 Gmail、Facebook、Telegram、Instagram 或 Pinterest)中发生的更改触发。例如,如果用户使用主题标签发推文,小程序可能会发送电子邮件,或者如果有人在照片中标记用户,则小程序可以将 Facebook 上的照片复制到用户的档案中。除了基于 Web 的应用程序外,该服务还可以在 iOS 和 Android 上运行。 2015 年 2 月,IFTTT 将其原始应用程序更名为 IF,并发布了名为 Do 的新应用程序套件,可让用户创建快捷应用程序和操作。截至 2015 年,IFTTT 用户每天创建约 2000 万个食谱。 Do 应用套件的所有功能都已集成到重新设计的 IFTTT 应用中。
网络钩子和 JSON 内容
Web 开发中的 Webhook 是一种使用自定义回调来增强或更改网页或 Web 应用程序行为的方法。这些回调可能由第三方用户和开发者维护、修改和管理,他们不一定隶属于原始网站或应用程序。 “webhook”一词是 Jeff Lindsay 在 2007 年从计算机编程术语 hook 中创造出来的。
在计算中,JavaScript Object Notation (JSON) 是一种开放标准的文件格式,它使用人类可读的文本来传输由属性值对和数组数据类型(或任何其他可序列化值)组成的数据对象。它是用于异步浏览器-服务器通信的一种非常常见的数据格式,包括在一些 AJAX 风格的系统中作为 XML 的替代品。
Arduino 的 Google 助理
在这个项目中,我们希望通过从 Google Assistant 向 Arduino 串口发送一个字符串来控制 Arduino 的不同部分,如 I/O 引脚、PWM、串口等。首先,我们需要为 Google Assistant 定义一些特定的短语,以了解我们的意思。然后我们将在 IFTTT 网站上制作一个小程序,并在 Google Assistant 和我们的数据库之间建立连接。之后我们通过 ESP8266 模块从数据库中读取数据并将其发送到 Arduino。让我们开始吧!
电路
实施
首先,您需要一个设备来运行您的 Google 助手。转到 Assistant.google.com 并查看支持该助手的所有设备。在这个项目中,我们使用 Android 手机设备。打开 ifttt.com 并创建一个帐户。登录后,单击“我的小程序”,然后单击“新建小程序”。现在您可以在您的小程序中添加您的服务作为 THIS。点击 THIS 并搜索 Google Assistant。您有 4 种选择来定义您的 google 帮助短语。选择带有数字成分的短语。在下一页中,您可以添加短语。例如,您想说“将引脚 9 的 PWM 设置为 255”。只需输入它作为您的短语并将“255”替换为“#”符号。您可以添加更多具有相同含义的短语,例如“PWM 9 to 255”。现在添加一个响应,以便 Google 助理可以让您知道您的命令已被理解并已采取必要的操作,例如“PWM 已更新”。完成后单击创建触发器。在小程序的“那个”部分,你有很多服务可以选择表单搜索“Webhooks”并选择它。单击“发出 Web 请求”。添加服务器的 URL 以接收数据。在 POST 上设置方法并选择 Application/json 作为内容类型。现在您应该添加内容主体。类似这样的内容:{“Number”:”{ {NumberField}}”}。现在点击“创建操作。”
服务器和数据库
我们为 Server 编写示例代码以从 IFTTT 获取数据并存储在数据库中。您可以更改模型以根据您的兴趣存储数据。从这里下载。
ESP8266 和 Arduino 代码
首先,我们为 ESP-01 编写代码以从数据库中获取数据并通过串口将其发送到 Arduino。然后我们为 Arduino 编写另一个代码以从 ESP-01 获取数据并执行命令(例如更改 PWM)。您可以使用 Arduino IDE 编译这两个代码并将它们上传到板上。
在您可以使用 ArduinoJson 库之前,您必须确保该库已安装在您的计算机上。要进行快速检查,请转到 Arduino IDE 中的库管理器(Sketch> Include Library> Manage Libraries)并在文本框中键入“ArduinoJson”,如果您在名称旁边看到绿色的“INSTALLED”标签图书馆,这意味着你一切顺利,你可以继续下一步。如果您没有看到标签,请单击框/分区一次,您将看到“安装”按钮。点击安装,您就可以进行下一步了。
现在,将此代码上传到 ESP-01
#include "ESP8266WiFi.h"#include "ESP8266HTTPClient.h"#include "ArduinoJson.h"// WiFi参数const char* ssid ="YOUR_SSID";const char* password ="YOUR_PASSWORD";void setup () { Serial.begin(115200); WiFi.begin(ssid, 密码);而(WiFi.status()!=WL_CONNECTED){延迟(1000); Serial.println("连接中..."); }}void loop() { // 检查 WiFi 状态 if (WiFi.status() ==WL_CONNECTED) { HTTPClient http; //HTTPClient类的对象 http.begin("http://yourip/api/Home/GetAllApp"); int httpCode =http.GET(); //检查返回码 if (httpCode> 0) { // 获取请求响应payload String payload =http.getString(); // TODO:解析 Serial.println(payload); } http.end(); //关闭连接 } // 延迟 delay(3000);}
这是 Arduino 从 Google Assistant 获取命令并执行它们的代码。
String inputString =""; // 一个字符串来保存传入的数据字符串 buff;bool stringComplete =false; // 字符串是否为 completebool id;int f,buf;char x;void setup() { // 初始化串行:Serial.begin(9600); // 为 inputString 保留 200 个字节: inputString.reserve(200);}void loop() { // 当换行符到达时打印字符串: if (stringComplete) { while (f <100) { if (inputString.substring( f) =="id") { id =true;休息; } f++; } if (id ==true) { x =inputString.charAt(f + 4); } if (x =='4') { f =0; while (f <100) { if (inputString.substring(f) =="number") { f +=9; for (int i =0; i <3; i++) { if (inputString.charAt(f + i) =='"') i =3; else buff +=inputString.charAt(f + i); } buf =buff.toInt();analogWrite(9, buf); break; } f++; } } // 清除字符串: inputString =""; stringComplete =false; }}void serialEvent() { while (Serial.available()) { // 获取新字节:char inChar =(char)Serial.read(); // 将其添加到 inputString:inputString +=inChar; // 如果传入的字符是换行符,则设置一个标志以便主循环可以 // 做点什么: if (inChar =='\n') { stringComplete =true; } }}
下一步是什么?
您可以根据需要改进此项目。以下是一些建议:
- 尝试添加您喜欢的命令,例如控制输出引脚,您可以使用继电器模块并控制房间的灯光。
- 尝试将数据从 Arduino 发送到 Google Assistant。
制造工艺