【物联网毕设】基于arduino与树莓派的智能鱼缸【一】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 零、智能鱼缸框架与项目整体思路
  • 一、Arduino与传感器部分
    • 1.温度传感器部分
    • 2.水位传感器部分
    • 3.溶解氧传感器部分
    • 4.全部代码
  • 总结


前言

  第一次写文章,不知道该说什么好。对于我这种大学四年潜心划水,现在只会写简单的C的小白来说。要完完整整的做一个物联网小项目简直是太难了。找遍了全网,也没有找到一家和我项目类似的。在一天天磨进度,查资料的日子里,我真心希望遇到这么一篇文章。能直接带我一步步做完整个毕设哈哈哈哈。所以我决定把我的毕设全部都记录下来,细到每一小步。很多代码都是copy来的,我也不懂为什么,但是它就是能用。所以如果你想学专业的知识和原理,这一系列文章帮不了你什么。但如果你的毕设和我很像或者一样,我的这一系列能省出你很多查资料的时间。

零、智能鱼缸框架与项目整体思路

先来看看我毕设的整体框架吧:
【物联网毕设】基于arduino与树莓派的智能鱼缸【一】_第1张图片
整体思路就是:
用Arduino开发板(我用的是太极创客的arduino UNO克隆板,因为意大利的板有点贵QAQ)读取温度传感器、水位传感器、溶解氧传感器的值,然后分别控制四个继电器工作。当温度低于25℃,继电器1控制加热棒开启,当温度高于25℃,加热棒关闭;把水位传感器放在鱼缸合适的高度,当水位低于水位传感器上的1cm刻度时(水位传感器上有刻度,后面讲到这部分会放图),继电器2控制注水水泵开启,往鱼缸里注水,当水位处在传感器1cm~3cm时,继电器2和3都处于关闭状态,当水位在3cm以上时,继电器3控制抽水水泵开启,给鱼缸抽水;溶解氧传感器部分有点问题,就是它太贵了!某宝小小一个要3k+,咱也不知道为什么这么贵,经过和导师商量,最后实物用电位器来模拟溶解氧传感器输出的值,根据资料,一般鱼类在溶解氧5mg/L以上的水中能正常生存,那就设定当溶解氧浓度低于5时,继电器4控制充氧泵开启。Arduino部分结束。
最难的就是树莓派部分了,我的树莓派是3B。大致思路就是Arduino把传感器数据发送给树莓派,(这里涉及到Arduino和树莓派之间通讯的问题,我用的是USB通讯,后面细讲。)然后树莓派接收到数据后,通过web服务器将数据写入MySQL数据库(这里涉及到四个问题:树莓派上安装Django并用Django搭建web服务器;在树莓派上安装MySQL数据库;web服务器与MySQL数据库进行连接;树莓派通过服务器接口post给服务器值,服务器通过另一个接口get到树莓派的最新值)。最后小程序也是通过get请求,通过服务器读取到数据库的值,显示在小程序的界面上。(这里涉及到微信小程序的开发,后面细讲)目前的整体思路就是这样。
后续如果有时间的话,会给小程序增加按钮,实现手动开关增氧泵、加热棒、水泵;会给树莓派加一个摄像头,抓取鱼缸图片或视频放到小程序界面上。

那接下来就一部分一部分的细说吧!

一、Arduino与传感器部分

1.温度传感器部分

首先去官网下载Arduino IDE后续敲代码要用
温度传感器我用了DS18B20防水的那款,提醒一下如果在某宝上买,最好连它配套的模块也一起买了,否则的话后续接线要接一个上拉电阻。模块的引脚就三个VCC、GND和DAT,挺方便。

如果你想了解更多,推荐链接:点我

接线图:
【物联网毕设】基于arduino与树莓派的智能鱼缸【一】_第2张图片
我用的Arduino UNO的开发板是克隆板,和意大利原板外貌不太一样,但功能是一样的。注意意大利板只有一个5V的接口,我的克隆板有两个5V接口。

实物图:
【物联网毕设】基于arduino与树莓派的智能鱼缸【一】_第3张图片
实物图拍照还是挺乱的,主要还是看上面的接线图连吧。
这里的实物图没接加热棒,经过实践之后,发现存在Arduino和树莓派供电不足,带不动加热棒、充氧泵和两个水泵的问题。于是给arduino又加了一个电源供电。接线图都有体现。
总体来说就是:
树莓派单独给一个电源供电。
Arduino UNO和树莓派用USB连接,但是仅仅由树莓派给Arduino供电是远远不够的,Arduino要再接一个独立电源给它供电。
温度传感器、溶解氧传感器(用电位器代替)、水位传感器、四个继电器由Arduino的5V引脚供电。
两个水泵、充氧泵和加热棒由Arduino的另外一个5V引脚供电。

这些接线图里都有体现,照着接线图连就没什么问题。
Arduino IDE上代码如下:

#include 
#include 

// 数据输出脚接开发板数字引脚2
#define tempPin 2

OneWire oneWire(tempPin);
DallasTemperature sensors(&oneWire);

int relaypin1=3;//继电器1引脚为3
float temperature;
void setup(void)
{
  pinMode(relaypin1,OUTPUT);//继电器1输出模式
  pinMode(tempPin,OUTPUT);//温度传感器输出模式
  Serial.begin(9600);//连接到电脑串口监视器
  sensors.begin();
}
void loop(void)
{ 
  sensors.requestTemperatures(); // 发送命令获取温度
  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0)); 
  temperature=sensors.getTempCByIndex(0);
  delay(500); 
  if(temperature<25)//如果温度小于25度
  {
    digitalWrite(relaypin1, HIGH);        //继电器1开,加热棒开
    Serial.println("加热棒开");
  }
  else
  {
    digitalWrite(relaypin1,LOW);  //继电器1关,加热棒关
    Serial.println("加热棒关"); 
  }
  delay(500);
}

结果:
【物联网毕设】基于arduino与树莓派的智能鱼缸【一】_第4张图片
第一个小任务就完成啦!
但是我们只是接了继电器,继电器要控制加热棒工作。这里建议买USB接口的加热棒,后面的水泵、充氧泵也统统买USB接口的。拿到之后把USB接口出拿小刀割开,发现只有两根线,一根VCC,一根GND,构造非常简单,如图:
【物联网毕设】基于arduino与树莓派的智能鱼缸【一】_第5张图片
图片有点大凑合着看吧哈哈懒得调了。
那么我们怎么把这两根线和继电器接起来从而使继电器控制加热棒工作呢?
上图解释!
【物联网毕设】基于arduino与树莓派的智能鱼缸【一】_第6张图片
自己手画了凑合着看吧奥~继电器相当于一个开关的作用,有一个公共端COM,一个常开端NO,一个常闭端NC,我的继电器使高电平触发,当我连接Arduino的那端发出一个高电平信号时,常闭端的衔铁打到常开端,我的电路就通了,加热棒就开始工作了。后面的水泵和充氧泵也是一个道理。你可以用杜邦线处理一下,让我们的接线更好看。

我是这么接的:
【物联网毕设】基于arduino与树莓派的智能鱼缸【一】_第7张图片
黑色那部分是加热棒。加热棒正极是粉色的线,负极是白色的线。把这两根线和杜邦线接在一起(把杜邦线一头割断,露出类似于漆包线的部分,把杜邦线漆包线部分和加热棒漆包线部分缠在一起,可以先拿小刀刮一刮漆包线部分的漆,防止两部分线接触不良。)然后拿焊锡把它俩焊住。最后拿热熔胶把接口封装。如下图所示:
【物联网毕设】基于arduino与树莓派的智能鱼缸【一】_第8张图片
下面充氧泵和水泵也是这么接。它俩就只上图不解释了。

2.水位传感器部分

水位传感器接线的时候要注意,因为不能长期在潮湿的环境下工作,探针通电后,腐蚀速度将显著提高,所以而应仅在获取读数时才为其供电。一种简单的方法是将VCC引脚连接到Arduino的数字引脚,然后根据需要将其设置为HIGH或LOW。因此,我们将VCC引脚连接到Arduino的数字引脚#7。
如果你想更详细的了解水位传感器,推荐链接:点我

接线图:
【物联网毕设】基于arduino与树莓派的智能鱼缸【一】_第9张图片

实物图:
【物联网毕设】基于arduino与树莓派的智能鱼缸【一】_第10张图片
拍实物图只是为了留作纪念,具体接线以接线图为准。这里没有拔温度传感器的线因为最后要把三块子代码合起来再跑一遍。
Arduino代码如下:

//水位传感器引脚
#define waterpower 7 //水位传感器VCC引脚
#define waterpin A0  //水位传感器输出引脚
int relaypin2=4;//水位传感器继电器引脚为4
int relaypin3=5;//水位传感器继电器引脚为5
int val=0;
int waterlevel;
void setup()
{
  pinMode(relaypin2,OUTPUT);//继电器输出模式
  pinMode(relaypin3,OUTPUT);//继电器输出模式
  pinMode(waterpower,OUTPUT);//将水位传感器VCC引脚设置成输出模式
  digitalWrite(waterpower,LOW);//先将水位传感器VCC引脚关闭
  Serial.begin(9600);//串口开启
}
void loop()
{
  int level=readwatersensor();//让level=val
  waterlevel=readwatersensor();//让waterlevel=val
  Serial.print("water level: ");//打印水位值
  Serial.println(level);//打印水位值
  delay(1000);//延迟1秒
  if(waterlevel<550)//如果水位在传感器1CM之下
  {
    digitalWrite(relaypin2, HIGH);//继电器2开,放水水泵开
    Serial.println("继电器2开,放水!");
  }
  else
  {
    if(waterlevel>640)
    {
       digitalWrite(relaypin3, HIGH);//继电器3开,抽水水泵开
       Serial.println("继电器3开,抽水!");
    }
    else
    {
      digitalWrite(relaypin2, LOW);//继电器2关
      digitalWrite(relaypin3, LOW);//继电器3关
      Serial.println("继电器2,3关!");
    }
  }
  
}
int readwatersensor()
{
  digitalWrite(waterpower,HIGH);//将水位传感器VCC电源打开给传感器供电
  delay(10);
  val=analogRead(waterpin);//读取水位传感器A0引脚的值
  digitalWrite(waterpower,LOW);//将水位传感器电源关闭
  return val;//返回val值
}

运行结果:
【物联网毕设】基于arduino与树莓派的智能鱼缸【一】_第11张图片
【物联网毕设】基于arduino与树莓派的智能鱼缸【一】_第12张图片

需要强调的是,我的水位传感器价格低廉,所以不是很灵敏,延迟数值在50左右,在实际做实物的时候,在代码中设定的数值要根据误差进行调整,我的已经调整过了。
第二个小任务也完成啦~
接水泵的实物图:
【物联网毕设】基于arduino与树莓派的智能鱼缸【一】_第13张图片
手机拍的有点朦胧。不过不影响。

3.溶解氧传感器部分

上面已经提到过了,溶解氧传感器太贵了,所以我用电位器模拟溶解氧输出的值。
接线图:
【物联网毕设】基于arduino与树莓派的智能鱼缸【一】_第14张图片

实物图:
【物联网毕设】基于arduino与树莓派的智能鱼缸【一】_第15张图片
上代码:

#define oxygenpin A1
int relaypin4=9;//溶解氧传感器继电器引脚为9
void setup()
{
  Serial.begin(9600);
  pinMode(relaypin4,OUTPUT);//溶解氧继电器4输出模式  
}
void loop()
{
  int analog=analogRead(A1);//读取模拟输入值
  int oxygenlevel=map(analog,0,1023,0,10);//将模拟输入0~1023等比映射到0mg/L~10mg/L
  Serial.print("oxygen level: ");//打印水位值
  Serial.println(oxygenlevel);//打印水位值
  analogWrite(9,oxygenlevel);
  if(oxygenlevel<5)
  {
    digitalWrite(relaypin4, HIGH);//继电器4开,充氧泵开
    Serial.println("继电器4开,充氧!");
    delay(500);
  }
  else
  {
    digitalWrite(relaypin4, LOW);//继电器4关,充氧泵开
    Serial.println("继电器4关,充氧泵关!");
    delay(500);
  }
    
}

运行结果:
【物联网毕设】基于arduino与树莓派的智能鱼缸【一】_第16张图片
连接充氧泵实物图:
【物联网毕设】基于arduino与树莓派的智能鱼缸【一】_第17张图片

4.全部代码

#include 
#include 
#define tempPin 2// 温度传感器数据输出脚接开发板数字引脚2
#define waterpower 7 //水位传感器VCC引脚
#define waterpin A0  //水位传感器输出引脚
#define oxygenpin A1//溶解氧传感器输出引脚
OneWire oneWire(tempPin);
DallasTemperature sensors(&oneWire);

int relaypin1=3;//温度传感器继电器1引脚为3
float temperature;
int relaypin2=4;//水位传感器继电器2引脚为4
int relaypin3=5;//水位传感器继电器3引脚为5
int val=0;
int waterlevel;
int relaypin4=9;//溶解氧传感器继电器引脚为9
void setup(void)
{
  pinMode(relaypin1,OUTPUT);//设置继电器1为输出模式
  pinMode(tempPin,OUTPUT);//温度传感器输出模式
  Serial.begin(9600);//连接到电脑串口监视器
  sensors.begin();
  pinMode(relaypin2,OUTPUT);//继电器输出模式
  pinMode(relaypin3,OUTPUT);//继电器输出模式
  pinMode(waterpower,OUTPUT);//将水位传感器VCC引脚设置成输出模式
  digitalWrite(waterpower,LOW);//先将水位传感器VCC引脚关闭
  pinMode(relaypin4,OUTPUT);//溶解氧继电器4输出模式  
 
}
int readwatersensor()
{
  digitalWrite(waterpower,HIGH);//将水位传感器VCC电源打开给传感器供电
  delay(10);
  val=analogRead(waterpin);//读取水位传感器A0引脚的值
  digitalWrite(waterpower,LOW);//将水位传感器电源关闭
  return val;//返回val值
}
void loop(void)
{ 
  sensors.requestTemperatures(); // 发送命令获取温度
  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0)); 
  temperature=sensors.getTempCByIndex(0);
  delay(500); 
  if(temperature<25)//如果温度小于25度
  {
    digitalWrite(relaypin1, HIGH);        //继电器1开,加热棒开
    Serial.println("加热棒开");
  }
  else
  {
    digitalWrite(relaypin1,LOW);  //继电器1关,加热棒关
    Serial.println("加热棒关"); 
  }
  delay(500);
  //水位
  int level=readwatersensor();//让level=val
  waterlevel=readwatersensor();//让waterlevel=val
  Serial.print("water level: ");//打印水位值
  Serial.println(level);//打印水位值
  delay(1000);//延迟1秒
  if(waterlevel<550)//如果水位在传感器1CM之下
  {
    digitalWrite(relaypin2, HIGH);//继电器2开,放水水泵开
    Serial.println("继电器2开,放水!");
    delay(2000);//延迟2秒
  }
  else
  {
    if(waterlevel>640)
    {
       digitalWrite(relaypin3, HIGH);//继电器3开,抽水水泵开
       Serial.println("继电器3开,抽水!");
       delay(2000);//延迟2秒
    }
    else
    {
      digitalWrite(relaypin2, LOW);//继电器2关
      digitalWrite(relaypin3, LOW);//继电器3关
      Serial.println("继电器2,3关!");
      delay(2000);//延迟2秒
    }
  }
  //溶解氧
   int analog=analogRead(A1);//读取模拟输入值
  int oxygenlevel=map(analog,0,1023,0,10);//将模拟输入0~1023等比映射到0mg/L~10mg/L
  Serial.print("oxygen level: ");//打印水位值
  Serial.println(oxygenlevel);//打印水位值
  analogWrite(9,oxygenlevel);
  if(oxygenlevel<5)
  {
    digitalWrite(relaypin4, HIGH);//继电器4开,充氧泵开
    Serial.println("继电器4开,充氧!");
    delay(500);
  }
  else
  {
    digitalWrite(relaypin4, LOW);//继电器4关,充氧泵开
    Serial.println("继电器4关,充氧泵关!");
    delay(500);
  }
}


整体运行结果:
【物联网毕设】基于arduino与树莓派的智能鱼缸【一】_第18张图片

总结

到此为止,Arduino部分就完美结束了!接下来就是重头戏树莓派部分,我去歇一会儿,下一篇文章再写吧。

你可能感兴趣的:(物联网,web,app)