|
在本篇文章中,我们将学习如何在互联网服务和Arduino开发板之间建立连接。在本文结束时,您将: ● 了解如何从Google Assistant获取数据 ● 了解如何使用IFTTT协议。 ● 熟悉webhooks和http请求。 ● 能够和你的Arduino开发板对话。
Google Assistant和IFTTT小程序 Google Assistant智能助理是由谷歌开发的一款基于人工智能的虚拟助手,主要适用于移动和智能家居设备。与Google公司以前的虚拟助手Google Now不同,Google Assistant可以进行双向对话。它可以比任何设备更好地识别您的语言,并快速正确地响应您的命令。用户主要通过自然语音与Google Assistant进行交互,但也支持键盘输入。与Google Now相同的性质和方式,Assistant可以搜索互联网、安排事件和设置闹钟,调整用户设备上的硬件设置,以及显示用户Google帐户的信息。谷歌还宣布,Assistant将能够通过设备的摄像头识别物体并收集视觉信息,支持购买产品和汇款,以及识别歌曲。
If This Then That,也称为IFTTT,是一个免费的基于Web的服务,用于创建简单条件语句链,称为applet。applet由其他Web服务(如Gmail、Facebook、Telegram、Instagram或Pinterest)中发生的更改触发。例如,如果用户使用标签进行推文,则applet可以发送电子邮件消息,或者如果有人在照片中标记用户,则applet可以将Facebook上的照片复制到用户的存档。除了基于Web的应用程序,该服务还可以在iOS和Android上运行。 2015年2月,IFTTT将其原始应用程序重命名为IF,并发布了一套名为Do的新应用程序,可让用户创建快捷方式应用程序和操作。截至2015年,IFTTT用户每天创建约2000万个recipes。 Do套件应用程序的所有功能都已集成到重新设计的IFTTT应用程序中。
Webhook和JSON内容 Web开发中的webhook是一种使用自定义回调来增强或改变网页或Web应用程序行为的方法。这些回调可能由第三方用户和开发人员维护、修改和管理,这些用户和开发人员可能不一定与原始网站或应用程序相关联。术语“webhook”是Jeff Lindsay在2007年从计算机编程术语钩子中创造出来的。
在计算中,JavaScript Object Notation(JSON)是一种开放标准文件格式,它使用人类可读的文本来传输由属性 - 值对和数组数据类型(或任何其他可序列化值)组成的数据对象。它是一种非常常见的数据格式,用于异步浏览器 - 服务器通信,包括在某些AJAX风格的系统中替代XML。
Arduino的Google Assistant 在本篇文章中,我们希望通过从Google Assistant发送字符串到Arduino串口来控制Arduino的不同部分,如I / O引脚、PWM、串口等。首先,我们需要为Google Assistant定义一些特定的短语,以找出我们的意思。然后我们将在IFTTT网站上创建一个applet,并在google Assistant和我们的数据库之间建立连接。之后我们通过ESP8266模块从数据库中读取数据并将其发送到Arduino。让我们开始吧!
所需的组件 ● Arduino UNO R3开发板 ● 带有PCB天线的ESP8266 WiFi模块
电路连接方式
实现过程 首先,您需要一台设备才能运行Google Assistant。转到assistant.google.com并查看支持该助手的所有设备。在本篇文章中,我们使用Android手机设备。打开ifttt.com并创建一个帐户。登录后,单击“我的小程序”,然后单击“新建小程序”。现在,您可以在applet中将此服务添加为此项。点击此处并搜索Google Assistant。您有4种选择来定义谷歌助手的短语。选择带有数字成分的短语。在下一页中,您可以添加短语。例如,您想说“将引脚9的PWM设置为255”。只需将其键入为您的短语,并将“255”替换为“#”符号。您可以添加更多具有相同含义的短语,例如“PWM 9到255”。现在添加一个响应,以便Google Assist可以让您知道您的命令已被理解并采取了必要的操作,例如“PWM已更新”。完成后,单击“创建触发器”。在你的applet的“THAT”部分,你有很多服务可以选择表格搜索“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”,如果在库名称旁边看到绿色的“已安装”标签,这意味着你很高兴,你可以继续下一步。如果您没有看到标签,请单击框,您将看到“安装”按钮。点击安装,你就可以完成下一步了。
现在,将以下代码上传到ESP-01 - #include "ESP8266WiFi.h"
- #include "ESP8266HTTPClient.h"
- #include "ArduinoJson.h"
-
- // WiFi Parameters
- const char* ssid = "YOUR_SSID";
- const char* password = "YOUR_PASSWORD";
-
- void setup() {
- Serial.begin(115200);
- WiFi.begin(ssid, password);
-
- while (WiFi.status() != WL_CONNECTED) {
- delay(1000);
- Serial.println("Connecting...");
- }
- }
-
- void loop() {
- // Check WiFi Status
- if (WiFi.status() == WL_CONNECTED) {
- HTTPClient http; //Object of class HTTPClient
- http.begin("http://31.184.135.137/api/Home/GetAllApp");
- int httpCode = http.GET();
- //Check the returning code
- if (httpCode > 0) {
- // Get the request response payload
- String payload = http.getString();
- // TODO: Parsing
- Serial.println(payload);
- }
- http.end(); //Close connection
- }
- // Delay
- delay(3000);
- }
复制代码以下是Arduino的代码,可以从Google Assistant获取指令,并执行它们。 - String inputString = ""; // a String to hold incoming data
- bool stringComplete = false; // whether the string is complete
- int f;
- char x;
- bool id;
- String buff;
- int buf;
-
- void setup() {
- // initialize serial:
- Serial.begin(9600);
- // reserve 200 bytes for the inputString:
- inputString.reserve(200);
- }
-
- void loop() {
- // print the string when a newline arrives:
- if (stringComplete) {
-
- while (f < 100)
- { if (inputString.substring(f) == "id")
- {
- id = true;
- break;
- } 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++;
- }
- }
-
- // clear the string:
- inputString = "";
- stringComplete = false;
- }
- }
-
- void serialEvent() {
- while (Serial.available()) {
- // get the new byte:
- char inChar = (char)Serial.read();
- // add it to the inputString:
- inputString += inChar;
- // if the incoming character is a newline, set a flag so the main loop can
- // do something about it:
- if (inChar == '\n') {
- stringComplete = true;
- }
- }
- }
复制代码
接下来的事情? 您可以根据需要改进此项目。 以下是一些建议: ● 尝试添加您最喜欢的命令,如控制输出引脚,您可以使用继电器模块并控制房间灯光。 ● 尝试将数据从Arduino开发板发送到Google Assistant。 |