查看: 5767|回复: 17

dexinHome——让微信小程序操作智能家居

[复制链接]
本帖最后由 dexin 于 2018-2-9 20:25 编辑

还是!戳出一枚演示视频~

设备的接入就不演示了哈哈~大家可以直接体验小程序~
几天前,dexin终于回到老家——寒冷又熟悉的辽宁啦!本着不作死就赖床的核心思想,本宝怎么能闲着,在老家房子里转悠一圈吼,我决定:我要给老家房子布置上智能家居!让爸妈也感受下新科技~
一提到DIY智能家居,相信很多人想到的核心就是hassio或者hassbian吧~但是我这次毅然决然的放弃了,因为我希望能够通过这次配置实现自己的“生态”~所以,开始作死吧~
Step1 下位机的电路设计:
  • 220VAC-5VDC-3V3DC供电
  • 继电器
  • 一个非接触式开关
  • 程序烧录/调试接口
  • 意外情况设计
  • 自诊断
电源转换出于安全考虑我选择购买成型模块,5V-3V3我采用AMS1117-3.3
截图201802091647346146.png

继电器我采用S8050做驱动,1N4007卸流:
截图201802091648049844.png

之所以采用非接触开关是因为:
  • 理论上非接触元件寿命无限长
  • 更加适合在家中使用:因为家中是厨房和浴室的,这两个地方有一个明显的特点:手比较湿或者比较脏,在这种情况下非接触就比较必要了。
  • 科技感十足啊 哈哈哈
截图201802091648198375.png

程序烧录和调试接口我采用网线接口:
  • 我的MCU使用了ESP-12E,考虑到220VAC-5VDC模块可能会发生失效,我利用RJ45提供一个外部5V做备用调试电源
  • D4接非接触开关,硬件反馈非接触开关信号
  • D13接继电器状态反馈端,硬件反馈继电器状态

截图201802091648416530.png
对于意外情况
  • 当电源转换失效时,可采用通过RJ45外部5V供电
  • 当MCU故障是,可通过单刀开关强制跳通继电器闭合,强制开关上拉至5V以保证AMS1117-3.3V不工作时,依然可以保证强制跳通
  • 但是依然无法解决继电器损坏或者S8050损坏的问题(设备寿命短板)
截图201802091649336028.png

设备自检利用的是TLP521光耦反馈和调试接口,设计这个的主要目的是:我大部分时间在西安上学,让爸妈在修理电路就是等价于让客户自己修理,这就显得不是很智能。
使用另外一个硬件直接从上位操作实现设备自动诊断和外部诊断,对于用户(爸妈)必然是科技感十足,幸福感安全感满满啊哈哈~
截图201802091649157727.png
之后就是让人又痛又爱的布线
  • AD的快捷键一定要记住,效率高~(bilibili上有一个小哥讲得,确实不错)
  • teardrop推荐添加~
截图201802091651069518.png


之后就是下单等货和焊接各种元件~来一个三兄弟的 hhh 当然还是要提供几个sensor的,现在我用了DHT11和光强传感器各一个~
p.s. 硬件电路的一个大难点我认为妥妥地是焊接啊。。五个板子焊了快一天。。
截图201802091651418787.png
9566467F8B0D0CB37AA500E9001A791B.png

Step2 服务器:

服务器我采用了京东云主机。服务器的搭建什么的我在这就不多说了 我才用的是Ubuntu+Nginx+Mysql+Eggjs,不得表扬一下Egg的安全性~Egg的官方API

为什么我要自己搭这个物联网服务器呢,说实话是有点鬼畜的,但是因为微信小程序是要求https加密的,这就相当于直接封杀了一些比较亲民好用的物联网平台,再有,我懒得研究其他平台的协议,我就是想配置几个开关读文档犯不上 哈哈哈

Egg响应GET在router.js中,我们把需要的请求根配置进去
我在这里分别提供了微信小程序的接口、设备状态响应的接口等等
截图201802091655528157.png

以及完成相应的请求响应(友情提醒,关爱服务器,谨防注入 哈哈)
举个栗子~用户请求切换开关状态的响应代码
[JavaScript] 纯文本查看 复制代码
async devSttChg() { [/align][align=left]        let result = await this.ctx.service.devices.updateChange(this.ctx.query);
        if (result.affectedRows === 1) 
            this.ctx.body = 'success';
        else 
            this.ctx.body = 'fail';
    }
服务器这边给小程序提供设备注册,用户注册,用户界面参数这些信息的处理接口;
给ESP-12E提供的是传感器状态上传接口、继电器状态上传接口,继电器用户请求接口。
基本思路是绑定获取微信用户的openID到一个deviceCenterId,绑定该用户注册的设备的deviceItsId到deviceCenterId。
拥有相同deviceCenterId的用户可以获得绑定在deviceCenterId下所有deviceItsId对应设备的使用权限。
这样就实现了设备中心分管~当然还缺少一些权限的设定,比如我老妈不希望让我控制主卧的照明,她应该可以对这个设备移除我的控制权限。这部分具体的操作我还没有太想好 哈哈
这是数据库的配置,设置deviceItsId为主key~
截图201802091656239385.png

Step3 Arduino下位机:


这部分代码我已经git,给大家做个参考~dexinHome
这里应该修改为服务器的公网IP,状态请求GET接口和开/关GET接口
[C] 纯文本查看 复制代码
#define REQ_CODE  "/****?****=****"
#define REQ_OFF   "/****?****=****"
#define REQ_ON    "/****?****=****"
#define HOST_IP   "**.**.**.**"


ESP-12E对服务器状态请求后对继电器的操作。
[C] 纯文本查看 复制代码
if ((WiFiMulti.run() == WL_CONNECTED)) {
      HTTPClient http;
      http.begin(HOST_IP, 7001, REQ_CODE);
      int httpCode = http.GET();
      if (httpCode) {
        if (httpCode == 200) {
          String httpPayload = http.getString();
          DynamicJsonBuffer jsonBuffer;
          JsonObject& root = jsonBuffer.parseObject(httpPayload);
          int value = root[String("val")];
          digitalWrite(pError, LOW);

          if (value >= 125)
            digitalWrite(pRelay, HIGH);
          else
            digitalWrite(pRelay, LOW);
        }
      }
      else
        digitalWrite(pError, HIGH);
    }
    else
      digitalWrite(pError, HIGH);
  }


继电器状态反馈
[C] 纯文本查看 复制代码
if (digitalRead(swRelay) == 0)
      digitalWrite(pState, HIGH);
    else
      digitalWrite(pState, LOW);


用户触碰开关灯软响应
[C] 纯文本查看 复制代码
thisUserSwState = digitalRead(swUser);
    if (millis() - timeBgNoReadSw > noneReadSwithMs) {
      if (lastUserSwState != thisUserSwState)
      {
        if (thisUserSwState == false) {
          timeBgNoReadSw = millis();
          if ((WiFiMulti.run() == WL_CONNECTED)) {
            HTTPClient http;
            if (digitalRead(swRelay))
              http.begin(HOST_IP, 7001, REQ_ON);
            else
              http.begin(HOST_IP, 7001, REQ_OFF);
            int httpCode = http.GET();
            if (httpCode) {
              if (httpCode == 200) {
                String httpPayload = http.getString();
                Serial.println(httpPayload);
              }}}
          digitalWrite(pRelay, digitalRead(swRelay));//protect from unlink wi-fi
        }}}
    lastUserSwState = thisUserSwState;
    delay(1);
  }


呼吸灯,防止在黑暗环境中找不到开关位置。
[C] 纯文本查看 复制代码
analogWrite(pBreath, 125 * sin(0.002 * millis()) + 130);


Step4 微信小程序:

虽然是造轮子,但是一个比较合理的用户界面哪那是不能少滴
首先是用户注册,参考weixin API配置好openID获取方法,授权等等,当然还是要象征性的需要一下用户同意自愿使用哈哈哈。
用户需要填写的设备认证号就是deviceCenterID,用来验证用户组。当然这部分需要检验deviceCenterID单一性。
截图201802091719371090.png

完成身份的验证后进入控制台:
接下来就是获取当前绑定在该用户关联的deviceCenterID下的全部设备 获取名称,状态等等
[JavaScript] 纯文本查看 复制代码
wx.request({
              url: 'https://www.***.***/****',
              data: {
                ***: wxmlData.data.***
              },
              success: function (res) {
                let statusData = res.data;
                wxmlData.setData({
                  switchRooms: statusData
                });
              },
            })

当然也要防止潜在bug造成的页面错跳,就算跳错了,只要没有注册还是会跳回注册页面
[JavaScript] 纯文本查看 复制代码
let openID = await wx.getStorageSync('openid');
    wx.request({
      url: 'https://www.***.***/***',
      data: {
        ***: openID
      },
success: function (res) {
        if (res.data.regist) {
/*...*/
}
 else {
          wx.showLoading({
            title: '请先完成验证',
          });
          setTimeout(function () {
            wx.hideLoading()
            wx.navigateTo({
              url: '../reg/reg'
            })

新设备接入,采用读取二维码的方式:既利用了小程序读取二维码比较方便的优势,又保证关键信息(设备ID和设备类型)不会出现失误。同时校验二维码信息,防止用户错误扫描~(永远不要相信您的用户 hhh 后期二维码我会添加加密措施,进一步防止注入可能)

截图201802091729265912.png 截图201802091732574991.png



之后就是设备信息的填写和设备的注册了

截图201802091737104789.png


结语
这应该是我回家以后做得挺有意义的一件事~昨天老妈和我说早上我爸醒了玩手机的时候嫌灯光太暗,不爱下床用内程序把灯打开以后乐坏了。
当然还有作为试用者之一——我可爱的女朋友还有我的母上大人都威胁我说再看到我晚上熬夜就远程关我的灯。(是的,这其实才是让我有了设备管理权限想法的本质原因),造了一个大轮子但是把问题解决了的感觉还是不错的,虽然现在只可以接入开关设备,但是最后当然还可以接入调光调温设备你懂的(传入量不同而已)。自己从头到尾设计这一套东西,有时候还是比较害怕hacker的。所以请各位高手放过我的服务器 哈哈哈
还是很开心的~我接下去还会继续完善~这一版本的小程序已经发布了,好像我还是用小程序做智能家居的第一人~anyway,给大家提供一个思路~
当然!!欢迎大老板们给我投资哦,让我可以开发更多有意思的设备~
最后的最后,提前祝我的小可爱生日快乐~



dexin  中级技师
 楼主|

发表于 2018-3-5 14:10:47

快乐王子 发表于 2018-2-28 10:51
看到您做的真佩服,但是这些元器件都是从哪儿买到的呢?我也想做一个,有没有现成的元器件,我连接一下电路 ...

哈哈 因为这个完全是我设计制作的 所以暂时没有打包好的元器件。不过电路的部分原理图我基本都已经在帖子中附图了。您可以在电子市场等处购买相应的零件~下一版本的PCB我在完善后会开源。到时候您按照我的BOM表和PCB自行购买元器件加工就可以了。

点评

啥时候能出版子啊  发表于 2018-5-15 15:19
很好,希望以后可以看到您更多的作品!支持!!!  发表于 2018-3-11 14:33
回复 支持 2 反对 0

使用道具 举报

lkk255  初级技师

发表于 2018-2-11 10:11:04

腻害了,前排留名!
回复 支持 反对

使用道具 举报

Ash  管理员

发表于 2018-2-11 10:45:24

腻害了,前排留名!
回复 支持 反对

使用道具 举报

Forgotten  版主

发表于 2018-2-11 13:20:54

不容易,太厉害了,收藏顶起
回复 支持 反对

使用道具 举报

dexin  中级技师
 楼主|

发表于 2018-2-11 15:39:41

Forgotten 发表于 2018-2-11 13:20
不容易,太厉害了,收藏顶起

早就想这么倒腾一次了 哈哈~
回复 支持 反对

使用道具 举报

digi_cow  初级技匠

发表于 2018-2-12 21:46:09

PFPF
回复 支持 反对

使用道具 举报

好奇吖斌  高级技师

发表于 2018-2-13 15:04:17

牛逼,可是不会画板子
回复 支持 反对

使用道具 举报

dexin  中级技师
 楼主|

发表于 2018-2-14 13:16:22

好奇吖斌 发表于 2018-2-13 15:04
牛逼,可是不会画板子

好像有一些自动布线的软件 在某宝上有元件封装库 应该很快就能出板子了
回复 支持 反对

使用道具 举报

snake  见习技师 来自手机

发表于 2018-2-15 08:49:37

dexin 发表于 2018-2-9 20:21
还是!戳出一枚演示视频~
设备的接入就不演示了哈哈~大家可以直接体验小程序~
几天前,dexin终于回到老家— ...

厉害,专业
回复 支持 反对

使用道具 举报

安卓机器人  初级技神

发表于 2018-2-19 20:07:33

想做就做!V
回复 支持 反对

使用道具 举报

svw  初级技匠

发表于 2018-2-26 10:46:21

腻害了,就是没看懂
回复 支持 反对

使用道具 举报

快乐王子  见习技师

发表于 2018-2-28 10:51:35

看到您做的真佩服,但是这些元器件都是从哪儿买到的呢?我也想做一个,有没有现成的元器件,我连接一下电路就行呢?希望得到您的回复。
回复 支持 反对

使用道具 举报

dexin  中级技师
 楼主|

发表于 2018-3-5 14:12:42

svw 发表于 2018-2-26 10:46
腻害了,就是没看懂

哈哈哈 我主要是希望自己能提一种新的轻量级的解决方案。其实也完全可以使用其他的方式解决问题哒~
回复 支持 反对

使用道具 举报

dexin  中级技师
 楼主|

发表于 2018-3-5 14:13:06

svw 发表于 2018-2-26 10:46
腻害了,就是没看懂

哈哈哈 我主要是希望自己能提一种新的轻量级的解决方案。其实也完全可以使用其他的方式解决问题哒~
回复 支持 反对

使用道具 举报

DFHy97JtUQ7  学徒 来自手机

发表于 7 天前

dexin 发表于 2018-3-5 14:13
哈哈哈 我主要是希望自己能提一种新的轻量级的解决方案。其实也完全可以使用其他的方式解决问题哒~ ...

大神好,加个微信吧18701935531,有很多想法,交一下!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2016 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail