风筝
发表于: 2019-1-13 17:39:33 | 显示全部楼层

在本篇文章中,我们将学习如何在互联网服务和Arduino开发板之间建立连接。在本文结束时,您将:

●    了解如何从Google Assistant获取数据

●    了解如何使用IFTTT协议。

●    熟悉webhooks和http请求。

●    能够和你的Arduino开发板对话。

wwwwwwww.gif


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应用程序中。

Untitled-1-Recovered.jpg


Webhook和JSON内容

Web开发中的webhook是一种使用自定义回调来增强或改变网页或Web应用程序行为的方法。这些回调可能由第三方用户和开发人员维护、修改和管理,这些用户和开发人员可能不一定与原始网站或应用程序相关联。术语“webhook”是Jeff Lindsay在2007年从计算机编程术语钩子中创造出来的。


在计算中,JavaScript Object Notation(JSON)是一种开放标准文件格式,它使用人类可读的文本来传输由属性 - 值对和数组数据类型(或任何其他可序列化值)组成的数据对象。它是一种非常常见的数据格式,用于异步浏览器 - 服务器通信,包括在某些AJAX风格的系统中替代XML。

Untitled-1-Recoveresd.jpg


Arduino的Google Assistant

在本篇文章中,我们希望通过从Google Assistant发送字符串到Arduino串口来控制Arduino的不同部分,如I / O引脚、PWM、串口等。首先,我们需要为Google Assistant定义一些特定的短语,以找出我们的意思。然后我们将在IFTTT网站上创建一个applet,并在google Assistant和我们的数据库之间建立连接。之后我们通过ESP8266模块从数据库中读取数据并将其发送到Arduino。让我们开始吧!


所需的组件

●    Arduino UNO R3开发板

●    带有PCB天线的ESP8266 WiFi模块

ga.jpg


电路连接方式

Untitled-1.jpg


实现过程

首先,您需要一台设备才能运行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”,如果在库名称旁边看到绿色的“已安装”标签,这意味着你很高兴,你可以继续下一步。如果您没有看到标签,请单击框,您将看到“安装”按钮。点击安装,你就可以完成下一步了。

FPIUT4RJB6UDYIC.LARGE_.jpg


现在,将以下代码上传到ESP-01

  1. #include "ESP8266WiFi.h"
  2. #include "ESP8266HTTPClient.h"
  3. #include "ArduinoJson.h"

  4. // WiFi Parameters
  5. const char* ssid = "YOUR_SSID";
  6. const char* password = "YOUR_PASSWORD";

  7. void setup() {
  8.   Serial.begin(115200);
  9.   WiFi.begin(ssid, password);

  10.   while (WiFi.status() != WL_CONNECTED) {
  11.     delay(1000);
  12.     Serial.println("Connecting...");
  13.   }
  14. }

  15. void loop() {
  16.   // Check WiFi Status
  17.   if (WiFi.status() == WL_CONNECTED) {
  18.     HTTPClient http;  //Object of class HTTPClient
  19.     http.begin("http://31.184.135.137/api/Home/GetAllApp");
  20.     int httpCode = http.GET();
  21.     //Check the returning code                                                                  
  22.     if (httpCode > 0) {
  23.       // Get the request response payload
  24.       String payload = http.getString();
  25.       // TODO: Parsing
  26.       Serial.println(payload);
  27.     }
  28.     http.end();   //Close connection
  29.   }
  30.   // Delay
  31.   delay(3000);
  32. }
复制代码

以下是Arduino的代码,可以从Google Assistant获取指令,并执行它们。

  1. String inputString = "";         // a String to hold incoming data
  2. bool stringComplete = false;  // whether the string is complete
  3. int f;
  4. char x;
  5. bool id;
  6. String buff;
  7. int buf;

  8. void setup() {
  9.   // initialize serial:
  10.   Serial.begin(9600);
  11.   // reserve 200 bytes for the inputString:
  12.   inputString.reserve(200);
  13. }

  14. void loop() {
  15.   // print the string when a newline arrives:
  16.   if (stringComplete) {

  17.     while (f < 100)
  18.     { if (inputString.substring(f) == "id")
  19.       {
  20.         id = true;
  21.         break;
  22.       } f++;
  23.     }

  24.     if (id == true)
  25.     {
  26.       x = inputString.charAt(f + 4);
  27.     }
  28.     if (x == '4')
  29.     { f = 0;
  30.       while (f < 100)
  31.       { if (inputString.substring(f) == "number")
  32.         { f += 9;
  33.           for (int i = 0; i < 3; i++)
  34.           { if (inputString.charAt(f + i) == '"') i = 3;
  35.             else buff += inputString.charAt(f + i);
  36.           }
  37.           buf = buff.toInt();
  38.           analogWrite(9, buf);
  39.           break;
  40.         }
  41.         f++;
  42.       }
  43.     }

  44.     // clear the string:
  45.     inputString = "";
  46.     stringComplete = false;
  47.   }
  48. }

  49. void serialEvent() {
  50.   while (Serial.available()) {
  51.     // get the new byte:
  52.     char inChar = (char)Serial.read();
  53.     // add it to the inputString:
  54.     inputString += inChar;
  55.     // if the incoming character is a newline, set a flag so the main loop can
  56.     // do something about it:
  57.     if (inChar == '\n') {
  58.       stringComplete = true;
  59.     }
  60.   }
  61. }
复制代码

接下来的事情?

您可以根据需要改进此项目。 以下是一些建议:

●    尝试添加您最喜欢的命令,如控制输出引脚,您可以使用继电器模块并控制房间灯光。

●    尝试将数据从Arduino开发板发送到Google Assistant。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-25 21:44 , Processed in 0.059672 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表