亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 工业技术

自动植物浇水和灌溉系统 - 电路、代码和项目报告

自动植物 浇水 系统 – 完整源代码、电路和项目报告 – PDF 下载

简介

在日常操作中,浇水是最重要的文化实践,也是劳动强度最大的工作。无论天气如何,无论是太热太冷或太干太湿,控制到达植物的水量都非常重要。因此,使用自动植物浇水系统的想法是有效的,该系统在植物需要时浇水。这个项目的一个重要方面是:“何时浇水,浇多少水”。为减少人工浇灌植物的人工活动,采用植物浇灌系统的思想。用于连续监测土壤水分水平并决定是否需要浇水以及植物土壤中需要多少水的方法。该项目可以分组为子系统,例如;电源、继电器、电磁阀、Arduino GSM shield、土壤湿度传感器和LCD。

本质上,系统的设计和编程方式是土壤湿度传感器在特定时间点感应植物的湿度水平,如果传感器的湿度水平低于指定值根据特定植物的需水量预先定义阈值,然后供应所需的水量,直到达到预先定义的阈值。

系统报告其当前状态并发送有关给植物浇水和向水箱加水的提醒消息。所有这些通知都可以通过使用 Arduino GSM shield 来完成。

项目目标:

从现在开始,在先进的技术和电子时代,人类的生活方式应该更智能、更简单、更轻松、更方便。所以,因此;人类日常生活中需要许多自动化系统来减少他们的日常活动和工作。在这里,一个名为自动植物浇水系统的系统的想法非常有用。由于许多人在给花园里的植物浇水时面临很多问题,尤其是当他们离开家时。该模型使用带有微控制器的传感器技术来制造智能开关设备来帮助数百万人。

在其最基本的形式中,系统以这样一种方式进行编程,即土壤湿度传感器在特定时间感测植物的湿度水平,如果传感器的湿度水平小于根据特定植物预定义的阈值的指定值,而不是向植物供应所需的水量,直到其水分水平达到预定义的阈值。系统涉及湿度和温度传感器,可跟踪系统的当前气氛,并在浇水发生时产生影响。电磁阀将控制系统中的水流,当 Arduino 从湿度传感器读取值时,它会根据所需条件触发电磁阀。此外,系统报告其当前状态并发送有关浇灌植物的提醒消息并从接收者那里获得短信。所有这些通知都可以通过使用 Arduino GSM shield 来完成。

系统背景

学校从科学书籍中了解到,植物在许多方面对全人类来说都是非常必要的。因为他们通过不时产生新鲜氧气来保持环境清洁。随着与先进技术相关的日常物品的增加,自动植物浇水系统变得越来越多,这些系统的实施速度越来越快。像家庭一样的地方以及工业水平。这些系统的主要用途是高效且易于使用。

植物浇水系统通过使用不同类型的传感器技术等高效可靠的组件,让植物爱好者能够在他们离开时带走他们的家中植物。

有几种不同/简单类型的室内植物浇水系统,具体取决于所需的自动化水平。

在最终的pdf报告中(帖子内容末尾给出了免费下载链接),详细描述了以下部分。

相关项目:ATMega 微控制器是什么以及如何用它制作 LED 项目?

产品和组件规格

需求 ID SRS-GSM-001
标题 GSM 模块
说明 系统包含GSM模块,向收件人发送提醒短信,并接收用户发来的短信。
版本 版本 1.0
需求 ID SRS-微控制器 -001
标题 ATmega328p
说明 系统包含Arduino Uno通常自带的微控制器。该微控制器从传感器读取读数并控制整个系统。
版本 版本 1.0
需求 ID SRS-温度和湿度-001
标题 DHT11
说明 系统包括温度和湿度传感器,它跟踪周围环境的当前温度和湿度值,并将读数发送回微控制器。
版本 版本 1.0
需求ID SRS-Moisture-001
标题 格罗夫土壤湿度传感器
说明 系统包括土壤湿度传感器,它从土壤湿度中获取读数并将读数发送回微控制器。
版本 1.0版
需求 ID SRS-LCD-001
标题 日立16×2液晶屏
说明 系统为用户提供LCD界面,显示系统中不同传感器的读数。
版本 版本 1.0

相关文章:Arduino 编程:什么是 Arduino 以及如何编程?

基于 Arduino 的自动植物浇水系统:

自动植物浇水框图

自动植物浇灌系统电路原理图

根据这个系统,这个项目中有两个功能组件,即湿度传感器和电机/水泵。湿度传感器最基本的形式是感应土壤湿度的水平。然后电机/水泵向植物供水。

点击图片放大

上图中的示意图描述了系统的整体行为。项目使用 Arduino Uno 来控制电机。它由控制伺服电机流量的 H 桥组成,即时钟或反时钟方向。湿度传感器测量土壤水平并将信号发送到 Arduino,然后如果需要浇水,Arduino 将打开伺服电机。然后电机/水泵向植物供水,直到达到所需的湿度水平。

形成上图中的原型水分传感器感应水分含量并将信号发送给Arduino,然后Arduino在H-bridge的帮助下打开水泵并给特定的植物浇水。这是通过使用 Arduino IDE 软件完成的。

相关项目:使用 IC 4017 和 555 定时器的交通灯控制电子项目

项目设计

本节讨论在软件设计和硬件设计中完成的任何工作。它还深入了解了系统包含的内容以及为什么选择不同的组件来制作一个完整的自动化植物浇水系统。考虑图中的图表,该图表显示了使用所选组件的系统的基本概念模型。

自动植物浇水系统上图框图的功能如下图所示:

更多组件详情可以在pdf文件中找到(下)

相关项目:什么是树莓派?使用树莓派创建项目

硬件设计

传感器示意图

下图为Sensor电路原理图。由于所有传感器都与 Arduino 模拟引脚 A0-A3 连接。引脚 A0 保留用于温度和湿度传感器,而引脚 A1-A3 保留用于湿度传感器。如原理图所示,所有传感器都有共同的电源 5V 和接地。

LCD 示意图

下图是LCD的原理图。数字引脚 8 – 13 为 LCD 保留,如图所示。引脚 1 和引脚 3 是电源和接地,而引脚 2 是 LCD 上的对比度引脚,用于控制对比度并与电位器连接。连接 LCD 时必须记住,Arduino 的数字引脚和 LCD 的数据引脚必须以正确的顺序连接,否则 LCD 只会在屏幕上显示垃圾。

电磁阀示意图

下图是电磁铁电路的电路图。数字引脚 4 – 7 为电磁阀保留。由于电路由继电器、晶体管、电阻器和 LED 组成,而不是螺线管(CadStar 没有螺线管符号)。在示意图中,继电器使用 5V。而 5V 也进入继电器的 NO 通道,这是因为在原理图中 LED 取代了在 (5V) 上工作的螺线管,然后是 220 欧姆电阻。

所以,当电压施加到晶体管的基极时。晶体管切换到接地,使继电器的线圈被磁化并将自身切换到常闭通道,因此连接到该特定继电器的 LED 亮起,当施加在晶体管基极上的电压下降时,晶体管将自身切换回正常状态继电器线圈去磁,继电器再次切换到常开通道,因此 LED 再次熄灭。

完成所有电路原理图后,下一步是在 Veroboard 上构建它们。提前在条板布局规划表上设计电路很重要,因为在 Veroboard 上设计电路有一定的原则,如下所示:

  1. 先在stripboard布局规划表右上角标出Vs和GND电源线。
  2. 记得在IC的管脚之间剪掉走线。用 X 标记图表上的切口。
  3. 尽量让电阻和轴向电容平放在条板上。电阻通常需要 4 个孔的间隙,电容器需要 8 个孔的间隙。
  4. 如果可能,请对 IC 的引脚进行编号。Veroboard 的底部由铜轨组成,电压在其中水平流动。上图不同的 Veroboard 设计如下所示:

相关项目:使用 SRF04 的全自动水位控制器

软件设计

硬件搞定后,就该用软件测试硬件了。在本节中,将针对系统中使用的每种不同的自动化/技术详细描述软件设计的实现。这包括编写并上传到 Arduino 的 Arduino 代码。

首先要做的是让螺线管电路工作以及从微控制器的角度来看螺线管将如何工作。为此,我们做了一个小流程图,可以在上图中的软件流程部分看到。

Arduino IDE 用于在 Arduino 上上传软件。对于基本的螺线管电路,编写了一个简单的程序,该程序基本上每 1 秒闪烁一次 LED。最初定义了用于测试程序和电路的数字引脚 4、5、6 和 7。因此,当程序运行时,它会进行所有基本初始化,在 void setup() 中定义所有输出引脚,然后跳转到 void loop() 中,它会不断运行并每隔 1 秒闪烁一次 LED。

之后,编写了一个小程序并将其上传到 Arduino,它从不同的传感器获取读数并将它们打印在 LCD 上。为此,制作了一个小流程图,也可以在给定图中的软件流程部分下看到。当程序进入 void loop () 时,它会从传感器获取读数并进行所有基本计算并将它们打印在 LCD 上。

相关基础电子项目:使用 LDR 和 BC 547 晶体管的自动路灯控制系统

接下来就是将GSM模块的软件上传到Arduino,GSM可以通过它与微控制器通信。调制解调器测试最初完成,它为 GSM 执行所有基本初始化和库,并获取 IMEI 号码,并在开始与 Arduino 通信后查看调制解调器是否正常运行。下一步是网络连接测试,基本初始化了GSM,显示GSM模块可以支持的所有其他网络。

一旦 GSM 模块经过测试并正常运行,就可以使用 GSM 模块与收件人进行通信,这意味着向收件人发送短信并从他们那里接收短信。为此,编写了另一个简单的 Arduino 接线程序并将其上传到 Arduino。该程序初始化了 GSM 并向接收者发送 SMS,而另一个 Arduino 程序是编写的,其中 GSM 接收来自最终用户的 SMS。

最后,一旦完成所有软件设计,就可以将所有软件设计合并在一起,为系统构建最终的工作软件。应用了不同的算法方法,可以在软件流程部分看到,以使最终软件工作并完成它应该做的事情。上图显示了最终软件的工作情况,它需要读取、发送短信、接收短信并开始执行之前的操作。

注:所有软件代码见下文附录。

注意:所有软件代码可在附录中查看。报告中不包含调制解调器测试和网络连接测试的输出,因为实际报告是在提交硬件之后完成的。

相关项目:如何在LabVIEW中制作基本的电气和电子项目?

项目构建和软件测试

在成功完成所有硬件和软件设计之后,就该进行项目构建和测试了。在报告的这一部分中,将详细介绍如何实现和测试不同的硬件设计。本节还讨论了软件代码中是否存在对故障排除和疏散以及成功构建项目很重要的隐藏问题。分步过程可以在下面给出的 pdf 文件中的完整项目报告中看到,例如施工和测试过程。

软件测试

软件测试阶段也是项目开发的一个重要方面。软件测试是执行程序或应用程序的过程,目的是发现软件错误。它也可以表示为验证和验证软件程序或应用程序是否满足其技术要求、按可接受的方式工作并且可以使用类似商标执行的过程。为了进行软件测试,采用了不同的方法。编写了一份软件需求规范(SRS)文档,充分解决了软件系统的预期行为。

相关项目:使用555定时器的拍子开关电路电子项目

需求 ID SRS-传感器-010
标题 传感器
说明 系统中的传感器获取读数并将其发送回微控制器。
版本 V 1.0
需求 ID SRS- 数据 -020
标题 数据显示
说明 当用户尝试从系统获取读数时。显示器应该向用户显示数据,例如:温度和湿度值,然后是湿度读数。
版本 V1.0
需求 ID SRS- 微控制器 -030
标题 微控制器
说明 系统中的微控制器充当系统的大脑,管理系统中的一切
版本 V1.0
需求 ID SRS-锁存器-040
标题 闩锁
说明 系统中的Latch为微控制器扩展了数字管脚
版本 V1.0
需求ID SRS-GSM-050
标题 GSM
说明 只要微控制器告诉它这样做,系统就会通过向接收者发送 SMS 警报来做出反应。
版本 V1.0

在编写 SRS 文档后,软件设计进入静态测试阶段,其中包括审查文档。这是验证需求的地方。下面定义了四种不同类型的验证方法:

  1. 检查 (I):控制或目视验证
  2. 分析 (A):基于分析证据的验证
  3. 演示 (D):验证操作特性,无需定量测量。
  4. 测试(T):通过定量测量验证定量特征。对于 SRS 文档的每一项要求,都定义了一种验证方法,其缩写为 I、A、D 和 T。

验证:

需求ID 需求标题 方法
REQ-010 验证系统传感器获取读数
REQ-020 验证数据是否显示在屏幕上。 D
REQ-030 验证系统的微控制器管理或工作正常,每次请求都能得到100%的结果。 D
REQ-040 验证锁存电路是否在做应该做的事情。这需要 sin 3 输入并吐出 8 个引脚 A
REQ-050 验证短信是否已经被GSM收发 D

结果

所有测试都取得了令人满意的结果。由于没有必须记录的特定结果。由于系统与湿度和 DHT11(温度和湿度)传感器一起工作,该传感器根据当前的室温和湿度进行读取。电路中湿度传感器的读数还取决于植物的当前湿度水平。否则,在功能方面从电路中得出的总体结果是有利于激励的。

相关文章:Arduino PWM 编程及其在 Arduino 中的功能

自动浇水植物和灌溉系统的最终和完整软件代码

注意: 更多与项目相关的代码可以在 pdf 文件中找到,例如测试电磁阀的示例代码、测试系统传感器的代码、GSM 调制解调器测试代码、GSM 网络连接代码、GSM 发送短信警报代码、GSM 接收短信代码,

最终自动浇水植物项目代码

#include <dht.h>
#define dht_dpin A0
dht DHT;
//———————–
#include <LiquidCrystal.h>
LiquidCrystal lcd (8, 9, 10, 11, 12, 13);
//———————————-
int plantPotMoisture[3] = {A1, A2, A3};
//———————
#include <GSM.h>
#define PINNUMBER “”
GSM gsmAccess; // include a ‘true’ parameter for debug enabled
GSM_SMS sms;
char remoteNumber[] = “0899506304”;
String moistureMessage = “Moisture is Low on sensor: “;
String SMS_Alert = “Sending SMS!”;
String humidityMsg = “Humidity is High. Open All Solenoids”;
String tempMsg = “Temperature is too HIGH!..Open ALl Solenoids “;
String messageBuffer = “”;
char senderNumber[20];
String stringOne = “Opens1”;
String stringTwo = “Opens2”;
String stringThree = “Opens3”;
String stringFour = “OpenAll”;
//—————
#define solenoidData 5
#define solenoidClockster 4
#define solenoidLatch 6
//—————
const int master = 0;
const int slave1 = 1;
const int slave2 = 2;
const int slave3 = 3;
boolean takeReadings = true;
int serialSolenoidOutput = 0;
void setup()
{
pinMode(solenoidData, OUTPUT);
pinMode(solenoidClockster, OUTPUT);
pinMode(solenoidLatch, OUTPUT);
digitalWrite(solenoidLatch, HIGH);
digitalWrite(solenoidLatch, LOW);
shiftOut(solenoidData, solenoidClockster, MSBFIRST, 0);
digitalWrite(solenoidLatch, HIGH);
//————————-
Serial.begin(9600);
lcd.begin (16, 2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“Wait Until”);
lcd.setCursor(0, 1);
lcd.print(“GSM Initialized!”);
boolean notConnected = true;
while (notConnected)
{
if (gsmAccess.begin(PINNUMBER) == GSM_READY)
notConnected = false;
else
{
Serial.println(“Not connected”);
delay(1000);
}
}
}
void loop()
{
if (takeReadings)
{
moistureSensor();
TempAndHumidity ();
if (DHT.humidity > 50 || DHT.temperature > 25 && takeReadings )
{
takeReadings = false;
if (DHT.humidity > 50)
{
sendSMS(humidityMsg);
}
else if (DHT.temperature > 25)
{
sendSMS(tempMsg);
}
while (!takeReadings)
recieveSMS();
}
if (plantPotMoisture[0] > 30 || plantPotMoisture[1] > 30 || plantPotMoisture[2] > 30 && takeReadings)
{
takeReadings = false;
if (plantPotMoisture[0] > 30)
{
sendSMS(moistureMessage + “1”);
}
else if (plantPotMoisture[1] > 30)
{
sendSMS(moistureMessage + “2”);
}
else
{
sendSMS(moistureMessage + “3”);
}
while (!takeReadings)
recieveSMS();
}
}
}
void moistureSensor()
{
for (int i = 0 ; i < 3; i++)
{
lcd.clear();
plantPotMoisture[i] = analogRead(i);
plantPotMoisture[i] = map(plantPotMoisture[i], 550, 0, 0, 100);
Serial.print(“Mositure” + i );
lcd.print(“Mositure” + i);
Serial.print(plantPotMoisture[i]);
lcd.print(plantPotMoisture[i]);
Serial.println(“%”);
lcd.print(“%”);
delay(1000);
}
}
void TempAndHumidity ()
{
DHT.read11(dht_dpin);
lcd.setCursor(0, 0);
lcd.print(“Humidity=”);
Serial.print(“Current humidity = “);
Serial.print(DHT.humidity);
lcd.print(DHT.humidity);
lcd.print(“%”);
Serial.print(“%”);
Serial.print(“temperature = “);
Serial.print(DHT.temperature);
Serial.println(“C”);
lcd.setCursor(0, 1);
lcd.print(“temp=”);
lcd.print(DHT.temperature);
lcd.print(“C “);
delay(1000);
lcd.clear();
}
void sendSMS(String messageToSend)
{
Serial.print(“Sending a message to mobile number: “);
Serial.println(remoteNumber);
Serial.println(“SENDING”);
lcd.print(SMS_Alert);
Serial.println();
Serial.println(“Message:”);
Serial.println(messageToSend);
sms.beginSMS(remoteNumber);
sms.print(messageToSend);
sms.endSMS();
Serial.println(“\nCOMPLETE!\n”);
lcd.clear();
lcd.print(“Completed!!!”);
}
void recieveSMS()
{
char c;
if (sms.available())
{
lcd.clear();
lcd.print(“Message received from:”);
delay(800);
lcd.clear();
sms.remoteNumber(senderNumber, 20);
lcd.print(senderNumber);
while (c = sms.read())
{
Serial.println(c);
messageBuffer += c;
}
Serial.println(messageBuffer);
if (messageBuffer == stringOne)
{
toggleSolenoid1();
takeReadings = true;
}
else if (messageBuffer == stringTwo)
{
toggleSolenoid2();
takeReadings = true;
}
else if (messageBuffer == stringThree)
{
toggleSolenoid3();
takeReadings = true;
}
else if (messageBuffer == stringFour)
{
toggleAll();
takeReadings = true;
}
else
{
takeReadings = true;
}
messageBuffer = “”;
Serial.println(“\nEND OF MESSAGE”);
// Delete message from modem memory
sms.flush();
Serial.println(“MESSAGE DELETED”);
}
delay(1000);
}
void toggleSolenoid1()
{
solenoidWrite(master, HIGH);
delay(1000);
solenoidWrite(slave1, HIGH);
delay(1000);
solenoidWrite(slave1, LOW);
delay(1000);
solenoidWrite(master, LOW);
delay(1000);
}
void toggleSolenoid2()
{
solenoidWrite(master, HIGH);
delay(1000);
solenoidWrite(slave2, HIGH);
delay(1000);
solenoidWrite(slave2, LOW);
delay(1000);
solenoidWrite(master, LOW);
delay(1000);
}
void toggleSolenoid3()
{
solenoidWrite(master, HIGH);
delay(1000);
solenoidWrite(slave3, HIGH);
delay(1000);
solenoidWrite(slave3, LOW);
delay(1000);
solenoidWrite(master, LOW);
delay(1000);
}
void toggleAll()
{
solenoidWrite(master, HIGH);
delay(1000);
solenoidWrite(slave1, HIGH);
delay(1000);
solenoidWrite(slave2, HIGH);
delay(1000);
solenoidWrite(slave3, HIGH);
delay(1000);
solenoidWrite(slave1, LOW);
delay(1000);
solenoidWrite(slave2, LOW);
delay(1000);
solenoidWrite(slave3, LOW);
delay(1000);
solenoidWrite(master, LOW);
delay(1000);
}
void solenoidWrite(int pin, bool state)
{
if ( pin >= 0 && pin < 8)
{
if (state)
serialSolenoidOutput |= (1 << pin);
else
serialSolenoidOutput &= ~(1 << pin);
}
digitalWrite(solenoidLatch, LOW);
shiftOut(solenoidData, solenoidClockster, MSBFIRST, serialSolenoidOutput);
digitalWrite(solenoidLatch, HIGH);
}

Full Project Report Automatic Watering Plants System (PDF) Free Download

Automated Plant Watering System PDF 4.18MB 77 Here

Related Post:How To Design a PCB (Step by Step &Pictorial Views)

About the author

-Department of Engineering School of Informatics &Engineering Institute of Technology, Blanchardstown Dublin 15


工业技术

  1. 经过验证的系统中可能出现的故障
  2. 运动感应自动开门系统电路和工作
  3. Arduino 报警系统:SERENA
  4. 带有 Arduino 的自动植物浇水系统
  5. 家庭植物浇水系统
  6. 自动浇水系统
  7. 城市植物浇水解决方案
  8. 智能灌溉控制器
  9. 在控制系统迁移项目中幸存下来
  10. 您应该注意的常见电气违规行为
  11. 了解自动变速器系统
  12. 了解自动润滑系统