当前位置:文档之家› 花园农田智能自动灌溉系统

花园农田智能自动灌溉系统

摘要:本花园农田智能自动灌溉系统以STC90C58RD+为核心控制单元,采用抗干扰能力强,精度较高的数字温湿度传感器DHT11测量温湿度数据控制灌溉。

并且通过多孔管实现由土壤湿度检测到空气湿度检测的转换,并且能较准确的实现湿度的测量。

系统通过1602液晶把温度、湿度等实时信息反馈给使用者。

使用者也可通过键盘实现手动给水。

关键词:智能灌溉温湿度传感器Abstract:The Intelligentautomatic irrigation system of the garden and farmlandis based on STC90C58RD+micro control unit. Byusingthe anti-interference ability, high accuracy digital temperature humility sensor DHT11,thisirrigation system can get the data of temperature and humility, and control the irrigation.By using the porous pipe, the system can convert the measurement of soil humility to the measurement of the air humility. Users can get the information of temperature,humidity through 1602 screen. Users can also control the irrigation through keyboard manually. Keywords:Intelligent irrigation temperature humility sensor1前言随着经济的发展,智能化渐渐步入普通百姓的家。

现在市场上的各类智能化产品可谓层出不穷,最常见的有智能电饭煲,智能电冰箱和智能洗衣机等。

所谓的智能化,其目的在于增加人与机器的互动,降低功耗,提升效率,尽量达到以人为本的目的。

而本小组的作品—“花园绿地智能自动灌溉系统”,就是遵循上述目的设计的。

对于现代城市大量的绿地来说,植物的灌溉花费大量人力物力,而且并不一定能够依据植物的需求即使提供水分。

夏日的骄阳,随时都有可能对植物的生长造成伤害。

有鉴于此,本小组设计了花园绿地智能自动灌溉系统,它能够对温湿度实时监控,自动灌溉并且可以随时切换手动自动灌溉。

对植物的灌溉根据土壤湿度而定,当土壤湿度低于阈值时,它能自动灌溉。

有了它,可以节约大量人力物力,并且起到节约水资源的作用。

2 总体方案设计及选择2.1总体系统设计总体系统设计如上图所示,以单片机为核心,通过温湿度传感器来判断获取温湿度数据,进而控制开关模块的工作。

由于功耗较低使用电池模块为整个系统提供稳定的低压直流电。

人机交互由键盘和LCD来完成。

通过键盘,用户能执行基本的控制,而LCD能把温度,湿度,工作状态等基本信息反馈给用户。

2.2微控制器方案性能要求:(1)较强的抗干扰能力(2)低功耗(3)较高处理速度(4)成本合理。

方案比较:两款单片机均能较好地实行上述要求但采用51内核的STC89C58RD+具有比ATmega16更稳定的市场来源,更低的成本(前者的约为后者二分之一)而且ROM、RAM容量更大。

最终决定采用STC89C58RD+。

2.3湿度检测方案方案比较:土壤湿度传感器可以精确地测量土壤的湿度值,但是价格较高在700~1000元不适于民用。

通过多孔管将土壤湿度转换为空气湿度进行测量,实现难度较低价格便宜,但是精度较低需要重新确定土壤湿度和空气湿度的对应关系。

通过比较发现,民用不需要过高的精确度,而且空气湿度传感器有数字型可以直接测得数字值易于MCU使用。

最终我们决定使用方案二。

3 单元模块设计3.1单片机最小系统设计本系统以STC89C58RD+为核心控制单元其管脚与一般的51兼容,其主要特性如下:(1)增强型51内核,一个机器周期执行一条指令。

(2)工作电压5.5V~3.3V(3)工作频率范围0~35MHz(4)60K ROM,1024 RAM(5)32个通用IO口,可推输出,电流达20ma(6)支持ISP,IAP串口编程方式(7)集成EPROOM,看门狗,内部RC(8)上电自动复位,掉电检测(9)5路中断,支持上升沿触发(10)2路8位PWM其引脚如上图所示,RXD,TXD为串口收发端,INT0,INT1为外部触发,WR,RD分别为外部写选通,外部读选通。

P0,P1,P2,P3为输入输出接口。

可设定为四种模式:准双向口,推免,高阻,开漏。

P1口第二功能为AD口和ISP下载口P0口自带上拉电阻。

XTAL2 XTAL1为晶振引脚。

最小系统电路:C3与R1构成上电复位电路,XTAL1,XTAL2与晶振相连,频率为12MHz,C1,C2为起振电容EA接正极,以保证对内部ROM编程。

电源电压为直流5V。

晶振频率为11.0562MHz。

3.2DHT11湿度传感器DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。

传感器包括一个电阻式感湿元件和一个NTC 测温元件,并与一个高性能8位单片机相连接。

每个DHT11传感器都在湿度校验室中进行校准。

校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。

单线制串行口,较小的体积、较低的功耗,信号传输距离可达20米。

DHT11的供电电压为3-5.5V。

传感器上电后,要等待1s 以越过不稳定状态在此期间无需发送任何指令。

电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。

由于DHT11的温度测量只能精确到个位,而实际浴室温度变化比较小,很难通过DHT11的变化控制PWM的占空比,故本设计只采用DHT11的湿度传感器,而温度的测量则交由DS18B20实现。

3.3模块连接图注:DHT11温湿度检测模块可以多个并行使用,测量多点温湿度值,并且由MCU同时控制决定灌溉。

仿真图3.4程序主要流程图NN4主程序设计#include <reg51.h>#include <intrins.h>//typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量*/typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量*/typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量*/typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量*/typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量*/typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量*/typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度)*/typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度)*///#define uchar unsigned char#define uint unsigned int#define Data_0_time 4sbit RS = P1^5;sbit RW = P1^6;sbit E = P1^7;uchar code table1[]="HUMI";uchar code table2[]="TEMP";//************************************************************************* void delay1(uint z)//{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//************************************************************************* void read_busy()//1.1{RS = 0;RW = 1;E = 1;while(P2&0x80);}//************************************************************************* void write_com(uchar com)//1.2{P2 = com;RS = 0;RW = 0;E = 1;//???delay1(5);E = 0;}//************************************************************************* uchar read_dat(void)//1.3{uchar rdat;RS = 1;RW = 1;E = 1;rdat = P2;delay1(5);return(rdat);}//************************************************************************* void write_dat(uchar dat)//1.4{P2 = dat;RS = 1;RW = 0;E = 1;delay1(5);E = 0;}//************************************************************************* void init()//{delay1(15); //5.1write_com(0x38);//5.2delay1(5); //5.3write_com(0x38);//5.4delay1(5); //5.5write_com(0x38);//5.6write_com(0x38);//5.8write_com(0x08);//5.9write_com(0x01);//5.10write_com(0x06);//5.11write_com(0x0c);//5.12}//************************************************************************* void display(uchar *p)//write string{while(*p!='\0'){write_dat(*p);p++;read_busy();}}//*************************************************************************//----------------------------------------------////----------------IO口定义区--------------------////----------------------------------------------//sbit P1_0 = P1^0 ;//----------------------------------------------////----------------定义区--------------------////----------------------------------------------//U8 U8FLAG,k,humih,humil,temph,templ,temp,humi;U8 U8count,U8temp;U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_t emp;U8 U8comdata;U8 outdata[5]; //定义发送的字节数U8 indata[5];U8 count, count_r=0;U8 str[5]={"RS232"};U16 U16temp1,U16temp2;SendData(U8 *a){outdata[0] = a[0];outdata[1] = a[1];outdata[2] = a[2];outdata[3] = a[3];outdata[4] = a[4];count = 1;SBUF=outdata[0];}void Delay(U16 j){ U8 i;for(;j>0;j--){for(i=0;i<27;i++);}}void Delay_10us(void){U8 i;i--;i--;i--;i--;i--;i--;}void COM(void){U8 i;for(i=0;i<8;i++){U8FLAG=2;while((!P1_0)&&U8FLAG++);Delay_10us();Delay_10us();Delay_10us();U8temp=0;if(P1_0)U8temp=1;U8FLAG=2;while((P1_0)&&U8FLAG++);//超时则跳出for循环if(U8FLAG==1)break;//判断数据位是0还是1// 如果高电平高过预定0高电平值则数据位为1U8comdata<<=1;U8comdata|=U8temp; //0}//rof}//--------------------------------//-----湿度读取子程序------------//--------------------------------//----以下变量均为全局变量--------//----温度高8位== U8T_data_H------//----温度低8位== U8T_data_L------//----湿度高8位== U8RH_data_H-----//----湿度低8位== U8RH_data_L-----//----校验8位== U8checkdata-----//----调用相关子程序如下----------//---- Delay();, Delay_10us();,COM();//--------------------------------void RH(void){//主机拉低18msP1_0=0;Delay(180);P1_0=1;//总线由上拉电阻拉高主机延时20usDelay_10us();Delay_10us();Delay_10us();Delay_10us();//主机设为输入判断从机响应信号P1_0=1;//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!P1_0) //T !{U8FLAG=2;//判断从机是否发出80us 的低电平响应信号是否结束while((!P1_0)&&U8FLAG++);U8FLAG=2;//判断从机是否发出80us 的高电平,如发出则进入数据接收状态while((P1_0)&&U8FLAG++);//数据接收状态COM();U8RH_data_H_temp=U8comdata;COM();U8RH_data_L_temp=U8comdata;COM();U8T_data_H_temp=U8comdata;COM();U8T_data_L_temp=U8comdata;COM();U8checkdata_temp=U8comdata;P1_0=1;//数据校验U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);if(U8temp==U8checkdata_temp){U8RH_data_H=U8RH_data_H_temp;U8RH_data_L=U8RH_data_L_temp;U8T_data_H=U8T_data_H_temp;U8T_data_L=U8T_data_L_temp;U8checkdata=U8checkdata_temp;}//fi}//fi}//----------------------------------------------//main()功能描述: AT89C51 11.0592MHz 串口发//送温湿度数据,波特率9600//----------------------------------------------void main(){U8 i,j;//uchar str[6]={"RS232"};/* 系统初始化*/TMOD = 0x20; //定时器T1使用工作方式2TH1 = 253; // 设置初值TL1 = 253;TR1 = 1; // 开始计时SCON = 0x50; //工作方式1,波特率9600bps,允许接收ES = 1;EA = 1; // 打开所以中断TI = 0;RI = 0;write_com(0x80+0x03);display(table1);write_com(0x80+0x43);display(table2);SendData(str) ; //发送到串口Delay(1); //延时100US(12M晶振) while(1){//------------------------//调用温湿度读取子程序RH();//串口显示程序//--------------------------str[0]=U8RH_data_H;str[1]=U8RH_data_L;str[2]=U8T_data_H;str[3]=U8T_data_L;str[4]=U8checkdata;SendData(str) ; //发送到串口//读取模块数据周期不易小于2Shumi=U8RH_data_H;temp=U8T_data_H;humih=humi/10+0x30;humil=humi%10+0x30;temph=temp/10+0x30;templ=temp%10+0x30;write_com(0x80+0x09);write_dat(':');write_dat(humih);write_dat(humil);write_dat('%');write_com(0x80+0x49);write_dat(':');write_dat(temph);write_dat(templ);write_dat('`');write_dat('C');Delay(5000);}//elihwvoid RSINTR() interrupt 4 using 2{U8 InPut3;if(TI==1) //发送中断{TI=0;if(count!=5) //发送完5位数据{SBUF= outdata[count];count++;}}if(RI==1) //接收中断{InPut3=SBUF;indata[count_r]=InPut3;count_r++;RI=0;if (count_r==5)//接收完4位数据{//数据接收完毕处理。

相关主题