marcusme 发表于 2015-12-7 20:06:34

爱小鱼又养不活?——懒人必试自动换水系统

话说楼主小时候呢,养小鸡儿那都是隔天挂~,养小鱼儿是周周没,养只小蝌蚪想看它变成小青蛙,没想到连青蛙腿都看不见小蝌蚪就直挺挺了~~~
一直觉着,估计我这样的马大哈想要养只可爱的水产动物真是此生无望了
NO ! 我们要学会向命运说:不!特别是当有些总有很多超好idear的小伙伴能够给你建议的时~~~这不,在同事jane的提议下,我决定做一个鱼缸自动换水系统。https://v.youku.com/v_show/id_XMTQwNjcyOTU1Mg==.html

这个简易的鱼缸系统能够通过模拟PH计和浊度传感器来检测水质,并通过潜水泵和电磁阀控制系统给水排水,简直太适合我这种天生跟小宠物相克的懒人了有木有~~~
一、元器件清单


序号名称SKU数量
1UNODFR02161
2IO 传感器扩展板 V7.1DFR02651
3浊度传感器SEN01891
4带水管潜水泵FIT02001
5模拟PH计SEN01611
612V电源适配器(和接头)FIT02311
7电磁阀淘宝1
8数字继电器模块DFR00172
9水管五金店2m
10接口(为电磁阀)五金店2
11I2C LCD1602液晶模块DFR00631

如果本身有UNO和扩展板的话,成本是花不了多少钱滴~~其他都是些比较便宜的东西。提醒:接口最好是在买电磁阀的时候一起问卖家买到尺寸一致的,不然像楼主这样直接去五金店购买,麻烦不说,尺寸还不一定合适,如果漏水是很不爽滴~~

二、各个模块功能的实现

1.      给水

给水是整个系统中最easy的一个环节了,我直接使用了df的带水管潜水泵。
https://mc.dfrobot.com.cn/forum.php?mod=image&aid=21773&size=300x300&key=dffe8aaa761adeac&nocache=yes&type=fixnone
泵体放在盛放清水的容器中,把水管放在鱼缸里,只要一通电很容易就实现将清水供给到鱼缸中了。小问题倒是有一个啦,给水的时候水管子老爱动来动去的,不听话。于是我就设计了这个


这么一放,这么一固定,水管君就老实啦。
感谢闯哥悉心教导,让我这个二愣子也能自己使用solidworks设计3D打印件嘿嘿。下面是固定件的模型图片,有兴趣滴朋友阔以参考一下。


(我也会打包放在最后滴)

2.      排水
排水这个环节我倒是废了不少脑子~~

方式一:使用潜水泵来排水
一开始我想着,潜水泵既然可以给水,当然也能排水。可是当我拿到潜水泵的时候我才发现里面带了过滤嘴!!!



应该被换掉的水本身是浑浊的(带了很多鱼便便~~~),如果用潜水泵来排水的话很有可能会导致过滤嘴的堵塞从而不能排水;

方式二:鱼缸打洞
逛了逛淘宝,发现这种方式挺好的,因为不需要花钱买东西嘛。只需要在水位线部分给鱼缸打个洞,然后用玻璃管将鱼缸的底部和外面导通,利用连通器的原理来进行排水就行啦



可素~~~ 我滴鱼缸是玻璃的,一打洞整个玻璃都碎了好么~~~真希望当时朋友给我的是塑料鱼缸,嘿嘿~~~
方式三:电磁阀结合虹吸原理
首先,什么是虹吸原理呢?
是利用液面高度差的作用力现象,将液体充满一根倒U形的管状结构内后,将开口高的一端置于装满液体的容器中,容器内的液体会持续通过虹吸管从开口于更低的位置流出
其实呢,利用咱们中学的物理知识解释就是两个容器液面高低不同,用管子将两者液体连通,不论管子什么形状,在液体自身重力作用下,总有保持液面相平的运动趋势,即将流动的液体所受的合力指向下方,因此液体从高处流向低处啦。一般情况下,鱼缸放置的位置都是在桌上,所以我只需要用一个小桶(或者其他容器)放在地上用一根管子连通就行勒。
排水已经成功实现,我再加上一个电磁阀开关。通电的时候开关打开,没电的时候开关关闭,就能够随心所欲地想排水就排水啦,哈哈突然间就想到一句话呀,黄天不负苦心人(没钱,什么土方法想得出来~~)。{:5_138:}
不过,有三个点要注意一下:
1.水管要小口径的,咱们都是自己养几条小鱼儿,口径太大要是一不小心把小鱼儿吸出去就不好啦。2.电磁阀也尽量买尺寸最小的,网上那些9V的或者12V的就够了,省电又没啥噪声,我们也没必要用这么大滴。3.要利用虹吸原理排水首先一定要让导通两边容器的水管里有水才行呢,这个地方呢,我是让整个系统开始工作的时候用嘴轻轻吸了一嘴~~~~

如果嫌脏呢,可以去某宝上买一个手动抽气的,用手这么一捏,水就被抽过来了。就是下面这个东西:


3.      自动检测PH值和浊度值
为什么我要选择PH值和浊度值作为是否需要换水的指标呢,且听我娓娓道来。PH是什么呢?用较简单的一句话来概括,就是水体中氢离子的活性。而PH7和PH8的氢离子活性并非7和8的区别,而是1和10的区别。于是有些人由于长期没换水,鱼缸里的PH已经跌到5了,一换水,PH变7,水质整整变化了100倍!

那么浊度呢?浑浊分为物理浑浊和生物浑浊,物理浑浊呢就是有不溶于水的物质在鱼缸中悬浮着——大多数来自被分解的鱼便,未消化的植物纤维和无机盐等。而生物浑浊就是水质中的微生物在营养富化的水中大量繁殖。虽然吶,浑浊的直接原因有以上两种,但是究其根本原因,就只有一个——没有及时清理鱼儿们滴便便。我们想想,要是让一个人天天跟自己产的便便生活在一起,不生病才怪呢~~~{:5_127:}
所以呢,换水的关键不是每次换多少比例的水,而是每次换水,让水更清澈的同时还不能让鱼缸里水的PH波动超过0.2,也就是把每次换水的水质变化控制1.6倍以内。如果能做到这点,哪怕换1/2的等温水都没事。如果做不到,那就需要每次换水量更少。基于这种考虑呢,我决定每次只换水大约十分之一到十二分之一左右。但是呢,这个换水的频率一定要高,也就是每次检测到PH值和浊度值不符合规范了就要开始换水。臆测了一下,每天也就三四次次,也不算多。主要是,,,这又不用咱自己换对不对。
4.      显示
显示这个环节呢,我使用的是I2C LCD1602液晶模块。


为啥?俩字儿——“情怀”!蓝色背光~~~白色字符~~对比度可调~~一股浓浓的复古感好么,通电的一刹那就带给我一种上世纪八十年代的实验室即视感。{:5_131:}

好吧,所有情怀的背后都有一个叫做“没钱”的爹~~
三、水位平衡测试

这个问题需要单独拎出来做个说明,虽然我们已经能够实现排水和给水的自动化了。但是,我们并不能在这个自动化之下保持水位的平衡,这是因为排水和给水的速度是不相同的它们的速度在出厂的时候都已经定下来了。所以,我要想办法测出排水给水的速度,然后依此来修改他们每次工作的时间已达到水位的平衡;

我是这样测试滴:首先,我目测了一下我滴小鱼缸大概也就15L,每次换水十分之一大概也就1.5L,四舍五入一下我决定使用2L的水来作测试。
木有量杯~所以我决定使用一次性杯子,一次性杯子的容量是250ml


2L也就8杯水,我用这种一次性杯子接了8次倒入上面的桶中,接着开始测试给水速度:


给水的同时开始用手机的秒表计时,最后得到给水时间如下:


接着是排水速度的测试:


同时也记录排水时间如下:

so...
给水时间:1.01.71=61.71S
给水速度:2000/61=32.41ml/s
排水时间:3.56.20=236.20S
排水速度:2000/236.20=8.47ml/s




四、代码

<font face="微软雅黑">#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2);//设置lcd地址为0x20,每行16个字符,2行
#define TurbidityPin A0//浊度传感器连接到A0
#define PHPin A1//PH传感器连接到A1
#define Jinshuipin 11//控制进水的继电器连接到11口
#define Paishuipin 12//控制排水的继电器连接到12口
float Turbidityval;//定义浊度值
float PHval;//定义PH值
void setup()
{
lcd.init();//初始化lcd                     
lcd.backlight();//打开背光灯
pinMode(Jinshuipin, OUTPUT);//控制进水的继电器引脚
pinMode(Paishuipin, OUTPUT);//控制出水的继电器引脚
Serial.begin(9600); // 打开串行口,定义波特率为9600
}
void loop()
{
   getTurbidity();//读取浊度
   getPH();//读取PH值


   if (Turbidityval<4.06|| PHval<7.0||PHval>8)//如果浊度传感器输出小于4V或者PH值小于6.5
   {
    delay(10000);
    getTurbidity();//读取浊度
    getPH();//读取PH值
    if(Turbidityval<4.06||PHval<7.0||PHval>8)//浊度和PH的值依旧满足换水条件
    {
    Serial.print("change water");
    Paishui();//开始排水
    Jinshui();//开始进水
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("change water");
    delay(20000);//排水给水过程持续20s
    Jinshui_end();//结束进水
    lcd.setCursor(0,0);
    lcd.print("change water");
    delay(56000);//继续排水56s
    }
   else
    {
      Serial.print("   no change ");
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("no change");
      Paishui_end();//结束排水
      Jinshui_end();//结束进水
      delay(8000);//等待10s之后继续返回浊度和PH值
      }   
    }
else
    {
      delay(10000);//等待10s之后继续返回浊度和PH值
    }
}

void getTurbidity()//浊度值测试程序
{
   Turbidityval=analogRead(A0)/1024.0*5.0;
   Serial.print("    Trubidity value: ");
   Serial.println( Turbidityval);//打印浊度值
   lcd.setCursor(0,0);
   lcd.print("Turbidity:");
   lcd.setCursor(12,0);
   lcd.println(Turbidityval);
}

void getPH()//PH值测试程序
{
PHval=analogRead(A1)/1024.0*5.0*1.45;
Serial.print("    PH value: ");   
Serial.println(PHval);
   lcd.setCursor(0,1);
   lcd.print("PH:");
   lcd.setCursor(12,1);
   lcd.println(PHval);
}


void Jinshui()//进水程序
{
    digitalWrite(Jinshuipin, HIGH);
    }

   
void Paishui()//排水程序
{
    digitalWrite(Paishuipin, HIGH);
    }

   
void Jinshui_end()//进水程序结束
{
    digitalWrite(Jinshuipin, LOW);
    }

   
void Paishui_end()//排水程序结束
{
    digitalWrite(Paishuipin, LOW);
    }

</font>
都加了详细地注解哦,相信大部分地方都不用我再解释了。不过有一个地方我还要啰嗦一下:
         
“if (Turbidityval<4.06|| PHval<7.0||PHval>8)//如果浊度传感器输出小于4V或者PH值小于6.5
   {
    delay(10000);
    getTurbidity();//读取浊度
    getPH();//读取PH值
    if(Turbidityval<4.06||PHval<7.0||PHval>8)//浊度和PH的值依旧满足换水条件”

这里为啥有两个if语句呢?
原因就在于,有时候鱼儿不小心通过了浊度传感器或者刚好给小鱼们喂食的时候,如果把鱼料撒在了浊度传感器旁边就会出现短暂的浑浊。
吶,我们肯定知道这种时候并不是水真的浑浊需要换水了。可是,机器它不知道,所以,我们要让机器知道,嘿嘿。{:5_193:}
于是呢,我就加入了这一行代码,要在10s的时间段里检测到浊度都变浑浊了,才会判定为浊度不达标了~(话说10s的时间应该够小鱼儿们把某个区域的饲料都洗劫一空了吧~~)
对于排水给水时间来说:因为打算高频少量,所以每次给水时间只有20 S,则排水时间应该为20*3.8=76 S
五、啰嗦两句

其实把,楼主最大的愿望就是能够在以后能够做一个超级智能的鱼缸系统~~~~



当然比我上面的这个高端大气多了

它能够养殖所有在中国这个大部分处于温带的国家里所不能看见的或者只存在于与深海里的神奇小动物们。
比如:


冰海小精灵

蛋黄水母:



海兔:


长脚牛鱼:



当然,还有《海底总动员》里那只热心又健忘的蓝唐王与Dory:


嘿嘿,,,是不是想太多了啊哈



shinkpad 发表于 2015-12-8 09:42:51

{:5_190:}            

刹那ZF清英 发表于 2015-12-7 22:41:35

:$哇哦好牛逼的设计   

marcusme 发表于 2015-12-8 11:02:42

刹那ZF清英 发表于 2015-12-7 22:42
不过我尝试过海绵用不久就会堵住,建议换上滤网不行的话纱窗割一块呗 ...

我倒是想起来,加过滤网的话,稍微大一点的垃圾比如鱼便便可能排不出去,我应该在底部放一曾带小孔的塑料板,然后做个洞把导管插过去,这样就能把鱼和排水管隔开了,而且,鱼便便也都能抽出去了,嘿嘿嘿。

丄帝De咗臂 发表于 2015-12-7 20:20:37

做得很好,就是最后,我也别的养辣么多小动物,你确实想的有点多{:5_172:}

dsweiliang 发表于 2015-12-7 20:30:15

出水口加块海绵,不然会把雨吸住

dsweiliang 发表于 2015-12-7 20:30:21

大连林海 发表于 2015-12-7 21:24:33

做得很好{:5_142:}

刹那ZF清英 发表于 2015-12-7 22:42:43

dsweiliang 发表于 2015-12-7 20:30
出水口加块海绵,不然会把雨吸住

不过我尝试过海绵用不久就会堵住,建议换上滤网不行的话纱窗割一块呗

virtualwiz 发表于 2015-12-7 22:47:26

LZ真用心啊~

virtualwiz 发表于 2015-12-7 22:48:24

大赞~配合自动投食器,养鱼也可以全自动化啦

hnyzcj 发表于 2015-12-8 07:27:43

厉害,你真养了这么多鱼吗啊

marcusme 发表于 2015-12-8 10:58:35

丄帝De咗臂 发表于 2015-12-7 20:20
做得很好,就是最后,我也别的养辣么多小动物,你确实想的有点多

哈哈哈,先想着嘛,说不定哪天就真真地实现了。嘿嘿嘿

marcusme 发表于 2015-12-8 11:01:00

dsweiliang 发表于 2015-12-7 20:30
出水口加块海绵,不然会把雨吸住

说到点子上了,这一点是我忽略了,嘿嘿。
我之前就想着大管子可能会吸走小鱼所以用小管子,但是小管子万一把小于吸在那儿就不好了,加个过滤网啥的应该挺好,哈哈。

marcusme 发表于 2015-12-8 11:04:04

hnyzcj 发表于 2015-12-8 07:27
厉害,你真养了这么多鱼吗啊

想想而已啦~~~
    我总是养不活{:5_167:}

marcusme 发表于 2015-12-8 11:05:26

virtualwiz 发表于 2015-12-7 22:48
大赞~配合自动投食器,养鱼也可以全自动化啦

嘿嘿,我也觉得。

marcusme 发表于 2015-12-8 11:06:46

大连林海 发表于 2015-12-7 21:24
做得很好

嘿嘿嘿嘿,还有很多地方有待改进。
等改天无聊了把它再改进改进然后真真地养个几只小鱼儿。

marcusme 发表于 2015-12-8 11:07:19

刹那ZF清英 发表于 2015-12-7 22:41
哇哦好牛逼的设计

{:5_190:}

luna 发表于 2015-12-8 12:04:05

好详细的教程~~是原创吗?

marcusme 发表于 2015-12-8 12:19:00

luna 发表于 2015-12-8 12:04
好详细的教程~~是原创吗?

嘿嘿,是滴。

visionsl 发表于 2015-12-8 12:24:44

真不错, 大赞
页: [1] 2 3
查看完整版本: 爱小鱼又养不活?——懒人必试自动换水系统