首页 > 新闻中心 > 智能机器人网 > 智能机器人

智能家居,人工智能化发展新方向 用微信来控制

    发布时间: 浏览量:
  • 0

       智能家居,人工智能化发展新方向 用微信来控制 来源:赵鹤宇的科技实验室  原标题: 智能家居,用微信控制? 

  微信是腾讯公司推出的一款即时聊天软件,极大程度上方便了我们的生活。大家有没有想过,假如你对微信说一句话,另一边收到你消息的机器人就可以根据你的命令做出相应的反应,为你完成一些任务,现在,有了微信公众平台,我们只需要用开发者文档对其进行开发,即可做出这样一个“智能家居机器人”,而机器人的大脑就是服务器(接收处理命令),机器人的躯干就是Arduino和传感器和执行单元(执行命令)。

  本篇我们不但通过微信对话控制开关灯和获取温湿度。我还将加入一个微信对话获取天气预报,并且做一个微博上很流行的天气预报仪表盘,通过学习,大家可以自由扩展想象,甚至可以做成一个能模拟天气的天气预报鱼缸。

  先总结的需要的物料:Arduino UNO R3(如果有较多传感器,建议mage2560)X1,

  W5100以太网扩展板(W5500等ICSP通讯的拓展板都可以,后面会介绍),多路带光耦隔离继电器,DTH11传感器,led加电阻X1,面包板X1,AC220V电灯泡加底座X1,面包线若干,220V以上耐压电线若干。

  扩展作品所需要的物料:12G小舵机X1,硬纸板,双面胶,彩铅(有3D打印的可以做成塑料的或是其他材料的外壳)。

  所需的软件及环境:arduino IDE(带Ethernet库),SAE,微信公众平台。

  扩展作品所需软件及环境:天气API,Arduino IDE中带Servo库。

  1.硬件搭接,舵机操作

  如图所示,将w5100扩展板搭在Arduino UNO R3上,给DTH11和继电器模块接上5V和CNG供电,DTH11传感器的Dout口接A0,继电器的IN口接D2,COM接5V电,NC接电阻一端,LED负极接GND,和上篇一样,先用LED做测试是安全起见,如果LED测试成功再上220V的灯泡比较保险。舵机有三根线,一般买来的12G小舵机的线材颜色以及引脚都是约定俗成的,中间红色的是Vcc,棕色为GND,黄橙色的为Single。有的同学舵机不同,电压也是不同的,大家可以参考说明书接Vcc和GND,不一定和图中相同,以免烧坏舵机。

  这样硬件就搭接好了,先烧入Blink程序,然后将网络扩展板接上路由器,此时网络扩展板上的PWR,LINK,100M,FULLD灯长亮,说明网络通畅。到现在为止硬件搭接就完成了。

  开关灯和DHT11的用法和程序在上篇已经写过就不再赘述了,如果还有初学不太会的同学可以上百度搜索说明书或者用法。

  控制舵机前先需要掌握舵机的原理,舵机又叫伺服电机,通过PWM信号的占空比来使电机运动到固定角度,所以控制舵机就是控制PWM信号的占空比,控制舵机有三种种方法,第一种是模拟口输出电压,通过for()函数不停地变换产生PWM控制舵机,第二种是通过设置数字口高低电平和延时来输出PWM,这两种方法我不建议,很麻烦,如果没有Servo的同学可以用这两种办法。第三种办法,用Servo库。程序如下:

  #include <Servo.h> //包含Servo库

  Servo myservo;  // 建立一个舵机项目

  // 一个板子上最多能运行12个舵机

  int pos = 0;    //初始化位置为0

  void setup()

  {

  myservo.attach(9);  // 舵机信号线在pin9上

  }

  void loop()

  {

  for(pos = 0; pos <= 180; pos += 1) // 从0到180度  {                                  // 每次增加一度

  myservo.write(pos);              // 告诉舵机要转到的角度

  delay(15);                       // 等待舵机转到位置

  }

  for(pos = 180; pos>=0; pos-=1)     // 再从180-0度

  {

  myservo.write(pos);              // 角度

  delay(15);                       // 等待转到位置

  }

  }

  这段程序是让舵机从0度转到180度,再从180度转到0度,这个可以测试你的舵机。

  2.新浪SAE的搭建

  上篇已经讲过了新浪SAE的搭建,先注册新浪云,用微博就可以注册,注册好后登陆新浪云并进行实名注册,注册后,点击控制台——云应用SAE——添加新应用

  填入自己想要的二级域名,应用名称,描述,运行环境在PHP5.3中找到微信公众平台PHP SDK,方便以后开发微信对话智能家居。到此时,SEA的搭接就完成了。

  4.建立SQL数据库

  在建立数据库之前,先了解微信对话智能家居的过程

  与上一篇有很大的区别,区别在于PHP文件的编辑,上下传的代码和方式不同。打开刚刚建好的SAE控制台,选择“数据库与缓存服务”中的“共享型MySQL”,选择“管理MySQL”将打开SQL管理页面。

  在页面中新建4个数据表格,分别是wxtempsensor,wxhumdsensor,wxswitch,weather。其中wxtempsensor和wxhumdsensor的3个字段为:ID,timestamp,data。wxswitch和waether的字段为ID,timestamp,state。其中ID的插入值为1,类型为int(15)。timestamp的插入值随意,类型为varchar(15)。data和state的插入值都随意,类型也都为int(11)。

  完成后点击执行。(weather是新加的,用于读取天气)

  5.天气API的申请与使用

  API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

  国内有很多天气API的服务器,搜索天气API,可以找到很多,我选用的是百度API商店中的心知天气API,是一个免费的API接口。

  点击获取APIKEY,注册后就可获得一个APIKEY,将这个APIKEY记录下来,我们在后面就可以调用天气了。

  使用API接口,首先需要知道接口的URL,我用的这种接口的URL为:

  http://   apis.  baidu.   com/thinkpage/weather_api/suggestion,请求类型为GET。

  请求数据的请求头是自己的apikey。在URL中需填写数据,可以设置返回数据,如下表:

  Location为查询地,language为语言,unit为返回值得单位,start为开始日期,days为天数,这个API最多可以获取3天的天气数据。

  location 所查询的位置 参数值范围: - 城市ID 例如:location=WX4FBXXFKE4F - 城市中文名 例如:location=北京 - 城市拼音/英文名 例如:location=beijing - 经纬度 例如:location=39.93:116.40 (注意纬度前经度在后,冒号分隔) - IP地址 例如:location=220.181.111.86 - “ip”两个字母 自动识别请求IP地址,例如:location=ip

  language 语言 (可选) 参数值范围: - zh-Hans 简体中文 - zh-Hant 繁体中文 - en 英文 - ja 日语 - de 德语 - fr 法语 默认值:zh-Hans

  unit 单位 (可选) 参数值范围: - c 当参数为c时,温度c、风速km/h、能见度km、气压mb - f 当参数为f时,温度f、风速mph、能见度mile、气压inch 默认值:c  start 起始时间 (可选) 参数值范围: - 日期 例如:start=2015/10/1 - 整数 例如:start=0 代表今天、start=1 代表明天 默认值:0  d

  ays 天数 (可选) 返回从start算起days天的结果。默认为你的权限允许的最多天数。 参数值范围: 整数 例如:days=3 代表3天

  例如URL写为:

  http://apis.baidu.com/thinkpage/weather_api/suggestion?location=shanghai&language=zh-Hans&unit=c&start=0&days=2

  这个将获取上海从今日起未来两天的天气信息,且为中文。

  当API请求发送完毕并且格式完全正确时,API将返回一个Json字符串,json字符串中包含请求的信息。在下面的php中会讲到如何使用json字符串。

  5.PHP文件的编辑

  打开SAE的代码编辑,新建一个index.php的文件。Index就是链接微信平台的一个PHP代码。

  设计代码的思路

  首先应当参阅微信公众平台的开发者手册,直接搜索即可,就在公众平台之下。

  开发者文档是为开发者提供的技术支持,首先我们可以读一下开始前必读中的内容,了解一下开发者的规范,我们开发php文件的第一步,是验证服务器地址的有效性。开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:

  1. 将token、timestamp、nonce三个参数进行字典序排序

  2. 将三个参数字符串拼接成一个字符串进行sha1加密

  3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

  检验signature的PHP示例代码:

  private function checkSignature() {

  $signature = $_GET["signature"];

  $timestamp = $_GET["timestamp"];

  $nonce = $_GET["nonce"];

  $token = TOKEN;  $tmpArr = array($token, $timestamp, $nonce);

  sort($tmpArr, SORT_STRING);

  $tmpStr = implode( $tmpArr );

  $tmpStr = sha1( $tmpStr );

  if( $tmpStr == $signature ){

  return true;

  }

  else{

  return false;

  }

  }

  验证签名后,我们就可以开始开发对话服务了,在开发者文档中,对于消息接收判断有着详细的描述。当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。

  我们需先了解一下微信用来通讯的XML数据包,可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。和刚刚天气API接收的json字符串一样,他们都用于服务器之前传递信息。文本的推送XML数据包结构如下:

  <xml>

  <ToUserName><![CDATA[toUser]]></ToUserName>                                                      <FromUserName><![CDATA[fromUser]]></FromUserName>   <CreateTime>1348831860</CreateTime>

  <MsgType><![CDATA[text]]></MsgType>

  <Content><![CDATA[this is a test]]></Content>

  <MsgId>1234567890123456</MsgId>

  </xml>

  这个XML包的功能信息如下:


  在微信收到了我们指定的命令之后(使用if判断)将修改数据库中的数值。

  上传SQL数据库开灯的PHP代码:

  $sql ="UPDATE wxswitch SET timestamp='$dati',state = '1'WHERE ID = '1'";

  上传SQL数据库关灯的PHP代码:

  $sql ="UPDATE wxswitch SET timestamp='$dati',state = '0'WHERE ID = '1'";

  读取SQL数据库温度信息的PHP代码:

  .

  $result = mysql_query("SELECT * FROM wxtempsensor");

  if ($arr['ID'] == 1) {

  $temp= $arr['data']; }

  读取SQL数据库度信息的PHP代码:

  $result = mysql_query("SELECT * FROM wxtempsensor");

  if ($arr['ID'] == 1) {

  $temp= $arr['data']; }

  在读取SQL后应该将收到的值写入变量,并且回复一个消息告诉用户,在修改过SQL后(开关灯)也应该回复一个消息给用户表明成功执行命令。在开发者文档中可以看到,当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。

  回复文本消息需要的XML数据包结构如下:

  <xml>

  <ToUserName><![CDATA[toUser]]></ToUserName>

  <FromUserName><![CDATA[fromUser]]></FromUserName>

  <CreateTime>12345678</CreateTime>

  <MsgType><![CDATA[text]]></MsgType>

  <Content><![CDATA[你好]]></Content>

  </xml>

  回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)

  在处理天气信息时,需要先写请求,请求的写法在介绍API的一项中已经说过,下面是PHP请求天气API(百度API商店中的免费心和天气API)的代码:

  $ch = curl_init();

  $url = 'http://apis.baidu.com/thinkpage/weather_api/suggestion?location=beijing&language=zh-Hans&unit=c&start=0&days=3';

  $header = array(

  'apikey: 您自己的apikey',

  );

  // 添加apikey到header

  curl_setopt($ch, CURLOPT_HTTPHEADER  , $header);

  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

  // 执行HTTP请求

  curl_setopt($ch , CURLOPT_URL , $url);

  $res = curl_exec($ch);

  请求的返回值是json字符串,并且在上面的代码中,字符串储存在res变量中,先来了解一下返回的json字符串,先在SAE中新建一个任意名字的php文件,写入代码:

  <?php

  $ch = curl_init();

  $url = 'http://apis.baidu.com/thinkpage/weather_api/suggestion?location=beijing&language=zh-Hans&unit=c&start=0&days=3';

  $header = array(

  'apikey: 您自己的apikey',

  );

  // 添加apikey到header

  curl_setopt($ch, CURLOPT_HTTPHEADER  , $header);

  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

  // 执行HTTP请求

  curl_setopt($ch , CURLOPT_URL , $url);

  $res = curl_exec($ch);

  echo $res

  ?>

  然后从浏览器中打开你的URL/名字.php

  里面显示的就是返回的json字符串,实例如下:

  {

  "results": [{

  "location": {

  "id": "WX4FBXXFKE4F",

  "name": "北京",

  "country": "CN",

  "path": "北京,北京,中国",

  "timezone": "Asia/Shanghai",

  "timezone_offset": "+08:00"

  },

  "daily": [{                         //返回指定days天数的结果

  "date": "2015-09-20",             //日期

  "text_day": "多云",               //白天天气现象文字

  "code_day": "4",                  //白天天气现象代码

  "text_night": "晴",               //晚间天气现象文字

  "code_night": "0",                //晚间天气现象代码

  "high": "26",                     //当天最高温度

  "low": "17",                      //当天最低温度

  "precip": "0",                    //降水概率,范围0~100,单位百分比

  "wind_direction": "",             //风向文字

  "wind_direction_degree": "255",   //风向角度,范围0~360

  "wind_speed": "9.66",             //风速,单位km/h(当unit=c时)、mph(当unit=f时)

  "wind_scale": ""                  //风力等级

  }, {

  "date": "2015-09-21",

  "text_day": "晴",

  "code_day": "0",

  "text_night": "晴",

  "code_night": "0",

  "high": "27",

  "low": "17",

  "precip": "0",

  "wind_direction": "",

  "wind_direction_degree": "157",

  "wind_speed": "17.7",

  "wind_scale": "3"

  }, {

  ...                               //更多返回结果

  }],

  "last_update": "2015-09-20T18:00:00+08:00" //数据更新时间(该城市的本地时间)

  }]

  }

  获取后的json串并不能被直接读取,需要将它进行转化,这里需要用到json_decode()函数,将变量res中的json字符串转化为数组,于是在刚刚的代码中加入:

  $res_decode = json_decode($res);

  Echo $res_decode;

  将在php页面上显示被decode过的json字符串,就是一个数组;

  从数组中调用对应的值赋值到变量并且显示即可。为方便得知天气,这个API加入了code,就是天气代码,可以再心知天气的开发者文档中找到,但是将近多达39个天气代码,由于很多是相似或者本地区不常见的,所以我将他们归为9类,方便使用。前面在SQL中建立了有wxweather库,于是可以更新天气代码到state,更新代码如下:

  $sql ="UPDATE wxweather SET timestamp='$dati',state = '$weather_code'WHERE ID = '1'";

  Index文件写完后,我们还需要修改上一篇文章里建立的upload.php

  上传SQL数据库温度信息的PHP代码:

  $sql ="UPDATE wxtempsensor SET timestamp='$dati',data = '$温度变量'WHERE ID = '1'";

  上传SQL数据库温度信息的PHP代码:

  $sql ="UPDATE wxhumdsensor SET timestamp='$dati',state = '$湿度变量'WHERE ID = '1'";

  读取SQL数据库开或关灯的代码:

  $result = mysql_query("SELECT * FROM switch");

  if ($arr['ID'] == 1) {

  $light = $arr['state'];

  }

  在原理上与上篇更新数据库相同。

  6.微信公众平台的搭建

  搜索微信公众平台,先创建一个微信公众平台,点击立即注册输入自己的邮箱,然后设置一个密码,接下来会有一个邮箱激活的过程,在邮箱激活了过后,将选项类型,这里我们选订阅号,然后会有一些信息登记的过程。

  注册成功后,即可登录公众号。

  点击公众号设置中的设置微信号。设置完毕后点击开发者中心,开启开发者模式,然后点击修改配置。

  这里的URL就填自己的URL,token相当于一个配对码,在index上写的token值要与这里的相同,填写完毕后,速记生成一个encodingAESKey,并且点击提交,然后点击启用。

  7.Arduino端编程

  在温度湿度上传和开关灯方面与上一篇是完全相同的。

  实际上,我们在获取天气后,可以将天气转化为代码,比如晴是1,一共有9种天气,当arduino收到1时,直接将如下代码加入程序:

  Int pos = 0;

  Int weather_code = 1;

  Pos = weather_code*20;

  Myservo.write(pos)

  加入程序后,weather_code就是我们获取的天气代码,晴天时会转到20度,因为有九种天气,每种20度的间隔,大家可以提前在纸盘或者3D打印作品上画好天气图标,当获得天气信息时将会指向相应的天气,当然大家可以扩展更多的方面,必须做一个天气灯,不同的天气不同的变化,亦或是控制更多设备,水雾装置,闪光灯,LED来在鱼缸或者瓶罐中模拟出天气情况,着实是一件很酷的事情!

  8.加入一个语音助手

  和机器人打字是一件痛苦的事情,直接语音识别控制将会使智能家居更加方便快捷。

  首先登陆微信公众平台,点击开发中的接口权限,会发现有一项接收语音识别结果。

  如果是关闭的请在操作中打开。

  开通语音识别功能,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段。(由于客户端缓存,开启或者关闭语音识别功能,对新关注者立刻生效,对已关注用户需要24小时生效。可以重新关注此帐号进行测试.)开启           语音识别后的语音XML数据包如下:

  <xml>

  <ToUserName><![CDATA[toUser]]></ToUserName>

  <FromUserName><![CDATA[fromUser]]></FromUserName>

  <CreateTime>1357290913</CreateTime>

  <MsgType><![CDATA[voice]]></MsgType>

  <MediaId><![CDATA[media_id]]></MediaId>

  <Format><![CDATA[Format]]></Format>

  <Recognition><![CDATA[智能家居]]></Recognition>

  <MsgId>1234567890123456</MsgId>

  </xml>

  当消息为语音时加入语音识别代码:

  if($msgType == 'voice') {

  $content = $postObj->Recognition;

  }elseif($msgType == 'text'){

  $content = $postObj->Content;

  }else{

  $content= '只支持文本和语音消息';

  }

  7.实物制作

  测试用的LED如果确定无误,则可以换上AC220V的电灯。原来的LED的负极接地线,火线接继电器NC,输入的火线接继电器COM。即可实现和小LED一样的功能。切勿短接!

声明:
分享知识,勿忘初创!
电器吧内容大部分均为自己原创,欢迎转载,请注明出处,页面永久链接http://www.dianqi8.cn/pro/yenei/1451.html

猜您想看