单片机土壤湿度检测及自动浇花系统仿真(带时间显示)
单片机土壤湿度检测及自动浇花系统仿真(带时间显示)
具体功能:
(1)液晶第一行显示实际湿度,液晶第二行显示当前时间;
(2)按键说明:减键、加键、设置键。
(3)可以设置湿度上下限报警范围,具有掉电保存功能,上电无需重新设置。
(4)当湿度低于下限值时,打开水泵(风扇开始转动)进行抽水且声光报警,当湿度高于上限值时,自动关闭水泵停止抽水。
1.1 课题背景和意义
在科技发达的当下,人们的生活水平也在奔向小康。在家里养养花逐渐变成了人们兴趣的一种境界,养花可以陶冶情操。因此,盆花和花圃被越来越多的人接纳。
花的生长需要水的滋养,因此。浇水的量成了养花能否成功的关键所在。社会在不断进步,上班、出差、旅游也成了人们生活的一部分,这就会导致人们没有时间去看护这些花草。这些因素都是造成养花失败的关键所在。对此问题,我们不禁会想到:“如果有人能帮我们看护花,那该有多好,能在我们忙碌的时候帮我们浇浇水,那该多好!”对于这样的想法,我们能联想的就是“自动浇花器”,因此,我想设计一个能检测土壤湿度并且能报警提醒的自动浇花器,让用户能在百忙之中也能对盆花有悉心的照料。
1.2 浇灌系统发展趋势(篇幅有限,详见文末)
2.1 浇灌系统设计的需求
此次设计是为了方便人们在繁忙的时候也能对盆栽、花圃进行浇灌,要求土壤的湿度以数值的形式显示在LED屏上。具备报警功能,在检测到需要浇水的时候能报警提醒,并把该时刻的湿度显示在LED屏上。需要浇灌的条件可以由人自己修改确定,通过按键调试,达到用户的浇灌需求。能达到抽水浇灌的功能,在湿度传感器(yl-69)检测到湿度,报警系统提醒以后,能抽水浇灌。 按键能够调节浇灌的湿度额定值,并且显示在LED屏上。
2.2 总体设计方案选定
本次设计采用的是STC89C52单片机,利用单片机编程灵活的特性实现了设计要达到的喷灌功能。在单片机的外围电路外接输入键盘用于设定喷灌的湿度值的控制,外接LCD1602显示器用于显示湿度。其原理如下图2-1所示。
3.1 LCD1602显示接口线路
液晶显示。以数值的显示,这型号的液晶屏和单片机的接口更加简单可靠,操作也方便,通过显示屏上的电极控制液晶分子状态来达到显示的目的。在重量上比相同显示面积的传统显示器要轻得多[1]。 它的1引脚为;2引脚为5;3引脚0为对比度调整端,接时对比度最弱,接地时最高;4引脚,高电平1时为数据寄存器,低电平0时为;5引脚为读写信号线,高电平1时为读操作,低电平0时为;6引脚E为使能端,高电平1时读取信息,负跳变时执行指令。714引脚D0D7为8位双向数据端;15引脚BLA为背光正极;16引脚BLK为背光负极[2]。由图可以看到显示屏的RS引脚和E引脚分别与单片机的P1.0与P1.2引脚相连,通过程序设定P1.0与P1.2引脚的高低电平的改变来控制液晶显示屏的命令选择和数据的读取。其中RW与单片机的P1.1引脚相连。RS引脚与RW引脚同为低电平时,处于写指令状态;RS引脚为高电平,RW为低电平时处于写数据状态,而E引脚在高电平时处于读取信息状态,负跳变时才会执行指令[3]。显示线路如图3-1所示。
3.2 ADC0832
ADC0832是8位逐次逼近式模数转换器,它可以根据地址码锁存译码后的信号。只选通8路模拟输入信号中的一个进行转换是目前国内应用最广泛的8位通用芯片[4]。引脚为片选使能,芯片使能;0引脚为输入通道0;1引脚为模拟输入通道1;引脚为。DI引脚为数据信号输入,选择通道控制;DO引脚为数据信号输出,转换数据输出[5]。由图可以看到,ADC0832的CS引脚和单片机的P1.3引脚相连,为高电平时芯片禁用,只有为低电平是芯片才工作,在进行A/D转换时,必须保持CS为低电平,且要保持到转换完成为止;DO和DI引脚因为在通信是不能同时有效且与单片机连接是双向的。所以在设计时将两引脚并联在一条线上使用,都和单片机的P1.5引脚连接;引脚和单片机的P1.4引脚连接。在向端输入脉冲时,DO/DI端使用DI端输入通道功能选择的数据信号,在第一个时钟脉冲下沉前DI端必须是高电平,表示启动信号[6]。连接图如图3-2所示。
3.3 湿度传感器
此次设计所使用的是yl-69土壤湿度传感器,通过按键模块调节土壤湿度值,可以自动对花圃自动浇水,数字量输出D0可以与单片机直接相连,通过单片机来检测高低电平,由此来检测土壤湿度[7]。具体连接方式为传感器板上的VCC接电源,GND接地,A0接单片机模拟输入,D0接数据输入。
3.4 报警器模块
蜂鸣器是一种能发出声音的元器件,按照其产生声音方式分为有源和无源两种类型,此次设计中报警器模块用到的是有源。三极管Q1在电路里起到了开关的作用,它的基极低电平使得三极管达到饱和导通,这时候蜂鸣器就达到了能够发声的条件,从而进行发声;而它基极的高电平则会使三极管关闭,这时候不能满足发声的条件,所以蜂鸣器就会停止发声[8]。3-3所示。
3.5 按键模块(篇幅有限,详见文末)
4.1 主程序模块
该主程序流流程图是硬件初始化之后,设定好数值,然后采集湿度样本,把湿度样本传给单片机之后,单片机系统处理该湿度数值,判断湿度值是不是在设定值范围内,如果高于湿度值,停止灌溉,假如低于湿度值,返回到湿度采样,再次判断湿度值,直到达到湿度值结束。主程序流程图如图4-1所示。
4.2 湿度报警及自动浇水模块
报警器模块描述的是在采集到湿度样本以后,对采集到的样本值进行判断,是否达到预定值,如果未达到预定值,也就是土壤湿度过于干燥,报警器则会报警,开始浇灌。如果采集到的值高于预定值,报警器不报警。具体流程图如图4-2所示。
4.3 显示模块
土壤温湿度采集与显示系统以单片机STC89C52为控制核心,通过软件设置达到显示的目的。土壤的温湿度是由ADC0832和两个点位器进行模拟并送入单片机,通过单片机的I/O口把检测到的土壤温湿度值用LCD显示出来,同时,如果系统在智能浇水设置情况下,则该值与设定的浇水上下限值相比较,若低于下限值,则单片机发出一个控制信号,开始浇水;若高于上限值时,单片机再发出一个控制信号控制,停止浇水[11]。该模块主要简述了LCD1602显示的土壤湿度值的流程,通过传感器模块对采集到的湿度样本进行判断后,将最终的数值显示出来。显示模块流程如图4-3所示。
(篇幅有限,详见文末)
/* 功能:土壤温湿度检测与自动浇花 */ #include <reg52.h> //调用单片机头文件 #define uchar unsigned char //无符号字符型 宏定义变量范围0~255 #define uint unsigned int //无符号整型 宏定义变量范围0~65535 #include <intrins.h> sbit SCL=P1^4;//SCL定义为P1口的第3位脚,连接ADC0832SCL脚 sbit DO=P1^5;//DO定义为P1口的第4位脚,连接ADC0832DO脚 sbit CS=P1^3;//CS定义为P1口的第4位脚,连接ADC0832CS脚 sbit SCK_P = P2^1;// 时钟芯片DS1302的SCK管脚 sbit SDA_P = P2^2;// 时钟芯片DS1302的SDA管脚 sbit RST_P = P2^0;// 时钟芯片DS1302的RST管脚 sbit beep = P3^3; //蜂鸣器IO口定义 uint temperature,s_temp ; //温度的变量 uchar shidu; //湿度等级 uchar s_high = 70,s_low = 25;//湿度报警参数 sbit dianji = P1^6; //电机IO定义 bit flag_300ms ; uchar key_can; //按键值的变量 uchar menu_1; //菜单设计的变量 //这三个引脚参考资料 sbit rs=P1^0; //1602数据/命令选择引脚 H:数据L:命令 sbit rw=P1^1; //1602读写引脚 H:数据寄存器L:指令寄存器 sbit e =P1^2; //1602使能引脚 下降沿触发 uchar code table_num[]="0123456789abcdefg"; uchar TimeBuff[7]={17,9,1,6,18,30,40};// 时间数组,默认2017年9月1日,星期五,18:30:40 /******************************************************************** * 名称 : delay_uint() * 功能 : 小延时。 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void delay_uint(uint q) {while(q--); } /******************************************************************** * 名称 : write_com(uchar com) * 功能 : 1602命令函数 * 输入 : 输入的命令值 * 输出 : 无 ***********************************************************************/ void write_com(uchar com) {e=0;rs=0;rw=0;P0=com;delay_uint(3);e=1;delay_uint(25);e=0; } /******************************************************************** * 名称 : write_data(uchar dat) * 功能 : 1602写数据函数 * 输入 : 需要写入1602的数据 * 输出 : 无 ***********************************************************************/ void write_data(uchar dat) {e=0;rs=1;rw=0;P0=dat;delay_uint(3);e=1;delay_uint(25);e=0; } /*********************************************************/ // 液晶光标定位函数 /*********************************************************/ void LcdGotoXY(uchar hang,uchar add) {if(hang==1)write_com(0x80+add);elsewrite_com(0x80+0x40+add); } /*********************************************************/ // 液晶输出字符串函数 /*********************************************************/ void LcdPrintStr(uchar *str) {while(*str!=' ')write_data(*str++); } /*********************************************************/ // 液晶输出数字(0-99) /*********************************************************/ void LcdPrintNum(uint date) {write_data(0x30+date/10%10);write_data(0x30+date%10); } /******************************************************************** * 名称 : init_1602() * 功能 : 初始化1602液晶 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void init_1602() {write_com(0x38);write_com(0x38);write_com(0x0c);write_com(0x06);delay_uint(1000);LcdGotoXY(0,0);LcdPrintStr("20 - - : ");LcdGotoXY(1,0);LcdPrintStr(" shidu:00% "); } /***********************1ms延时函数*****************************/ void delay_1ms(uint q) {uint i,j;for(i=0;i<q;i++)for(j=0;j<120;j++); } /*********************************************************/ // 刷新时间显示 /*********************************************************/ void FlashTime() {LcdGotoXY(0,2);// 年份LcdPrintNum(TimeBuff[0]);LcdGotoXY(0,5);// 月份LcdPrintNum(TimeBuff[1]);LcdGotoXY(0,8);// 日期LcdPrintNum(TimeBuff[2]);LcdGotoXY(0,11);// 小时LcdPrintNum(TimeBuff[4]);LcdGotoXY(0,14);// 分钟LcdPrintNum(TimeBuff[5]);LcdGotoXY(0,13);// 秒钟if(TimeBuff[6]%2==0)// 秒钟是偶数显示冒号write_data(':');else// 秒钟是奇数显示空格write_data(' '); }
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157相关知识
自动浇水系统设计
基于单片机的智能浇花(灌溉)系统设计
基于STM32单片机远程浇花花盆GSM短信浇水补光灌溉系统
第七讲:7.物联网土壤湿度远程监控+自动花浇水
基于STM32单片机的鲜花售卖机系统设计
基于51单片机的新型“花疗”智能花卉养护机设计
盆花自动浇花系统设计方案你了解吗?
基于STM32单片机智能养花灌溉土壤湿度检测无线云平台设计21
花卉自动浇灌控制新版专业系统设计.doc
开题报告 基于单片机智能花卉浇水系统的设计电气工程专业
网址: 基于51单片机土壤湿度检测及自动浇花浇灌系统 https://m.huajiangbk.com/newsview96318.html
上一篇: Arduino实验38:土壤湿度 |
下一篇: 海珠区迎国庆70周年花卉布置苗木 |