×

使用Windows Phone和Intel Edison实现家庭自动化

消耗积分:0 | 格式:zip | 大小:0.07 MB | 2022-10-20

王平

分享资料个

描述

介绍

在最初的项目中,我使用了一个 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 手机应用程序

我们的应用程序将仅包含两个按钮:一个 打开 按钮和一个 关闭 按钮。该应用程序的屏幕截图如下所示。

pYYBAGNQx4uAQL4XAABAAu7rjao346.png
开发的移动应用程序截图
 

您可以忽略注销按钮,实际上,我正在尝试添加一些功能。现在这些按钮会是什么?这将更新“状态” 属性的值。当我们按下按钮时,“状态” 的值为1,否则为 0。 

不过有一点问题。如果什么都没有创建,要更新什么?为此,我们将部署应用程序两次。第一次,我们将创建表并分配一些默认值。下次我们将只更新以前更新的值。

现在,我们的应用程序已准备就绪。测试应用程序并检查“状态”的值是否正在更新。一旦它工作,然后你去。该应用程序已准备就绪。下一部分将集中讨论爱迪生代码。

爱迪生密码

让我们进入爱迪生。在开始为您的 Edison 编写代码之前,请按照 此处提到的初始步骤 配置您的 Edison。连接 Edison 后,记下您的通讯端口号。然后打开您的 Arduino IDE 并从板上选择 Intel Edison。如果您没有找到 Intel Edison 选项,则需要从“ Boards Manager” 选项下载必要的文件。

poYBAGNQx42AOqy8AABzJvpuGWM050.png
董事会经理
 

打开 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)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'使用Windows Phone和Intel Edison实现家庭自动化',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);