×

树莓派家庭自动化开源

消耗积分:0 | 格式:zip | 大小:0.00 MB | 2023-06-20

岳臻俊

分享资料个

描述

这个项目始于去年,作为德雷克塞尔大学的一个有趣的新生设计项目,一直持续到我自己的夏天。它还有很长的路要走,但基本功能已经过验证。

目前正在寻求调试/测试方面的帮助。也将感谢任何 Web 开发人员或特别是 Javascript 开发人员的帮助,以改进 UI 和后端,并添加更好的任务调度功能。

软件设计基于 JSON 文件。该文件允许轻松更新连接到 Pi 的硬件设备的更改。该软件根据此文件呈现 GUI 并初始化 Pi 上的 GPIO 引脚。以下是去年春天编写的说明手册的示例。 

向 device.json 添加条目

在这个项目的主目录中有一个名为“device.json”的文件。当客户端连接到 Node.js 服务器时,服务器将此文件解析为 Javascript 对象,并将此信息打包为 websocket 数据发送给客户端。整个系统基于此文件中包含的信息。HTML control.html 文件不包含任何设备特定信息,它只是一个框架结构,允许客户端 javascript(包含在 /js/control.js 文件中)解析通过 websockets 发送的数据,并绘制使用 JavaScript 的页面。这使得从 Pi 添加和删除设备变得相对容易。通过简单地编辑这个文件,整个界面都会被重新绘制以适应这些变化。

{

“销”:2,

“状态”:“出”,

“名称”:“警报”,

“id”:“蜂鸣器”

},

{

“销”:27,

“状态”:“在”,

“名称”:“按钮”,

“编号”:“按钮”,

"highmsg" : "按下按钮",

“lowmsg”:“没有变化……”

},

这是在 device.js 文件中找到的对象的两个示例。所有对象都必须包含一个与整数值匹配的“pin”键。Pin 对应于设备连接到的 Pi 上的 GPIO 引脚,应该是一个整数。请注意,有两个编号系统用于指代 Rpi GPIO 引脚。Pi 有 40 个引脚,在参考引脚的相对位置时,板的方向始终是排针位于板的右上角。一种编号方法从 1 到 40 对每个引脚进行编号,从左上角的引脚开始为引脚 1(这不是 DEVICE.JSON 使用的系统)。device.json 文件使用的编号方法使用处理器设计规定的任意编号方案,不遵循排针上的逻辑顺序。使用下图确定您的设备连接到的引脚。

 
poYBAGOlC9OAbyo8AAFNWzCCSK0716.png
 

上面的第一个 JSON 条目是一个输入对象。对于每个连接的输出设备,对象必须包含以下字段:pin、state、name、id。

  • pin是设备所连接的 GPIO 引脚,该引脚可以是高电平(3.3V)或低电平(0V 又名接地)

  • 状态是“in”或“out”,我们在这里讨论输出设备,所以这应该是“out”

  • 名称是将显示在站点界面上的字符串。它可以是任何东西,但应该相对较短(这样页面布局不会受到负面影响)并且独一无二

  • id也必须是唯一的。这应该很短,少于 6 个字符,并描述所连接的设备。该值将在调度界面中使用,以指代将在特定日期更改状态的设备。

上面的第二个对象是一个输入对象输出对象包含与输入相同的四个键,但是它们又添加了两个键:highmsg 和 lowmsg

  • 状态是“在”

  • highmsg应该有一个字符串值,当输入引脚的状态为高时将显示该值。

  • lowmsg应该有一个字符串值,当输入引脚的状态为低时将显示该值。

这些对象的语法称为 JSON,又名 JavaScript Object Notation。这种语法非常挑剔。如果不正确,您的对象将无法正常运行。在上传之前使用 http://jsonlint.com/ 检查您的 JSON 语法。并查看 W3 学校 http://www.w3schools.com/json/ 以获取有关 JSON 的更多信息。

将设备物理连接到 Pi

  1. 你想连接什么样的设备?它可以是输入(即传感器,或将测量周围环境的东西)或输出(即与周围环境交互的东西,如 LED 或蜂鸣器,或继电器)。

  2. 设备的电源要求是一个重要的考虑因素。树莓派只能提供这么多功率。如果输出设备耗电过多,您的系统可能会出现偶发行为(尤其是“断电”,在这种情况下耗电过多,系统会关闭几分之一秒,似乎会自发重启)。了解您设备的电源要求。如果设备有 3 根线,则这些线将连接到电源(+5V 或 +3.3V)、地线 (0V) 和 GPIO。如果有两条线(例如 LED),则可以直接从 GPIO 驱动设备,但不能没有串联电阻来限制电流。检查设备的数据表以查看哪个引脚/电线对应于什么。如果您的 3 线设备是 5V 设备,它可能直接从 Pi 上的 5V 电源轨供电,只需将 +5V(又名 VCC)引脚插入 Pi 接头上的 5V 引脚即可。3.3V 接头限制为 50 mA 的总电流消耗(对于所有设备)。不要超过这个。您可能需要为 3.3V 设备使用外部电源。

  3. 每个 GPIO 引脚可以提供 3.3 伏电压和 16 毫安的最大值。但是,在我看来,您不应尝试从 GPIO 引脚汲取接近 16 mA 的电流。有关从 Pi 为设备供电的更多信息,请参阅:(http://raspberrypi.stackexchange.com/questions/9298/what-is-the-maximum-current-the-gpio-pins-can-output)

  4. 确保 Pi 的电源(带有微型 USB 电缆的墙上插座)可以提供至少1.2 安培和 5 伏的电压。最好安全使用并获得 2 安培 5 伏充电器,大多数现代手机(包括 iPhone)都配备能够提供这种功率的充电器。

  5. 如果要接LED,找一个在线电阻计算器,或者用笔、纸和欧姆定律(电压=安培数*电阻),计算出适合LED的电阻值。请记住 16 mA 的限制,以及将连接的其他设备数量。

  6. 对于 5 伏、3 线设备(输入或输出)、接地、+5V 至 +5V 以及信号(输入或输出)到 GPIO 引脚(记录在 device.json 中)。请记住,如果您的 5V 设备消耗的电流超过 100mA(左右),您可能需要构建一个外部稳压器,请参阅第 8 步。请注意,5V 设备的功率限制受 USB 电源可用功率的限制在 Pi 中,5V 设备比 3.3V 设备有更多的余地。

  7. 对于 3.3V 3 线设备,如果所有 3.3V 设备的电源要求都在 50mA 以内,则将 +3.3V 连接到 +3.3V,接地,并将信号发送到 GPIO 引脚(如 device.json 中所记录)。

  8. 如果 3.3V 设备消耗的电流超过 50mA,请获得面包板(或原型板)并用价值几美元的零件组装一个简单的 3.3V 稳压器威廉希尔官方网站 。在线查找有关如何执行此操作的说明。完成后,将设备的+3.3V 电源引脚插入外部威廉希尔官方网站 上电源调节器的+3.3V 输出。(这也适用于 5V,只需使用 5V 稳压器即可)。

系统图

 
pYYBAGOlC9WAFdq4AAGwLb9FP5Y567.png
 

 


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

评论(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);