介绍
在最初的项目中,我使用了一个 LED,但当然你可以连接一个 5V 继电器来完成家庭自动化的工作。
请注意,这是我写的原始文章的一部分,并发布在
本文将指导您完成将 Edison 与 Windows Azure 连接的过程,以及如何做一些很酷的事情,例如控制它。此示例将仅打开和关闭连接到 Edison 板上与 Arduino 分线板配对的任何数字引脚的 LED。让我们看看它是如何工作的。Azure 移动服务将充当 Edison 和控制器之间的桥梁(此处使用 Windows 手机应用程序)。Edison 将从移动服务表中读取属性值。Windows 手机应用程序将更新表中的值,因此我们将根据值对 Edison 代码进行更改。
先决条件
假定读者具有 Windows 手机应用程序开发的基本知识,并且可以将应用程序与 Azure 移动服务连接起来。如果您不熟悉为您的应用创建后端,请浏览此 链接。
首先,让我们创建一个 Azure 移动服务。 有很多关于创建 Azure 移动服务的文章。按照此 链接 创建一个包含单个表的移动服务,并将其命名为 controltable 。该表将包含一个名为“ status ”的列和另一个名为“ name ”的列。status列的值 将是 1 或 0,而 name 的值将设置为 Edison/Arduino。
现在我们将开发一个将添加/修改属性值的 Windows 手机应用程序。下图为我们展示了 Azure sql 表的截图。请注意,“设备”的属性值无关紧要。如果您愿意,您甚至可以排除此属性。
下一节将讨论 Windows 手机应用程序的开发。
Windows 手机应用程序
我们的应用程序将仅包含两个按钮:一个 打开 按钮和一个 关闭 按钮。该应用程序的屏幕截图如下所示。
您可以忽略注销按钮,实际上,我正在尝试添加一些功能。现在这些按钮会是什么?这将更新“状态” 属性的值。当我们按下按钮时,“状态” 的值为1,否则为 0。
不过有一点问题。如果什么都没有创建,要更新什么?为此,我们将部署应用程序两次。第一次,我们将创建表并分配一些默认值。下次我们将只更新以前更新的值。
现在,我们的应用程序已准备就绪。测试应用程序并检查“状态”的值是否正在更新。一旦它工作,然后你去。该应用程序已准备就绪。下一部分将集中讨论爱迪生代码。
爱迪生密码
让我们进入爱迪生。在开始为您的 Edison 编写代码之前,请按照 此处提到的初始步骤 配置您的 Edison。连接 Edison 后,记下您的通讯端口号。然后打开您的 Arduino IDE 并从板上选择 Intel Edison。如果您没有找到 Intel Edison 选项,则需要从“ Boards Manager” 选项下载必要的文件。
打开 Arduino IDE 后,前面会提到两个函数:Void setup() 和 void loop()。爱迪生有一个内置的 Wi-Fi。我们将使用 Wi-Fi 将其连接到 Internet。所以我们的第一个行动是包含一个用于 Wi-Fi 的库。转到 Sketch ,包括库,然后 是 Wi-Fi 。之后,让我们添加此代码以将其连接到 Wi-Fi。
#include
#include
#include
char ssid[] = "avirup171"; // your network SSID (name)
char pass[] = "avirupbasu"; // your net ork password (use for WPA, or use as key for WEP)
int keyIndex = 0; // your network key Index number (needed only for WEP)
void setup()
{
pinMode(13,OUTPUT);
digitalWrite(13,HIGH);
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// check for the presence of the shield:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
// don't continue:
while(true);
}
String fv = WiFi.firmwareVersion();
if( fv != "1.1.0" )
Serial.println("Please upgrade the firmware");
// attempt to connect to Wifi network:
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
status = WiFi.begin(ssid, pass);
}
}
上面的代码负责通过 Wi-Fi 将 Edison 连接到互联网。此外,我们已将 PIN 13 设置为输出模式,当前状态为关闭。我们将使用 IDE 的串行监视器来监视该过程。现在,让我们转到 void loop()。从 Azure 检索数据是通过 http get 方法完成的。
void loop()
{
send_request();
wait_response();
read_response();
end_request();
delay(100);
}
这些函数将从 Azure 表中检索数据。但是在深入研究这些方法之前,我们需要添加一些全局变量来将我们的 Edison 链接到 Azure 服务。添加这些全局变量:
const char* server= "server name URL"; //service URL
const char* table_name= "Table name"; //Table name
const char* ams_key="Your application key";
char buffer[150];
应用程序密钥可以在 Azure 门户的管理密钥按钮中找到。现在,我们将为 void loop() 中的方法编写代码。
我们执行了一个 HTTP 请求并调用了 GET,我们之前已经指出了表的名称、服务器的名称和代码键;这允许正确检索数据。然后我们指定需要以什么格式检索数据并将其指定为 JSON。让我们为 wait_response() 编写代码。
然后我们需要读取检索到的数据。由于它是 JSON 格式,我们需要解析 JSON 字符串以获得我们想要的值。下面是示例字符串的示例。
{"id":"2492D996-C471-48F0-B3C9-F33E3B37477F","status":"0","name":"arduino"}
存在一个非常高效的库,称为 ArduinoJson。这将完成大部分解析。但是检索到的 JSON 字符串包含在 '[' 和 ']' 中。必须删除这些才能使库正常工作。因此,首先您需要在代码中包含该库并添加以下全局变量并添加:
#include
#define RESPONSE_JSON_DATA_LINENNO 10
int charIndex=0;
StaticJsonBuffer<200> jsonbuffer;
然后在您的read_response() 方法 中编写以下代码 :
void read_response()
{
boolean bodyStarted;
int jsonStringLength;
int jsonBufferCntr=0;
int numline=RESPONSE_JSON_DATA_LINENNO;
//Ignore the response except for the 10th line
while (client.available())
{
//Serial.println("Reading:");
char c = client.read();
if (c == '\n')
{
numline -=1;
}
else
{
if (numline == 0 && (c!='[')&& (c!=']') )
{
buffer[jsonBufferCntr++] = c;
buffer[jsonBufferCntr] = '\0';
}
}
}
Serial.println("Received:");
Serial.println(buffer);
Serial.println("");
parse();
}
上面的代码将读取响应,解析方法负责解码字符串。parse() 方法如下所示。在 parse() 方法本身中,我们将更改 PIN8 的状态。
void parse()
{
StaticJsonBuffer<150> jsonbuffer;
JsonObject& root = jsonbuffer.parseObject(buffer);
if(!root.success())
{
Serial.println("PARSING FAILED!!!");
return;
}
int f= root["status"];
Serial.println("Decoded: ");
Serial.println(f);
if(f==0)
digitalWrite(8,LOW);
else
digitalWrite(8,HIGH);
}
这里,在上面的代码中,f存储了status的属性值。然后,我们检查 f 的值并最终将 PIN 设置为 HIGH 或 LOW。
有关 ArduinoJson 库的详细文档,请访问此链接。但是,这个库有一点问题。稍后将讨论。现在,我们将编写剩余方法的代码。
现在,您将看到,当您编译代码时,您很可能会遇到一些错误。这些错误需要被删除。在进一步移动之前,请查看此问题。文件 WString.h 遗漏了一些代码行。区别可以看这里。您需要更新位于此处的文件。C:\Users\Username\AppData\Roaming\Arduino15\packages\Intel\hardware\i686\1.6.2+1.0\cores\arduino\WString.h
更新后您的错误将得到解决。编译代码后,将其刻录到您的 Edison 中,然后您就完成了。当代码在您的 Edison 中烧毁时,取一个 LED,并将 LED 的较长腿连接到 PIN13,将较短的腿连接到 Gnd。较长的腿可以添加一个可选的 233 欧姆电阻器。因此,我们通过 Windows Azure 控制的 Windows Phone 控制 Edison 已经准备就绪。
下面附有一段视频,显示了它的功能,但 LED 连接到引脚 13。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !