×

多功能自动化系统开源分享

消耗积分:0 | 格式:zip | 大小:0.73 MB | 2022-11-08

20153

分享资料个

描述

主意

制作自动化系统的想法来自我们的村屋,那里有鸡、狗和植物。我父亲制作了一个电子系统来自动化日常任务,例如给植物浇水、喂狗和喂鸡、给鸡开门等。他为那个系统使用了定时继电器​​,并且大部分时间都运行良好。但是,我们村的房子经常停电,导致我父亲的自动化系统出现问题。如果在一个继电器的分闸和合闸时间之间断电,当电回来时,它不会安排继电器的状态。当我们处理植物,主要​​是动物时,这是一个巨大的问题。而且定时继电器​​的成本比Netduino+Relay高,使用起来也不是你想的那么简单。

解决问题

为了解决这个问题,我申请了Netduino Contest的Idea Round,我的想法被接受了。我买了一个 16 通道 5V 继电器模块,用于多继电器控制。我需要知道时间。因此,我使用了一个外部 RTC 模块 DS3231 不仅可以获取实时时间,还可以获取星期几,这鼓励我每周编写一个程序作品。我写了一个循环函数,根据时间确定继电器的状态。此函数每秒循环一次并检查每个继电器的情况,然后比较来自 SD 卡(或直接来自代码——我在代码中解释)的继电器时间,并根据时间打开/关闭继电器。但是,我想独立使用传感器,以完成紧急需求。我设法连接了三个传感器,以用我的系统举例说明传感器的工作过程。

发展

由于缺乏互联网连接、时间和库存,开发过程对我来说有点困难。我在我们村的房子里,我不得不使用我的旧传感器,我没有足够的时间购买新的,因为运往村庄的货物受到限制。因此,我完成了我所拥有的。我熟悉 Arduino,这就是为什么示例项目的引脚图或威廉希尔官方网站 对我来说很容易。我一直在努力集成 DS3231 并使用传感器(包括 LDR、水位和运动检测)。虽然有相关的教程,但大多数教程都有点老了。但是,Netduino 基金会很棒,而且大部分都是最新的!

我使用Netduino Foundation DS32xx 集成代码从 DS3231 RTC 模块获取时间数据。对于传感器,我尝试使用 SecretLabs.NETMF.Hardware.AnalogInput 参考,但 VS 2015 向我显示了一次又一次检查设备的错误。没有这个参考,所有的项目都像魅力一样运行。这就是为什么我检查了 AnalogInput 的库以了解如何从模拟输入中获取数据。之后,我从 Microsoft.SPOT.Hardware 获得了如下值:

Microsoft.SPOT.Hardware.AnalogInput waterLevel = new Microsoft.SPOT.Hardware.AnalogInput(Cpu.AnalogChannel.ANALOG_0);
Debug.Print("Water Level Sensor: " + (int)(waterLevel.Read() * 100));

我写了一个函数来确定继电器的情况。下面是我的函数的参数的示例和含义:

// Relay no:2 12:10 - 16:27 Only Tuesday
TimeToAct(2, currentHour, currentMinute, DayOfWeekToString(dayOfWeek), 12, 10, 16, 27, DetectDay(3));
///        
/// Main Alarm System       
///        
/// Relay No       
/// current Hour       
/// current Minute       
/// current Day String       
/// Relay opens: hr       
/// Relay opens: min       
/// Relay closes: hr       
/// Relay closes: min       
/// Relay opens at specific day or days of week
static void TimeToAct(int relayNo, int currentHour, int currentMinute, String currentDay, int hourAct, int minuteAct, int hourReAct, int minuteReAct, String[] daysAct)       {

我的代码在一天的操作中运行得很好(例如中继 6 仅在星期三工作)。然而,我的目标是让我的继电器每周工作好几天。我考虑过如何理解为多个操作选择了多少天,这是我的解决方案,使用素数:)

///        
/// Detect Day depending on first 7 prime numbers       
/// 2 --> Monday       
/// 3 --> Tuesday       
/// 5 --> Wednesday       
/// 7 --> Thursday       
/// 11 --> Friday       
/// 13 --> Saturday       
/// 17 --> Sunday       
/// If we want our relay to open only one day, we need to enter days' prime number, for instance 5 for Wednesday.       
/// If we want our delay to open multiple days, we need to multiply days' prime numbers.       
/// For instance, all the days of week, we need to enter 2*3*5*7*11*13*17 = 510510       
/// Monday + Tuesday = 2*3 = 6       
/// Wednesday + Saturday + Sunday = 5*13*17 = 1105       
///        
/// dayNumber       
/// Detect Day String array
       static String[] DetectDay(int dayNumber)
       {
           String[] days = { "", "", "", "", "", "", "" };
           for (int i = 0; i < 7; i++)
           {
               days[i] = "";
           }
           if (dayNumber % 2 == 0) { days[0] = "Monday"; }
           if (dayNumber % 3 == 0) { days[1] = "Tuesday"; }
           if (dayNumber % 5 == 0) { days[2] = "Wednesday"; }
           if (dayNumber % 7 == 0) { days[3] = "Thursday"; }
           if (dayNumber % 11 == 0) { days[4] = "Friday"; }
           if (dayNumber % 13 == 0) { days[5] = "Saturday"; }
           if (dayNumber % 17 == 0) { days[6] = "Sunday"; }
           Debug.Print("DayNo: " + dayNumber);
           Debug.Print("Days: ");
           for (int i = 0; i < 7; i++)
           {
               if (days[i].Length > 5)
               {
                   Debug.Print("-" + days[i]);
               }
           }
           return days;
       }

我的最后一个挑战是将数据存储在 SD 卡中。我有许多甚至超过 8GB 的​​ micro SD (SDHC) 卡。但是,Netduino 页面说您需要使用高达 2GB 的 SD 卡(不是 SDHC),这使我无法使用我的卡。我曾尝试与我的卡一起使用,但它不起作用。然后我决定使用 DS32xx 的 EEPROM 来存储所有数据。我从 Netduino.Foundation 找到了一个库,但是这个库导致 VS 出现问题(上面同样的错误)我需要存储数据,所以我为 SD 卡编写了代码,但我无法使用 SD 卡进行测试。

说明(用于制作项目)

  • 访问 Netduino网站并下载 Netduino 的固件更新程序。
  • 使用该程序更新您的 Netduino。
  • 下载并安装 Visual Studio 2015。
  • 在Windows上安装 .NET MicroFramework 和 Netduino SDK
  • 根据我的原理图将传感器和继电器连接到 Netduino。
  • 下载并使用 VS 2015 打开我的项目。
  • 部署代码!

结果

我很高兴也很自豪能够完成这个项目并找到解决我们问题的方法!我的系统可以处理许多事情,例如:

  • 根据小时、分钟和星期几编程 8 个继电器(现在限制为 8 个,但继电器计数可以增加)
  • 中继系统每周工作,可根据日、月或年防止出现问题。
  • 自动化系统帮助农民种植更好的作物并减少他们的工作。
  • 由于我的系统不需要互联网连接,它可以在世界任何地方工作。
  • 继电器可以通过传感器的值来控制,这也可以帮助农民在紧急情况下做植物或动物需要的事情。
  • 使用 SD 卡不仅有利于存储和检索数据,而且可以更轻松地对继电器进行编程。
  • 时间系统和传感器可以同时工作。(传感器优先控制继电器)
  • 农民可以为他们的目的添加许多传感器。
  • 如果发生停电,我的系统工作正常。
 

为了未来

  • 我可以添加 Internet 连接,无论是 WiFi 还是以太网,以有效地传输数据并更轻松地对继电器进行编程。
  • 通过有效的互联网连接,我可以制作一个应用程序来监控数据、编程继电器、确定传感器的值限制......这可以简化我的系统的使用。
  • 我可以使用 Grove 传感器来增加传感器数量。
  • 我可以增加继电器数量。
  • 我可以添加蓝牙传感器以更好地进行通信并修改继电器的时间表,而无需取下 SD 卡。这当然是为了离线使用。

最后

我真的很感谢 Wilderness Labs 给我们一个机会来解决我们使用 Netduino 的问题,他们的高级语言支持卡。


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

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