×

家庭自动化系统开源构建

消耗积分:0 | 格式:zip | 大小:0.10 MB | 2023-07-10

14230

分享资料个

描述

我正计划构建一个廉价的家庭自动化系统。我希望这是一个模块化系统,这样我就可以不断地向其中添加传感器和设备,而无需进行太多更改。WARAN(Windows IoT、A zureR aspberry Pi、A rduino、N RF24L01+)是一个模块化的家庭自动化系统,由一个 Hub 和多个模块组成。该模块将结合微控制器和传感器,从房屋的不同位置收集数据,并通过射频将数据传输到集线器。集线器和模块之间的所有通信都通过 RF 进行。Hub 还将有一个配套的 Windows Phone 应用程序。这是一个解释设置的简单流程图。

为什么选择 Windows 物联网?

我是一名软件开发人员,目前正在涉足 IoT。凭借我之前使用 XAML/C# 和 Visual Studio(我认为这是有史以来最好的 IDE)的经验,这对我快速实现这些非常有帮助。

为什么是 NRF24L01+?

当我研究无线选项时,NRF24L01+ 是一种廉价且低功耗的解决方案。有了一些非常强大的库,它为我提供了最佳解决方案。

为什么选择 Windows Azure

Windows Azure 非常容易学习和适应。由于启动服务所需的配置很少,我们可以更多地关注开发而不是配置和部署。我之前使用 Azure 的经验帮助我快速集成。

 
poYBAGOkEhyAXHh-AACPUwHJ8cY243.png
流程图
 

枢纽

Hub是WARAN的一个中央控制中心。它由 RPI2、Arduino Uno 和 nRF24L01+ 组成。RPI2 运行 Windows IoT Core。它运行一个通用应用程序作为控制中心。集线器将连接到一个大显示器(通常是电视或监视器),通过它我们可以看到来自模块的数据并控制模块。连接到 RPI2 的键盘和鼠标将有助于从控制中心添加、删除模块。这是它的威廉希尔官方网站 图(参考项目中的 WARAN.Hub.fzz. 文件) 

 
poYBAGOkEh-AF_FdAAJ1j6Zi0K4066.png
集线器威廉希尔官方网站
 

它是如何运作的?

每个模块都有一个唯一的地址,集线器使用该地址与其通信。我们将使用此地址向控制中心添加一个模块,并为该模块命名。添加后,控制中心(通用应用程序)将通过 I2C 向 Arduino Uno 发送数据。Arduino Uno 将通过 nRF24L01+ 向模块发送数据,模块从传感器读取数据或根据接收到的数据启动/停止设备,并将数据发送回 Arduino Uno。Arduino Uno 将通过 I2C 将数据发送到控制中心。这些数据将显示在电视/显示器中,并发送到云端。Arduino Uno 将充当 RPI2 的接口,以从其他模块获取传感器数据。上面的过程会在三种情况下发生

  1. 在特定的时间间隔取决于模块
  2. 当用户与控制中心交互时(通过鼠标/键盘)
  3. 当从云端发送触发器时(针对 PubNub)

这是一个典型的流程

 
poYBAGOkEiGAUAkqAACdCS-a6gg471.png
 

这就是集线器中的组件和模块之间的交互方式。

 
pYYBAGOkEiSAS_d1AAEV67j03CQ660.png
WARAN 组件之间的交互
 

控制中心

控制中心是在 RPI2 中运行的通用应用程序。控制中心是用户交互的界面。它与模块通信,也与云通信。WARAN 控制中心利用 Azure 移动服务和 PubNub 作为其云后端。我们添加的每个模块信息都将本地存储在 sqlite db 中,并发送到 azure 移动服务。这将依次向移动应用程序发送 PubNub 消息或推送通知。我不想在这里解释编码部分,让这篇文章变得一团糟。项目源代码、文档和部署细节可以在 https://bitbucket.org/arjunganesan/waran中找到 (我正在全面更新文档,很快就会完成)。这就是控制中心的工作方式

 

移动应用程序

移动应用程序是一个 Windows Phone 应用程序(稍后将针对其他平台开发),它将作为中心的配套应用程序。我们可以在世界任何地方的移动设备中看到所有与传感器相关的数据。如果从模块获得任何重要信息(例如气体泄漏监测模块的气体泄漏警报),我们也会收到推送通知。我们也可以从手机本身触发模块上的一些动作(比如在植物饮水器模块上启动泵)。由于所有这些都是通过云发生的,因此无需在集线器附近的任何地方放置移动设备即可执行所有这些操作。

这是移动应用程序的外观

 
 

 

模块

该模块是协同工作的组件组合,通过 RF 与 Hub 接收和发送数据。它可以是 Arduino Pro Mini 与传感器或 RPI2 与传感器等的组合。它需要做的就是通过 RF 从集线器接收数据/命令并做出适当的响应。这为模块提供了无限的可能性。首先我要添加 2 个模块

  1. 植物饮水器
  2. 温度监控器
警告:这里的所有模块都可以配置为使用继电器控制电气设备。但是我没有处理这些的经验,所以我不想介入危险区域,所以我还没有在我的项目中使用它。那些在处理继电器方面有丰富经验的人请随意扩展威廉希尔官方网站 ,其他人如果想在其中工作,请采取适当的预防措施。

植物饮水器

植物饮水器将监测植物中的水位以及植物周围环境的温度。如果没有足够的水,则会向移动应用程序发送警报。我们可以从任何地方通过移动应用程序启动泵。我们还可以将其配置为在水位低于阈值时自动启动水泵。它由 Arduino Pro Mini、DHT11、土壤湿度计和 nRF24L01+ 组成。这是威廉希尔官方网站 图(参考项目中的PlantWaterer.fzz)

 
pYYBAGOkEjOAGnxcAALZ3Eb-p78308.png
植物饮水器威廉希尔官方网站
 

来自 9V 电池的电源进入 Arduino Pro Mini 的 RAW 引脚。arduino 中的内置稳压器将在 Vcc 中提供 5V 输出。我们将使用它来驱动 DHT11。我们还提供 9V 电源作为 3.3V 稳压器的输入,我们将使用它为 nRF24L01+ 供电。湿度计的水位将在模拟引脚 A3 上读取。DHT11 的温度读数将在数字引脚 6 中读取。在数字引脚 5 中,我们将向晶体管或继电器发送信号,我们使用它们来启动停止泵。出于演示目的,我将使用直流泵并将晶体管用作开关。这是它的工作流程

 
poYBAGOkEjWAXNYDAADzc66mrFQ547.png
 

我不希望威廉希尔官方网站 保留在面包板上,所以我将它转移到穿孔板上。我想保持紧凑,所以我这样做了。您可以参考威廉希尔官方网站 图并提出自己的布局。

 
 
 
 
poYBAGOkEmSADtZsAA8-D-zIjF0602.jpg
 
1 / 12
 
 

 

温度监控器

温度监控器将监控房间(例如卧室)的温度,并随时发布温度和湿度水平。我们还可以从集线器或移动设备打开/关闭或调整设备(恒温器、交流电等)。为了演示,我将关闭/打开连接到 arduino 的 LED。该威廉希尔官方网站 由Arduino Pro Mini、DHT11和nRF24L01+组成。下面是威廉希尔官方网站 图(参考工程中的TemperatureMonitor.fzz文件)

 
pYYBAGOkEmmAceBoAAKm8vLxdCE341.png
 

来自 9V 电池的电源进入 Arduino Pro Mini 的 RAW 引脚。arduino 中的内置稳压器将在 Vcc 中提供 5V 输出。我们将使用它来驱动 DHT11。我们还提供 9V 电源作为 3.3V 稳压器的输入,我们将使用它为 nRF24L01+ 供电。DHT11 的温度和湿度读数将在数字引脚 5 中读取。在引脚 6 中,我们将向晶体管或继电器发送信号,我们使用它们开始停止设备(例如恒温器、交流电等)。出于演示目的,我将使用 LED 灯来显示设备的关闭/打开。这是它的工作流程  

 
poYBAGOkEmuAcic2AADj-maJg0Y559.png
 

以下是我将其放置在性能板上的方式。您可以根据威廉希尔官方网站 图提出自己的布局。

 
 
 
 
poYBAGOkEquAfiw8ABHLEbJvi7A465.jpg
 
1 / 5
 
 

这是它的工作原理

 

已知的问题

  • 电源 - 两个模块的电池会在几个小时内耗尽。需要找到一种高效的便携式电源。我计划在任何可能的模块中使用 attiny 处理器代替 pro mini。它的功率效率会更高。我以前关于 attiny 的文章可以在这里找到。
  • I2C 并发 - 如果 RPI2 一次向 Arduino uno 发送 2 线请求,则其中一个失败。我正在研究避免这种情况的方法,并尝试实施重试机制。
  • 单向通信——现在集线器发起一个请求,模块响应它。尽管这在许多情况下都很有效,但一些新模块可能需要在集线器不发送请求的情况下将数据发送到集线器。
  • 范围 - 我将模块放在隔壁房间并能够正确接收数据。但是,如果您想增加范围,请将集线器中的 nRF24L01 替换为具有外部天线的 NRF24L01+PA+LNA。
  • 安全性——因为这是在由开发人员拥有的假设下开发的,所以我没有添加任何身份验证机制。如果需要,您可以利用 Azure 移动服务的身份服务将 Microsoft、FB、Twitter、Google 身份验证集成到移动应用程序和中心。

未来的计划

我想把它作为一个开放平台,供人们实现自己的家庭自动化系统。我将稳定 Hub 和移动应用程序。我想向该项目添加更多模块。基于语音的命令和响应也在路线图中。现在我正在研究以下模块

  • 气体泄漏传感器
  • 入侵探测器
  • 设备控制器(例如咖啡机控制器、灯控制器等)
  • 车库门开启器 
  • 一些可穿戴模块
  • 没有硬件的互联网服务(天气、Azure 逻辑应用程序、股票报告等)
  • 在集线器范围之外工作并通过互联网与其通信的模块(例如汽车追踪器、宠物追踪器、计步器等)

所有这些模块组合在一起并通过集线器作为一个单元工作,将为我提供我一直想要拥有的家庭自动化系统。我将继续在 hackster 中将新模块作为单独的项目添加。欢迎大家添加新模块和扩展。将更新有关如何向项目添加新模块的 wiki 页面。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(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:'家庭自动化系统开源构建',//标题 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);