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

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


前言

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

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

先来看看我毕设的整体框架吧:

整体思路就是:
用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 UNO的开发板是克隆板,和意大利原板外貌不太一样,但功能是一样的。注意意大利板只有一个5V的接口,我的克隆板有两个5V接口。

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

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

#include <OneWire.h>
#include <DallasTemperature.h>

// 数据输出脚接开发板数字引脚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);
}

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

我是这么接的:
在这里插入图片描述
黑色那部分是加热棒。加热棒正极是粉色的线,负极是白色的线。把这两根线和杜邦线接在一起(把杜邦线一头割断,露出类似于漆包线的部分,把杜邦线漆包线部分和加热棒漆包线部分缠在一起,可以先拿小刀刮一刮漆包线部分的漆,防止两部分线接触不良。)然后拿焊锡把它俩焊住。最后拿热熔胶把接口封装。如下图所示:
在这里插入图片描述
下面充氧泵和水泵也是这么接。它俩就只上图不解释了。

2.水位传感器部分

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

接线图:
在这里插入图片描述

实物图:
在这里插入图片描述
拍实物图只是为了留作纪念,具体接线以接线图为准。这里没有拔温度传感器的线因为最后要把三块子代码合起来再跑一遍。
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值
}

运行结果:
在这里插入图片描述
在这里插入图片描述

需要强调的是,我的水位传感器价格低廉,所以不是很灵敏,延迟数值在50左右,在实际做实物的时候,在代码中设定的数值要根据误差进行调整,我的已经调整过了。
第二个小任务也完成啦~
接水泵的实物图:
在这里插入图片描述
手机拍的有点朦胧。不过不影响。

3.溶解氧传感器部分

上面已经提到过了,溶解氧传感器太贵了,所以我用电位器模拟溶解氧输出的值。
接线图:
在这里插入图片描述

实物图:
在这里插入图片描述
上代码:

#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);
  }
    
}

运行结果:
在这里插入图片描述
连接充氧泵实物图:
在这里插入图片描述

4.全部代码

#include <OneWire.h>
#include <DallasTemperature.h>
#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部分就完美结束了!接下来就是重头戏树莓派部分,我去歇一会儿,下一篇文章再写吧。

  • 10
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
基于单片机的智能鱼缸的设计与实现毕业设计 目 录 摘 要 I Abstract II 1 绪论 1 1.1课题背景 1 1.2国内外研究现状 1 1.3研究目的 2 2 开发技术与原理简介 4 2.1嵌入式技术 4 2.2传感器技术 4 2.3 Android技术 4 2.3.1 Android智能手机平台概述 4 2.3.2 Android手机平台的特点 5 2.3.3 Android系统软件架构 5 3 需求分析 6 3.1功能需求 6 3.1.1系统的特点及功能描述 6 3.1.2系统流程分析 6 3.2用例分析 7 3.3 开发工具 11 3.3.1 底层硬件电路开发工具 11 3.3.2底层系统开发工具 12 3.3.3 Android客户端开发工具 12 4 概要设计 13 4.1系统总体方案与功能 13 4.1.1系统功能组成 13 4.1.2系统控制参数 14 4.2系统的硬件结构 14 4.3系统的软件设计 15 5 详细设计 17 5.1单片机系统设计 17 5.1.1单片机选型 17 5.1.2单片机最小系统设计 18 5.1.3详细说明 21 5.2温度传感器模块设计 22 5.2.1温度传感器选型 22 5.2.2温度传感器电路设计 23 5.3蓝牙串口模块设计 23 5.3.1串口技术 23 5.3.2蓝牙串口电路设计 25 5.3.3系统通讯协议设计 25 5.3.4系统通讯详细说明 26 5.4时钟模块设计 27 5.4.1时钟芯片选型 27 5.4.2时钟模块电路设计 27 5.5 Android客户端设计 28 5.5.1 Android蓝牙通信设计 28 5.5.2 Android界面设计 29 6 系统实现 31 6.1 底层设备软件实现 31 6.1.1系统软件流程图 31 6.1.2底层系统算法设计 32 6.2手机端软件实现 35 6.2.1手机端软件流程图 35 6.2.2底手机端软件算法设计 36 6.3软硬件设备实物图 38 6.3.1硬件设备实物图 38 6.3.2手机端软件截图 40 7 系统测试 41 7.1LED灯光变换测试 41 7.2检测温度测试 42 7.3水循环控制系统测试 42 7.4充氧模块测试 43 结束语 44 致 谢 45 参 考 文 献 46 摘 要 近年来嵌入式发展迅速,智能家居也进入了人们的生活。智能鱼缸却没有快速发展。我 根据市场上相关设备现状的分析和研究,从系统集成角度进行设计和开发,提出了一套 多功能的智能观赏鱼缸控制系统的设计方案。 该控制系统以STC12C5A60S2单片机为控制核心,结合传感器技术,集多种控制功能于一 体,包括检测温度、自动充氧、自动换水、灯光变换和自动喂食等,同时在系统中设计 一个蓝牙通信模块,可实现对鱼缸的远程控制和管理。整个系统分为两个部分:第一部 分是以STC12C5A60S2为核心的控制部分,实现对各种控制参数的设置、存储、和处理。 第二部分是手机安卓部分,通过手机端APP可以对鱼缸进行实时控制、参数设置等,实现 人机交互。两个部分之间采用蓝牙通讯技术,将数据信息在上位机与下位机之间交互传 输。 该系统根据当前市场上的需求进行设计和开发,形成了一套自动充氧、自动换水、灯光 变换和自动喂食等功能为一体的集成控制系统。同时该系统设计灵活、成本低廉,便于 量产,可广泛用于家庭和宾馆等安装观赏鱼缸的场所。 关键词:鱼缸,自动控制,单片机,蓝牙通讯,APP Abstract In recent years, with the development of embedded, intelligent household also entered people's lives. The intelligent aquarium is not development. I according to the current market analysis and research status quo of related equipment, system integration from the perspective of design and development, a set of multi-functional intelligent fish tank control system design. The control system STC12C5A60S2 microcontroller core. Combined with sensor technology. Set a variety of control functions. Including temperature detection, a

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值