基于Arduino Uno 开发板制作的自动浇水装置
目录
摘要
一、项目背景
二、实现思路
三、Arduino相关理论介绍
3.1 基础理论
3.2 调用库相关理论
3.3 调用摄像头理论
3.4 基于 Arduino 的自动浇水理论
四、现状调研
五、装置结构
5.1 Arduino Uno开发板
5.2 LCD屏幕
5.3 DHT22温湿度检测仪
5.4 继电器和水泵模块
5.5 按钮
5.6 摄像头和TF读写模块
5.7 制作过程及代码
六、致谢
摘要
我们在随着科技的发展,园艺领域也需要更多的自动化和智能化来提高效率和质量。然而,目前市场上大部分的自动浇水装置存在一定的缺陷,无法实现精准控制,同时缺乏对环境因素的考虑。因此,我们提出了一个基于Arduino
的自动浇水装置项目,旨在解决这些问题。
该项目的核心是利用Arduino Uno开发板
作为控制中心,结合温湿度传感器
、摄像头
等设备实现自动浇水的功能。具体来说,当温湿度传感器
检测到环境湿度低于设定值时,摄像头
会拍摄植物图像并分析其颜色变化,以判断植物是否需要浇水。如果需要浇水,装置会自动打开水泵
进行浇水,并在浇水完成后进行反馈。
Arduino
是一款开源的单片机开发板,具有丰富的外设和易于学习的编程语言。在项目中,我们主要运用Arduino
的基础理论,包括数字和模拟输入输出、中断处理等。同时,我们还需要掌握如何调用和使用外部库,以便实现对水泵、摄像头等设备的控制。此外,调用摄像头对TF卡进行覆写也是该项目的难点之一。我们可以通过使用adafruit ov7670
等库来实现对摄像头图像的获取和处理。
在项目实施前,我们需要对自动浇水和延时摄影的发展现状进行调研。通过查阅文献和网络搜索,我们了解到目前的自动浇水装置主要存在以下问题:无法精准控制水量、缺乏对环境因素的考虑、维护成本高等。而延时摄影技术则可以拍摄长时间变化的场景,并生成视频文件进行展示。在调研中,我们发现目前的延时摄影设备大多比较昂贵,且操作复杂,不利于普及应用。
该装置主要包括Arduino Uno开发板
、LCD屏幕
、DHT22温湿度检测仪
、继电器
和水泵
、按钮
、摄像头
和TF读写模块
等部件。其中,Arduino Uno开发板
作为控制中心,负责处理各个部件之间的通信和控制信号;LCD屏幕
可以显示温湿度信息和拍摄的植物图像;DHT22温湿度检测仪
用于检测环境湿度;继电器
和水泵
用于控制水泵的开关和水流量的调节;按钮
用于手动控制装置的开关;摄像头
用于拍摄植物图像;TF读写模块
用于存储和读取拍摄的图像数据
一、项目背景
在上学期我们在学校的温室中种植了太空苜蓿,在一开始在我们的悉心照料下茁壮的成长(如图一.1)但是因为上学期期中之后学业繁重专心学习,并没有时间积极的去浇水和对温室进行控温。所以非常不幸我们的太空苜蓿去世了(如图一.2) 同时我们也积极思考没有时间浇水和通风的问题,于是我们想到了运用Arduino Uno开发版
的方式对无法及时浇水的问题进行解决,经过人性化的设计我们可以通过两个按钮来实现不同植物有不同的湿度(上面的按钮加10%的湿度,下面的按钮减10%的湿度)。在LCD显示屏
上可以显示温度、湿度。以及土壤或水的状态,
今年我们又从新种上了紫花苜蓿。为了我们更好的观测实验室的数据我们运用了摄像头模块
,同时我们调整了它每16秒拍摄一张照片并存储在TF卡
之中这样我们还可以在之后合成延时摄影。
二、实现思路
本装置主要由以下几个部分组成:Arduino Uno开发板
、DHT22温湿度模块
、摄像头模块
、继电器模块
、TF卡读写模块
和LCD屏幕模块
。这些模块的功能如下:
- Arduino Uno开发板:作为整个装置的控制核心,负责各个模块的协调和控制。
- DHT22温湿度模块:用于监测环境的温度和湿度,为自动浇水提供参考数据。
- 摄像头模块:通过拍摄植物的外观和土壤状况,将图像传输到TF卡之中进行储存,以判断植物的需水情况。
- 继电器模块:根据Arduino Uno开发板的指令,控制水阀的开关,实现自动浇水的功能。
- TF卡读写模块:用于存储植物的照片和温湿度数据,以便后续分析和优化。
- LCD屏幕模块:显示当前温度、湿度以及植物的需水情况,方便用户进行观察和调整。
三、Arduino相关理论介绍
本节将介绍Arduino的基础理论和调用库、调用摄像头的相关理论。
3.1 基础理论
Arduino
是一款开源的单片机开发板,通过Arduino IDE
这款软件可以编程控制各种不同的传感器和执行器工作。其核心是一块可编程的集成电路,能够通过接口与外部设备进行通信和控制。Arduino
能通过各种各样的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、影响环境。板子上的微控制器可以通过Arduino
的编程语言来编写程序,编译成二进制文件,烧录进微控制器。对Arduino
的编程是通过 Arduino
编程语言和Arduino
开发环境来实现的。基于Arduino
的项目,可以只包含Arduino
,也可以包含Arduino
和其他一些在PC上运行的软件,它们之间进行通信来实现。Arduino
具有丰富的开发资源和开源的特性,使得它成为许多创客和初学者的首选。
3.2 调用库相关理论
在Arduino编程
中, 库 是一个非常重要的概念。 库 是包含了一系列函数和定义的文件,这些函数和定义可以用来扩展Arduino
的功能。例如,我们可以使用Arduino
的官方库——Wire库
来读取接入Arduino
的传感器数据。在编程中,调用库的方法是在代码中包含相应的头文件,例如
#include <Wire.h>
并使用库中提供的函数来实现所需的功能。
3.3 调用摄像头理论
为了实现图像传输的功能,我们需要调用摄像头模块的驱动库。常见的摄像头模块有 OV7670 和 Raspberry Pi Camera 等。以 OV7670 为例,我们可以使用 Adafruit 提供的Adafruit_OV7670
库来实现图像的采集和传输。在代码中,我们首先需要初始化摄像头模块,然后调用库中的函数来控制 OV7670 进行图像获取与记录,并将其保存到 TF卡 中。
3.4 基于Arduino的自动浇水理论
在本次设计的自动浇水装置中,我们决定使用两个传感器采集数据——DHT22温湿度传感器
与土壤湿度传感器
(如图三.1所示,请注意,由于模拟图中并未提供关于水泵的模拟,此处我们使用红色LED灯来代替)。在我们编写的Arduino程序中,DHT22温湿度传感器
与土壤湿度传感器
会分别将环境温湿度与土壤湿度状况传回Arduino UNO开发板。经过处理后将数据发送至LCD屏幕
中,实现实时监控土壤质量。当土壤湿度低于我们设定的值时,开发板将控制继电器打开通电,驱动水泵
转动,进行时长约3-5秒的浇水时间。若过后湿度仍然不达标,将重复以上步骤至达标为止。同时,考虑到不同土壤湿度判断会略有差距,我们为此加入了两个可交互的按钮,用于调整设定的湿度判断值(如图三.2)。接下来,我们想到有时传感器可能会没有传回预期数据,导致浇水装置不工作,我们再一次添加了一个控制按钮,当按下按钮时启动水泵开始浇水3--5秒,随后停止。
四、现状调研
4.1 自动浇水现状发展现状
随着科技的发展,自动浇水技术越来越受到人们的关注。目前市场上已经出现了一些自动浇水装置,但这些装置普遍存在着智能化程度低、稳定性差等问题。因此,我们需要设计一种结构简单、稳定性高、智能化程度高的自动浇水装置。
4.2 延时摄影发展现状
延时摄影是一种通过控制摄影设备在一段时间内进行多次拍摄的技术,然后将拍摄的照片组合成视频的形式呈现出来。目前市场上已经出现了一些基于延时摄影技术的产品,如智能监控摄像头等。我们将延时摄影技术应用于自动浇水装置中,通过拍摄土壤的照片来判断土壤的湿度情况以及植物的生长状况,为自动浇水的控制提供更加准确的数据支持。
五、装置结构
在本项目中,装置结构主要由以下几个部分组成:Arduino Uno开发板
、LCD屏幕
、DHT温湿度检测仪
、继电器
、水泵
(用红色LED代替)、两个按钮
以及摄像头
和TF读写模块
(用黄色LED灯代替)。下面详细介绍各部分的功能和连接方式。
5.1 Arduino Uno开发板
Arduino Uno是一种开源的单片机开发板,它具有丰富的IO接口和良好的兼容性,可以方便地与各种传感器、执行器等连接。在本项目中,Arduino Uno开发板主要负责读取各个传感器的数据、控制继电器和水泵的开关以及与上位机进行通信。
5.2 LCD屏幕
LCD屏幕
可以实时显示温湿度、浇水阈值等信息,方便用户观察和调整。通过Arduino Uno开发板上的I2C接口
,可以很方便地与LCD屏幕
进行通信。
5.3 DHT22温湿度检测仪
DHT温湿度检测仪
是一种常用的温湿度传感器,它可以测量室内温湿度,并将数据传输给Arduino Uno开发板。在本项目中,我们使用DHT22
型号的传感器,该传感器具有测量精度高、稳定性好的特点。
5.4 继电器和水泵
继电器是一种电磁开关,可以通过低电流控制高电流的通断。在本项目中,我们使用继电器来控制水泵的开关。当湿度低于浇水阈值时,Arduino Uno开发板会输出一个高电平信号,使继电器
吸合,从而接通水泵
电源,实现浇水功能。
5.5 按钮
在本项目中,我们使用了两个按钮
,一个用于增加浇水阈值,另一个用于减少浇水阈值。当按钮被按下时,Arduino Uno开发板会读取相应的I O口状态,并根据程序逻辑进行处理。需要注意的是,我们在代码中设置了浇水阈值的最大值和最小值,以防止用户误操作导致装置损坏或无法正常工作。
5.6 摄像头和TF读写模块(用黄色LED灯代替)
摄像头
和TF读写模块
是用来实现图像识别和数据存储功能的。在本项目中,我们使用黄色LED灯代替摄像头
和TF读写模块
。具体连接方式如下:将黄色LED灯连接到开发板的数字引脚上,通过程序控制LED灯的亮灭状态来模拟摄像头和TF读写模块的工作状态。
5.7制作过程(运用模拟器画面)
- 准备一个Arduino Uno 开发板和一个LCD屏幕。以下是接线方式(前面是开发板接口后面是用电器):
GND-GND
5v-VCC
A4-SDA
A5-SCL
- 准备一个DHT温湿度检测仪。以下是接线方式(前面是开发板接口后面是用电器):
GND-GND
TX-1-a2
5v-a1
- 准备一个继电器。以下是接线方式(前面是开发板接口后面是用电器):
GND-GND
VCC-5v
in-~2
- 准备一个水泵(用红色LED代替)。以下是接线方式(前面是开发板接口后面是用电器):
GND-负极
NC(继电器)-正极
- 准备两个按钮,使按钮上面加10%湿度、下面减10%湿度。以下是接线方式(前面是开发板接口后面是用电器):
LED上:GND-l1
12-l4
LED下:GND-l1
11-l4
- 准备一个
摄像头
和TF读写模块
(用黄色LED灯代替)。以下是接线方式(前面是开发板接口后面是用电器):
GND-负极
3.3v-正极
以下是总程序
#include <SimpleDHT.h>
#include <LiquidCrystal_I2C.h>
//导入DHT与lcd液晶屏数据库
SimpleDHT11 dht(A1);
LiquidCrystal_I2C lcd(0x27,16,2); //初始化dht11与lcd
int nowwater = 650;
byte temp = 0, humi = 0;
int h;
bool water = false;
bool light=true;
int t = 0;//初始化数据
void printinfo()//设置在液晶屏打印信息函数
{
h = analogRead(A0);
dht.read(&temp,&humi,NULL);
lcd.setCursor(2, 0);
lcd.print(temp); lcd.print("C");
lcd.setCursor(11, 0);
lcd.print(humi); lcd.print("H");
lcd.setCursor(4,1);
if(h >= 500 && h < nowwater)
{
lcd.print("Too Dry! ");
}
if(h >= nowwater)
{
lcd.print("Watering..");
water = true;
}
if(h<450)
{
lcd.print(" Fine ");
water = false;
}
delay(100);
}
void setup()
{
lcd.init(); // 打开液晶屏输入通道
lcd.backlight(); //打开lcd背光板
Serial.begin(9600);
pinMode(3,OUTPUT);
pinMode(2,OUTPUT);
for(int i = 12; i <= 13; i++) {
pinMode(i,INPUT_PULLUP);
}
}
void setwater()
{
if(!digitalRead(12)) nowwater +=10;
if(!digitalRead(13)) nowwater -= 10;
}
void loop(){
//显示温度和湿度信息
printinfo();
if (water) { // 如果湿度低于40%
digitalWrite(3, HIGH); // 继电器通电,打开水泵
delay(3000);
digitalWrite(3, LOW); // 继电器断电,关闭水泵
}
setwater();
}
//BY TRAVELLERR
请注意,LiquidCrystal_I2C
与SimpleDHT
库需要额外下载
六、致谢
6.1 关于文章
本文章改写自作者学校同名项目论文,由 Travellerr 与 Sentoar 共同完成
6.2 文章问题
由于是直接搬运初版项目论文,所以有许多地方存在问题,例如摄像头接线过程并不能只用简单两根线完成,同时主程序中也没有关于摄像头等等的运行代码。总之,我会不断完善这篇文章,做到尽量准确
如果有问题请在评论区留言