×

自动浇水系统开源

消耗积分:2 | 格式:zip | 大小:0.04 MB | 2022-11-14

石飞鹏

分享资料个

描述

夏季,您的花园或后院需要经常浇水,尤其是在澳大利亚。为了确保它定期发生,我决定设计这样一个浇水系统。

功能说明

该项目最多由四个阀门组成,最多可以控制 3 个洒水器或其他类型的浇水装置。它使用一个额外的阀门来更好地抵抗阀门故障,并且如果您决定使用水流量传感器,它还会执行泄漏检查。

这三个浇水装置最多可以浇灌您花园的 3 个不同区域。它们被称为区域 1、区域 2 和区域 3,您可以分别配置它们的持续时间(以分钟为单位)以及每天开始浇水的时间。

有两个按钮和一个彩色 LED 来控制/显示设备的状态。红色按钮用于显示和切换模式以及立即关闭浇水。黑色按钮开始浇水,如果它已经在运行,则切换到下一个区域。

当您在空闲模式下按下红色按钮时,它将首先在彩色 LED 上显示当前模式,然后在模式之间切换,如下所示:

  • 模式关闭(颜色 LED 红色)
  • 模式开启(彩色 LED 绿色)
  • 模式关闭一次(颜色 LED 紫色)

如果您和客人坐在后院却忘记关掉它怎么办?出于这个原因,我添加了一个警告激活浇水装置。

当开始浇水时,会发生以下情况:

  • 泄漏检查(如果已激活)
  • 打开区域 1 1 秒
  • 暂停一分钟(让您在有客人时切换它..)
  • 在给定的时间内开始给区域 1 浇水(以分钟为单位)
  • 打开区域 2 1 秒
  • 暂停一分钟
  • 在给定的时间内开始给区域 2 浇水(以分钟为单位)
  • 打开区域 3 1 秒
  • 暂停一分钟
  • 在给定的时间内开始给区域 3 浇水(以分钟为单位)

在此期间任何时候按红色按钮,浇水将立即停止,直到下一次预定的浇水才开始。如果按下黑色按钮,它将切换到下一个区域。

软件先决条件

为了安装这个项目的草图,你显然需要在你的 PC 上安装 Arduino IDE。组装部分中的草图和一些测试草图也需要在 Arduino IDE 中安装下面列出的库。

推荐的安装方法如下(适用于除 DS3232RTC 之外的所有设备)。

  • 菜单草图->包含库->管理库...
  • 在“过滤您的搜索...”的右上角,输入库的名称
  • 单击它,然后单击“安装”

所需库:

电气装配

电气部分主要由Arduino Uno、DS3231 RTC、MOSFET4板、彩色LED板和两个按钮组成。

 
pYYBAGNtrTqAdv3kAAG0bNo_Pf8993.png
电气概述
 

如果您对 Arduino 有经验,请跳过以下章节并根据上图进行组装。

连接和测试 DS3231 RTC

 
pYYBAGNtrUaAQ4ADAATD_sAHk40491.jpg
DS3231
 

将手表电池放在 DS3231 RTC 板上并按照概览图所示进行连接。连接如下:

  • RTC PIN SDA = Arduino PIN A4 (SDA)
  • RTC PIN SCL = Arduino PIN A5 (SCL
  • RTC PIN SQW = Arduino PIN 8
  • RTC PIN GND = 面包板 GND(也可以是任何用于测试的 Arduino GND)
  • RTC PIN VCC = Breadboard VCC(5V,也可以是Arduino 5V进行测试)

将以下草图上传到 Arduino Uno 以检查 RTC 芯片是否连接正确。

#include     // http://github.com/JChristensen/DS3232RTC 
#include  // https://github.com/GreyGnome/EnableInterrupt 
#define SLEEP_MODE SLEEP_MODE_IDLE 
#include  // https://github.com/PRosenb/DeepSleepScheduler 
#define RTC_INT_PIN 8 
boolean alarmReceived = false; 
void setup() { 
 Serial.begin(9600); 
 Serial.println(F("Startup ------------")); 
 initRtc(); 
 setSyncProvider(RTC.get); 
 if (timeStatus() != timeSet) { 
   Serial.println(F("RTC not found")); 
 } else { 
   Serial.println(F("RTC found")); 
   Serial.println(F("Testing interrupt connection..")); 
   time_t rtcTime = now(); 
   unsigned int hours = hour(rtcTime); 
   unsigned int minutes = minute(rtcTime); 
   unsigned int seconds = second(rtcTime); 
   // trigger alarm in 5 seconds 
   seconds += 5; 
   if (seconds >= 60) { 
     seconds -= 60; 
     minutes++; 
   } 
   if (minutes >= 60) { 
     minutes -= 60; 
     hours++; 
   } 
   if (hours >= 24) { 
     hours -= 24; 
   } 
   Serial.print(F("Trigger alarm at RTC time ")); 
   Serial.print(hours); 
   Serial.print(F(":")); 
   Serial.print(minutes); 
   Serial.print(F(":")); 
   Serial.println(seconds); 
   RTC.setAlarm(ALM1_MATCH_MINUTES, seconds, minutes, hours, 0); 
   scheduler.scheduleDelayed(checkIfReceived, 10000); 
 } 
} 
void loop() { 
 scheduler.execute(); 
} 
inline void initRtc() { 
 RTC.alarmInterrupt(ALARM_1, true); 
 RTC.alarmInterrupt(ALARM_2, false); 
 // reset alarms if active 
 RTC.alarm(ALARM_1); 
 RTC.alarm(ALARM_2); 
 delay(1000); 
 pinMode(RTC_INT_PIN, INPUT_PULLUP); 
 enableInterrupt(RTC_INT_PIN, isrRtc, FALLING); 
} 
void checkIfReceived() { 
 if (!alarmReceived) { 
   Serial.println(F("Alarm not received, interrupt wire seams not okay.")); 
 } 
} 
void isrRtc() { 
 scheduler.schedule(rtcScheduled); 
} 
void rtcScheduled() { 
 alarmReceived = true; 
 Serial.println(F("Interrupt received, wire looks fine.")); 
 if (RTC.alarm(ALARM_1)) { 
   Serial.println(F("Alarm received, connection of RTC looks fine.")); 
 } else { 
   Serial.println(F("Alarm not received, something looks wrong with the RTC.")); 
 } 
} 

在 Arduino IDE 中单击菜单工具->串行监视器并检查输出。

连接并测试彩色 LED

 
poYBAGNtrUqAcxmKAAIP1Jt_YnY436.jpg
彩色 LED
 

该项目中使用的 RGB 彩色 LED 板本身包含限流电阻(见上图)。请确保您使用的那个也是这种情况,以防止损坏。如果没有,则需要放置单独的电阻器。

有不同的 RGB 颜色 LED。我在这个项目中使用的那个有一个标有“GND”的 PIN。如果您使用一个带有标记为 + 的 PIN,则需要相应地调整测试草图和生产草图(参见 Constants.h 中的 COLOR_LED_INVERTED)。

如概览图所示连接彩色 LED。连接如下:

  • 彩色 LED G = Arduino A0
  • 彩色 LED R = Arduino A1
  • 彩色 LED B = Arduino A2
  • 颜色 LED GND = 面包板 GND(也可以是任何 Arduino GND 进行测试)

将以下草图上传到 Arduino Uno 以检查彩色 LED 是否连接正确。

#define MODE_COLOR_GREEN_PIN A0 
#define MODE_COLOR_RED_PIN A1 
#define MODE_COLOR_BLUE_PIN A2 
void setup() { 
 Serial.begin(9600); 
 pinMode(MODE_COLOR_GREEN_PIN, OUTPUT); 
 digitalWrite(MODE_COLOR_GREEN_PIN, LOW); 
 pinMode(MODE_COLOR_RED_PIN, OUTPUT); 
 digitalWrite(MODE_COLOR_RED_PIN, LOW); 
 pinMode(MODE_COLOR_BLUE_PIN, OUTPUT); 
 digitalWrite(MODE_COLOR_BLUE_PIN, LOW); 
} 
void loop() { 
 Serial.println(F("green")); 
 digitalWrite(MODE_COLOR_GREEN_PIN, HIGH); 
 delay(1000); 
 digitalWrite(MODE_COLOR_GREEN_PIN, LOW); 
 Serial.println(F("red")); 
 digitalWrite(MODE_COLOR_RED_PIN, HIGH); 
 delay(1000); 
 digitalWrite(MODE_COLOR_RED_PIN, LOW); 
 Serial.println(F("blue")); 
 digitalWrite(MODE_COLOR_BLUE_PIN, HIGH); 
 delay(1000); 
 digitalWrite(MODE_COLOR_BLUE_PIN, LOW); 
} 

在 Arduino IDE 中单击菜单工具->串行监视器并观察 LED 的颜色是否与控制台上打印的颜色匹配。

连接和测试 MOSFET4

 
poYBAGNtrXmAT5cFAA3QPBUizVA987.jpg
MOSFET4
 

 

 
poYBAGNtrYKAcVuzAAL8NKv04gk776.jpg
MOSFET4 输入
 

该项目中使用的MOSFET4板包含 4 个 IRF540 MOSFET,包括通过 Arduino PIN 控制它们的所有必要部件。您还可以使用其他带有单个 IRF540 的 MOSFET 或威廉希尔官方网站 板。

如概览图所示连接 MOSFET4 板。引脚 S 是左侧引脚,引脚“-”是输入连接器中的右侧引脚,如上所示(MOSFET4 输入)。中间的 PIN 是 + 我们在这个项目中不需要的。连接如下。

  • MOSFET4 CH1 S = Arduino 4
  • MOSFET4 CH2 S = Arduino 5
  • MOSFET4 CH3 S = Arduino 6
  • MOSFET4 CH4 S = Arduino 7
  • MOSFET4 CH1 - = 面包板 GND(也可以是任何用于测试的 Arduino GND)

将以下草图上传到 Arduino Uno 以检查 MOSFET4 板是否连接正确。

#define VALVE1_PIN 4 
#define VALVE2_PIN 5 
#define VALVE3_PIN 6 
#define VALVE4_PIN 7 
void setup() { 
 Serial.begin(9600); 
 pinMode(VALVE1_PIN, OUTPUT); 
 pinMode(VALVE2_PIN, OUTPUT); 
 pinMode(VALVE3_PIN, OUTPUT); 
 pinMode(VALVE4_PIN, OUTPUT); 
} 
void loop() { 
 Serial.println(F("Valve 1")); 
 digitalWrite(VALVE1_PIN, HIGH); 
 delay(1000); 
 digitalWrite(VALVE1_PIN, LOW); 
 Serial.println(F("Valve 2")); 
 digitalWrite(VALVE2_PIN, HIGH); 
 delay(1000); 
 digitalWrite(VALVE2_PIN, LOW); 
 Serial.println(F("Valve 3")); 
 digitalWrite(VALVE3_PIN, HIGH); 
 delay(1000); 
 digitalWrite(VALVE3_PIN, LOW); 
 Serial.println(F("Valve 4")); 
 digitalWrite(VALVE4_PIN, HIGH); 
 delay(1000); 
 digitalWrite(VALVE4_PIN, LOW); 
} 

您应该看到 MOSFET4 板上的 4 个 LED 一个接一个地亮起。

连接和测试按钮

 
pYYBAGNtrYSADiPRAABH4SHcBUo576.png
黑色防水按钮
 

如概览图所示连接黑色和红色按钮。连接如下:

  • 黑色按钮的任何 PIN = Arduino 10
  • 黑色按钮的其他 PIN = Breadboard GND(也可以是任何用于测试的 Arduino GND)
  • 红色按钮的任何 PIN = Arduino 11
  • 红色按钮的其他 PIN = Breadboard GND(也可以是任何用于测试的 Arduino GND)

将以下草图上传到 Arduino Uno 以检查按钮是否正确连接。

#include  // https://github.com/GreyGnome/EnableInterrupt 
#define START_AUTOMATIC_PIN 10 
#define MODE_PIN 11 
void setup() { 
 Serial.begin(9600); 
 pinMode(START_AUTOMATIC_PIN, INPUT_PULLUP); 
 enableInterrupt(START_AUTOMATIC_PIN, isrStartAutomatic, FALLING); 
 pinMode(MODE_PIN, INPUT_PULLUP); 
 enableInterrupt(MODE_PIN, isrMode, FALLING); 
} 
void loop() { 
 // empty 
} 
void isrStartAutomatic() { 
 // only done in test, do not println in interrupt in production sketch 
 Serial.println(F("black button")); 
} 
void isrMode() { 
 // only done in test, do not println in interrupt in production sketch 
 Serial.println(F("red button")); 
} 

在 Arduino IDE 中,单击 Menu Tools->Serial Monitor 并观察在单击相应按钮时是否在控制台上看到“黑色按钮”和“红色按钮”。

完成电气装配

最后连接水流传感器插头和 12V 电源,但不要连接橙色线。

机械装配

该项目的机械部分由连接器、水流传感器、阀门和出口组成。建议将所有部件连接到至少第一个带有螺纹而不是快速连接器的阀门。这意味着它的机械组装方式如下。

 
poYBAGNtrYiAAOARAALB__MbxtE680.png
装配概述
 

 

 
pYYBAGNtrYqASBfqAABUS94i1Jo845.jpg
水流量传感器
 

 

 
连接器 1/2
连接器 1/2"
 

 

 
poYBAGNtrZGAfPNeAADI5n3tHNc768.jpg
4路交叉耦合
 

顺序如下:

  • 带螺纹的花园水龙头
  • 从花园水龙头螺纹到 1/2" 阀门的连接器
  • 主阀:两端 1/2" 外螺纹
  • 从主阀到水表的连接器:两端 1/2" 内螺纹
  • 水表:两端 1/2" 公头
  • 4 路交叉联轴器:所有螺纹 1/2" 内螺纹
  • 面积 1/2/3 阀门:两端 1/2" 外螺纹
  • 面积 1/2/3 螺纹接头连接器:1/2" 内螺纹到花园房屋的快速接头

连接阀门/水流量传感器:

  • 主阀 = mosfet4 CH1(极性无关紧要)
  • 区域 1 阀门 = mosfet4 CH2
  • 区域 2 阀门 = mosfet4 CH3
  • 区域 3 阀门 = mosfet4 CH4
  • 水流传感器 = 水流传感器插头,请参见水流传感器说明关于 VCC、GND 和信号线是什么线

将电气部件安装在适当的盒子中。我推荐一个正面透明的,这样可以看到内部和彩色 LED。

请仔细检查盒子是否防水。我使用了一个以防水形式出售的盒子,但实际上并非如此。正如你所想象的,系统开始表现得很奇怪,所以我在前面放了一个塑料箔,以更好地保护它免受雨淋。

集成测试

电气和机械组装完成后,您可以对其进行整体测试。

首先移除概览图像上的橙色连接,以便您可以使用 Arduino Uno 的 USB 电缆。使用 USB 时,不要通过其 Vin 为 Arduino Uno 供电,这很重要,否则 PC 的 USB 端口可能会出现问题。

配置

  • 断开您在概览图中看到的橙色连接
  • 使用 USB 电缆将 Arduino Uno 连接到您的 PC
  • 上传主草图“浇水系统”
  • 在 Arduino IDE 中单击菜单工具->串行监视器
  • 选择 9600 波特
  • 您会在控制台中看到初始化输出
  • 按 h 和“输入”键
  • 控制台显示可用命令
  • 使用 d--
    T:(一天 24 小时)设置当前时间,例如 d2017-11-11T20:00
  • 使用 a:(一天 24 小时)设置浇水时间,例如 a21:00
  • 设置区域 1 时长:wz1:<分钟,3 位数字>,例如 wz1:010
  • 设置区域 2 持续时间:wz2:<分钟,3 位数字>,例如 wz2:010
  • 设置区域 3 持续时间:wz3:<分钟,3 位数字>,例如 wz3:010
  • 打印状态:s
  • 检查值和时间是否设置正确
  • 数值和时间存储在 EEPROM 和 RTC 芯片中。只要 RTC 手表电池不空,它们就会在断电时保持

第一次测试

  • 配置完成后,多次按下红色按钮,通过点亮红色、紫色和绿色的彩色 LED 来查看模式是否切换
  • 按下黑色按钮,查看主阀和区域1的阀门是否正确释放
  • 再按一下黑色按钮切换到区域 2 和区域 3
  • 按下红色按钮检查浇水是否停止

完成设置

  • 断开电脑
  • 用 12V 电源重新连接橙色线为 Arduino Uno 供电
  • 使用按钮检查它是否仍然按预期工作
  • 从现在开始监督所有自动和手动运行,以确保不会发生损坏

视频

下面你可以一些简短的视频来解释如何操作浇水系统。

第一个视频展示了如何查看浇水系统处于哪种模式。在此视频中,它以绿色亮起,表示“模式开启”。

 

第二个视频演示了如何在“模式开启”、“模式关闭一次”和“模式关闭”三种模式之间切换。

 

以下视频展示了如何手动开始浇水、在三个区域之间切换并再次关闭浇水。请注意,LED 最后以绿色亮起,表示系统当前处于“模式开启”状态。

 

..这就是你的邻居的样子;-)。

 

 


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

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