自动植物浇水灌溉系统:电路设计、代码与项目报告
自动植物浇水系统 – 完整源码、电路图与项目报告 – PDF下载
简介
日常植物浇水是最重要的栽培实践,也是最费人工的任务。无论天气炎热寒冷或干燥湿润,控制到达植物的水量都至关重要。因此,采用自动植物浇水系统在植物需要时浇水将非常有效。本项目的一个重要方面是:“何时浇水以及浇多少水”。为减少人工浇水劳动,采用了植物浇水系统理念。该方法持续监测土壤湿度水平,决定是否需要浇水以及植物土壤需要多少水。该项目可分为电源、继电器、电磁阀、Arduino GSM模块、土壤湿度传感器和LCD等子系统。

本质上,系统设计和编程使土壤湿度传感器在特定时刻感知植物湿度水平,若传感器湿度低于预设阈值(根据特定植物需水量预定义),则供水直到达到预设阈值。
系统报告当前状态,并发送浇水提醒和加水提醒。所有通知均通过Arduino GSM模块实现。
- 相关项目:雨水报警电路 – 雪、水和雨水检测项目
项目目标:
如今,在先进技术和电子时代,人类生活应更智能、简单、轻松和便捷。因此,日常生活中需要许多自动化系统以减少日常活动和工作。这里提出的自动植物浇水系统非常有用。许多人在外出时面临花园浇水难题。该模型利用传感器技术与微控制器制造智能切换装置,造福数百万人。
在最基本形式中,系统编程使土壤湿度传感器在特定时刻感知植物湿度,若传感器湿度低于预设阈值(根据特定植物预定义),则向植物供水直到湿度达到预设阈值。系统包含温湿度传感器,跟踪系统当前大气环境并影响浇水时机。电磁阀控制系统水流,Arduino读取湿度传感器值后根据条件触发电磁阀。此外,系统报告当前状态,发送浇水提醒并接收短信。所有通知均通过Arduino GSM模块实现。
- 相关项目:水位指示电路图 – 两个简单项目

系统背景
从科学课本中学到植物对人类在许多方面至关重要。它们定时产生新鲜氧气保持环境清洁。随着日常物品连接先进技术,自动植物浇水系统日益普及,应用于家庭和工业层面。这些系统的主要用途是高效和易用。
植物浇水系统让植物爱好者在外出时也能通过高效可靠的组件(如各类传感器技术)照料家庭植物。
根据自动化程度需求,有几种不同/简单的室内植物浇水系统类型。
- 相关项目:智能灌溉系统 – 电路图与代码
在最终PDF报告(文末提供免费下载链接)中,详细描述了以下章节。
- 植物浇水球与插针
- 室内滴灌系统
- 传感器技术
- 温度与湿度传感器
- 温度传感器
- 湿度传感器
- 土壤湿度传感器
- 双金属恒温器
- 热敏电阻
- 电阻温度检测器 (RTD)
- 热电偶
- 传感器IC,LM35
- 数字温度传感器 (ADT7301)
- DHT11和DHT22
- GSM模块
- GSM架构
- 继电器
- 晶体管
- 日立16×2 LCD
相关项目:什么是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-湿度-001 |
| 标题 | Grove土壤湿度传感器 |
| 描述 | 系统包含土壤湿度传感器,读取土壤湿度并发回微控制器。 |
| 版本 | 版本1.0 |
| 需求ID | SRS-LCD-001 |
| 标题 | 日立16×2 LCD |
| 描述 | 系统包含用户LCD界面,显示系统中各传感器读取的读数。 |
| 版本 | 版本1.0 |
相关文章:Arduino编程:什么是Arduino及如何编程?
基于Arduino的自动植物浇水系统:
自动植物浇水框图

自动植物浇水与灌溉系统原理电路图
该系统有两个功能组件:湿度传感器和电机/水泵。基本形式下,湿度传感器感应土壤湿度水平,然后电机/水泵向植物供水。
点击图片放大
上图原理图描述系统整体行为。项目使用Arduino Uno控制电机,包含控制伺服电机顺/逆时针方向的H桥。湿度传感器测量土壤水平并发送信号给Arduino,若需浇水则Arduino开启伺服电机,电机/水泵向植物供水直到达到所需湿度水平。
上图原型中,湿度传感器感应湿度并发信号给Arduino,Arduino借助H桥开启水泵给特定植物浇水。此过程使用Arduino IDE软件完成。
相关项目:交通灯控制电子项目,使用IC 4017和555定时器
项目设计
本节讨论软件设计和硬件设计的完成工作,深入说明系统包含内容及选择不同组件构建完整自动植物浇水系统的原因。参考上图所示使用选定组件的基本概念模型。
上图自动植物浇水系统框图功能如下:
- 系统包含GSM模块,发送短信给接收者并接收接收者短信。
- 使用土壤湿度、温度和湿度传感器。
- 包含电磁阀及电磁阀电路,控制水流经电磁阀。
- 湿度传感器确定特定植物湿度水平。微控制器读取此湿度值,循环判断传感器值是否高于阈值。若高于预设值,GSM模块准备发送短信给接收者。
- 温湿度传感器判断是否过热或湿度过高。由Arduino Uno上的ATmega328p芯片读取(了解更多关于什么是ATmega),这些读数用于判断系统中所有电磁阀应开启或关闭。
更多组件详情见PDF文件(下方)
相关项目:什么是树莓派?使用树莓派创建项目
硬件设计
传感器原理图
下图显示传感器电路原理图。所有传感器连接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也进入继电器常开通道,因为原理图中LED替代电磁阀(工作在5V)后接220欧姆电阻。
- 相关项目:语音识别家庭自动化系统
当电压施加到晶体管基极时,晶体管开启接地,继电器线圈得电磁化切换到常闭通道,连接该继电器的LED亮起;当晶体管基极电压降低,晶体管恢复正常,继电器线圈失磁切回常开通道,LED熄灭。
完成所有电路原理图后,下一步在实验板上构建。预先在实验板布局规划表上设计电路很重要,因为在实验板上设计电路有特定原则:
- 首先在实验板布局规划表右上角标出Vs和GND电源线。
- 记得在IC引脚间切断走线。在图上用X标记切断点。
- 尽量让电阻和轴向电容平铺在实验板上。电阻通常需4孔间距,电容需8孔间距。
- 如可能给IC引脚编号。实验板底部为铜走线,电压水平流动。上述原理图的不同实验板设计如下:
相关项目:基于SRF04的全自动水位控制器
软件设计
硬件完成后,需用软件测试硬件。本节详细描述系统中不同自动化/技术的软件设计实现,包括编写并上传到Arduino的Arduino代码。
首先让电磁阀电路工作,从微控制器角度看电磁阀如何动作。为此绘制了小流程图,可见上图软件流程部分。
使用Arduino IDE上传软件到Arduino。为基本电磁阀电路编写简单程序,基本每1秒闪烁LED。初始定义数字引脚4、5、6、7测试程序和电路。程序运行时进行所有基本初始化,在void setup()中定义所有输出引脚,然后进入void loop()持续运行,每1秒闪烁LED。
随后编写小程序上传到Arduino,从不同传感器获取读数并在LCD上显示。为此也绘制了小流程图,可见给定图中的软件流程部分。程序进入void loop()时获取传感器读数,进行基本计算并在LCD上打印。
相关基础电子项目:基于LDR和BC547晶体管的自动路灯控制系统
下一步上传GSM模块软件到Arduino,使GSM与微控制器通信。先进行调制解调器测试,完成GSM基本初始化和库,获取IMEI号并查看调制解调器启动后与Arduino通信是否正常。下一步网络连接测试,基本初始化GSM并显示GSM模块支持的所有其他网络。
GSM模块测试正常后,使用GSM模块与接收者通信,即发送短信给接收者并接收其短信。为此编写另一个简单Arduino布线程序上传到Arduino。程序初始化GSM并发送短信给接收者,另一个Arduino程序实现GSM接收最终用户短信。
最后,所有软件设计完成后,合并所有软件设计构建系统最终工作软件。应用不同算法方法(可见软件流程部分)使最终软件正常工作并执行预期功能。上图显示最终软件工作流程:读取数据、发送短信、接收短信并继续之前操作。
注:所有软件代码见下方附录。
注意:所有软件代码可在附录查看。调制解调器测试和网络连接测试输出未包含在报告中,因实际报告在硬件提交后完成。
相关项目:如何在LabVIEW中制作基础电气与电子项目?
项目构建与软件测试
硬件和软件设计成功完成后,进行项目构建和测试。本报告节详述不同硬件设计如何实施和测试。也讨论软件代码中是否有隐藏问题需排查消除以成功构建项目。PDF文件中提供了分步构建和测试过程。
软件测试
软件测试阶段也是项目开发的重要方面。软件测试是执行程序或应用以发现软件缺陷的过程。也可表述为验证和确认软件程序或应用满足技术要求、按预期工作并可用相似特征执行的过程。采用不同方法进行软件测试。编写了软件需求规格说明书(SRS)文档,全面阐述软件系统预期行为。
相关项目:基于555定时器的拍手开关电子项目
| 需求ID | SRS-传感器-010 |
| 标题 | 传感器 |
| 描述 | 系统传感器读取读数并发回微控制器。 |
| 版本 | V 1.0 |
| 需求ID | SRS-数据-020 |
| 标题 | 数据显示 |
| 描述 | 用户尝试从系统获取读数时,显示屏应显示数据,如:温湿度值及湿度读数。 |
| 版本 | V1.0 |
| 需求ID | SRS-微控制器-030 |
| 标题 | 微控制器 |
| 描述 | 系统微控制器作为系统大脑,管理系统一切。 |
| 版本 | V1.0 |
| 需求ID | SRS-锁存器-040 |
| 标题 | 锁存器 |
| 描述 | 系统锁存器扩展微控制器数字引脚。 |
| 版本 | V1.0 |
| 需求ID | SRS-GSM-050 |
| 标题 | GSM |
| 描述 | 微控制器指示时,系统通过发送短信警报给接收者做出反应。 |
| 版本 | V1.0 |
编写SRS文档后,软件设计进入静态测试阶段,包括文档审查。这是需求验证发生的地方。定义了四种验证方法:
- 检查 (I):控制或视觉验证
- 分析 (A):基于分析证据的验证
- 演示 (D):无定量测量的操作特性验证
- 测试 (T):有定量测量的定量特性验证。为SRS文档每个需求定义验证方法,用I、A、D、T缩写。
验证:
| 需求ID | 需求标题 | 方法 |
| REQ-010 | 验证系统传感器获取读数 | I |
| REQ-020 | 验证数据在屏幕上显示。 | D |
| REQ-030 | 验证系统微控制器正常管理工作,因每个请求给出100%结果。 | D |
| REQ-040 | 验证锁存器电路执行预期功能:输入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); }
自动浇水植物系统完整项目报告 (PDF) 免费下载
- 标题:
- 格式:
- 大小:
- 页数:
- 下载:
相关文章:如何设计PCB(分步与图解视图)
作者简介
-工程系 信息学与工程学院 理工学院 布兰查兹敦 都柏林 15工业技术
- SERENA:基于 Arduino Mega 2560 与 TFT 触摸屏的多级密码报警系统
- Arduino 自动浇水系统:定时 + 土壤湿度双模式,轻松养护盆栽
- Arduino Nano 驱动的智能家居植物自动浇水系统
- Arduino 智能自动浇水系统:土壤湿度电极 + 电磁阀控制
- 智能城市植物灌溉系统:基于传感器的自动化浇水方案
- Arduino 智能灌溉控制器:集成天气与光照传感器的自动浇水系统
- 自动变速器系统权威指南:类型、部件、工作原理
- 自动润滑系统详解:工作原理、类型与工业应用价值
- 控制系统迁移成功指南:专家策略实现无缝过渡
- 成熟电气系统常见失效模式排序
- 家庭电气规范十大高频违规:自查整改保平安
- 基于PIR传感器的自动门开启系统:电路、原理与应用