×

神奇的OpenThread网状圣诞灯

消耗积分:0 | 格式:zip | 大小:4.66 MB | 2022-12-09

526774

分享资料个

描述

为什么是网状?

OpenThread 和 Particle 使创建一个廉价的协调圣诞灯展变得如此简单和有趣!传统的圣诞灯饰都需要连接到中央控制器。在我的设计中,每个网状设备都是模块化的,你只需要提供电源。灯光秀的时间是通过网状网络协调的。安装和拆卸非常容易,因为您需要做的就是提供电源。

对我来说,网状网络的另一个主要好处是它可以将网络扩展到我的 Wi-Fi 网络范围之外。前几年我制作的设备都使用 Wi-Fi。我的院子里有盲区和 Wi-Fi 超出范围的区域。OpenThread 网状网络非常智能,没有单点故障,扩频技术提供抗干扰能力。

为什么是粒子?

Particle 提供了一个 IoT 平台,可以更轻松地创建网格和其他产品。当您不需要从头开始开发管道和架构时,开发效率会高得多。我已经开发物联网解决方案很长时间了,并且从头开始构建自己的平台,但现在我比以往任何时候都更有效率地专注于产品的业务逻辑,而不是花时间构建平台。Particle 的第三代设备采用了 OpenThread 网格。

什么是开放线程?

OpenThread 由 Google 发布,作为 Google 为 Nest 创建的 Thread 的开源实现。谷歌发布的联网技术加速了联网家庭产品的开发,以使用Thead。(OpenThread 网站: https ://openthread.io/

我的公司正在利用这项技术进行更多的联网家庭项目。这项技术也非常适合制造和其他企业项目,因为该解决方案的安装比通过在设备或控制器之间连接电线的传统方法简单得多。

OpenThread 是基于 IPv6 的低功耗,主要功能包括:(摘自 OpenThread 网站: https ://openthread.io/guides/thread-primer

  • 简单性——安装、启动和操作简单
  • 安全性——Thread 网络中的所有设备都经过身份验证,所有通信都经过加密
  • 可靠性——自愈网状网络,无单点故障,扩频技术提供抗干扰能力
  • 效率——低功耗 Thread 设备可以休眠并依靠电池供电运行多年
  • 可扩展性——Thread 网络可以扩展到数百个设备

OpenThread 将开发人员已知的 IPv6 和网络/Web 协议的优点扩展到网状网络。

网状网络架构

我创建了一个网状网络,可以轻松扩展以每年添加新的光功能节点。该网络有两种类型的设备:

  • 网关节点 - 粒子氩(Wi-Fi + OpenThread)
  • 光特征节点 - 粒子氙气(仅限 OpenThread)

网关节点

网关节点主要用于桥接 Internet 与 OpenThread 网状网络。Particle 制造 Argon 和 Boron 网关设备。Argon 专为 Wi-Fi 而建,而 Boron 专为蜂窝网络而建。我为网关编写的代码设计简单,不会阻止网关执行其他任务。我计划扩展网关以用于我的家庭自动化,并且不希望圣诞灯的逻辑产生明显的延迟或禁止我的家庭自动化中的其他功能。

网关代码执行以下功能:

  • 订阅来自圣诞树的网格消息 - 圣诞树发布网格消息以宣布它已完成其灯光模式。网关侦听此消息,收到消息后会等待一秒钟,然后会向所有光功能设备发布消息以启动新模式。
  • 有一个粒子函数的处理程序来更新模式。粒子函数从云中触发,然后本地网关处理程序通过网格中继模式消息。最初,我在灯光特征节点上只有粒子函数处理程序,但当设备处于执行灯光显示的紧密循环中时,云函数经常会超时。在网关上设置处理程序可以快速响应云确认调用了该功能,并且网格确保将消息传递到所有轻型特征节点。网格有 15 种操作模式。大多数模式用于调试问题,例如点亮单个通道以放置功能或查找需要更换的灯泡。
  • 为我通常连接的所有接入点设置 Wi-Fi 凭据。这包括我的房子、我的电话和办公室。这使得将网格移动到办公室或在会议上以我的手机作为接入点进行演示变得容易。
  • 心跳指示灯。我几乎总是为我的微控制器项目添加一个心跳 LED。这会添加一个快速视觉指示器,表明设备处于活动状态且未挂起。Particle 原型设备都有一个 LED 连接到 PCB 上的 D7 引脚,所以我通常将其用于心跳 LED。

灯光特征节点

所有轻特性节点都运行相同的代码副本。为每个设备部署不同的代码或具有不同版本的代码将是代码维护的噩梦。每次我添加新功能或修复错误时,我都会将更新部署到网络上的所有轻功能节点。Particle 构建了一个平台,支持从 Particle 云通过网关设备到网状节点的无线 OTA 更新。网状节点旨在安装在高高的树上,因此能够在任何时间和恶劣天气下从我舒适的客厅或任何有互联网连接的地方更新固件是非常好的和安全的。操作系统的版本和在设备上运行业务逻辑的固件都可以从粒子云推送到 OpenThread 网状网络上的设备!粒子实时操作系统 RTOS 存在一个问题,有时网格节点的 OTA 更新会因代码运行光模式特征的紧密循环而出现问题。简单的解决方法是首先通过上面网关部分讨论的粒子函数更新网格节点的模式。我将更新所有灯光功能节点上的模式以退出紧密循环并打开所有灯光。一旦我看到所有的灯都亮了,我就会运行 OTA 更新,并且每次都会可靠地更新固件。简单的解决方法是首先通过上面网关部分讨论的粒子函数更新网格节点的模式。我将更新所有灯光功能节点上的模式以退出紧密循环并打开所有灯光。一旦我看到所有的灯都亮了,我就会运行 OTA 更新,并且每次都会可靠地更新固件。简单的解决方法是首先通过上面网关部分讨论的粒子函数更新网格节点的模式。我将更新所有灯光功能节点上的模式以退出紧密循环并打开所有灯光。一旦我看到所有的灯都亮了,我就会运行 OTA 更新,并且每次都会可靠地更新固件。

所有网格光特征节点都运行相同的代码,但每个节点都知道自己的身份,并且可以根据自己的身份运行特殊的例程。当代码在 setup 方法中初始化时,灯光特征节点订阅 Particle, particle/device/name, api 返回友好的设备名称。然后代码可以根据设备的友好名称标识进行切换。到目前为止,代码中只有一个基于设备身份的开关。christmasTree 设备是特殊的,被视为领导者,当 christmasTree 在启动时空闲或完成一个灯光模式后空闲时,向网关发送一条消息,告诉它是时候发送同步网格消息了。如果网关被拔掉,christmasTree 将继续每秒发送消息。一旦网关确认 christmasTree 空闲,它就会发送关于 christmasLights 主题的网格消息。所有灯光功能节点都订阅了 christmasLights 主题,并在收到消息后开始灯光秀。所有网状节点几乎同时接收消息,并且几乎完美排序。可以注意到小至 20 毫秒的排序延迟,因此所有设备似乎完全一致地工作真是太棒了。

圣诞树建造

我用一些固态继电器、圣诞灯和黑铁 1/2 英寸管道建造了 20 英尺高的树。黑色铁管可以从五金店购买,每段 10 英尺,因此您还需要使用耦合器配件连接两段管道。我将 3/4 英寸的 PVC 管锤入地面约 1.5 英尺,这样我就不需要每年挖一个洞来支撑这棵树。这棵树有 12 个固态继电器通道,每个通道都有 100 个绿色灯泡串,我用一根绳子系在上面,并在每个角上串在地上。使用脉冲宽度调制来控制每个通道的亮度是最理想的,但是 Particle Xenon 没有可用的 12 个 pwm 引脚,所以我编写了自己的脉冲逻辑来控制每个通道的亮度在一个紧密的循环中。

pYYBAGOSp6yAPRaDABgRqCEcX_M880.jpg
二十英尺圣诞灯树的建造
 
pYYBAGOSp9uAMJuLAAp4PwY37fg647.jpg
20 英尺圣诞节 OpenThread 网格树
 

圣诞舞会建设

我制作了 2 组 6 个圣诞球,每个球的直径为 1 英尺,并有 200 个圣诞灯。每组 6 个球有 1 个粒子氙和一组控制每个球亮度的固态继电器。一半的球是用红灯做的,另一半是用绿灯做的。两组 6 个球位于不同的威廉希尔官方网站 上,因此每组 6 个球可以安装在不同的树上或展示在院子的不同区域。

pYYBAGOSqECAIHZtABkKOENSRdI064.jpg
圣诞舞会的施工图
 

 

结论

OpenThread 提供了一种同步圣诞灯的绝佳方法,您无需将所有灯连接到中央控制器。弹性网状网络比 Wi-Fi 可靠得多。Particle 提供了一个平台,使使用 OpenThread 和做 IoT 变得更容易,也更有趣!我希望您喜欢这篇文章并构建一些您自己的 OpenThread 圣诞魔法灯!


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

评论(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:'神奇的OpenThread网状圣诞灯',//标题 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);