单片机交流
直播中

算一挂

8年用户 887经验值
私信 关注
[问答]

如何利用单片机设计智能大棚浇水系统?

如何利用单片机设计智能大棚浇水系统?

回帖(1)

余少华

2021-10-29 14:51:16
最近几年,人们的生活水平有了很大提高,在种植业也是实现科技化,人工智能走进农业,但由于缺少检测工具,人们因并不知道土壤的缺水程度及其他原因无法按时浇水或是浇水过多的植物和成为主要的死亡原因。
为解决自动化管理大棚创建智能大棚管理系统,但是智能灌溉系统的特点在市场上众多的仪器,但价格过于昂贵,对于一般家庭,过于复杂的应用程序和多功能性是不必要的。
智能大棚浇水系统能够解决这个问题,该系统主要是一个电磁阀致动器在一端连接管,连接到外部水管作为浇水主要由微控制器控制的另一端。设备主要通过控制浇水间隔浇水的持续时间,以控制浇水量。方便操作,这样就实现了现代家庭生活,同时也保证植物的正常生长。
近年来,电子技术作为新技术的代表,以推动电子行业的快速增长,也极大地推动智能家电和智能家居设备的快速发展。智能家电海外市场似乎已经做大做强,鉴于中国在全球制造链和设计链的重要作用,这使它成为世界上主要的设备制造商在生产智能家居的大决战的竞争,而且还导致中国国内情报国内研发及检测设备和仪器技术应用的快速发展。智能灌溉控制系统自然也包括在内,在最近几年,出现了很多国内外各类智能灌溉控制系统,它的功能和控制的原则有许多不同,但两者的根本目的方便了人们的日常生活,保证正常生长和鲜花。
众所周知,在二十世纪,人类跨越了三个“电”的时代,即电气时代、电子时代和电脑时代。但这种电脑,通常指个人计算机,也就是我们平时所说的PC机。它由主机、显示器、键盘等组成。除此之外还有一类计算机,大多数人很不熟悉。这种计算机就是把智能赋予给各种机械的单片机(微控制器)。这种计算机最小的系统只用一片集成威廉希尔官方网站 ,就能进行简单运算和控制。因为其体积小,通常都被放在被控机械的“肚子”里。在整个装置中,他的作用有如人类头脑,若它出了毛病,整个装置也就瘫痪了。现如今,这种单片机的使用领域已发展的十分广泛,如智能仪表、导航系统、实时工控、通讯设备、家用电器等。各种家用产品用上了单片机以后,便能起到令产品换代升级的功效,通常都会在产品名称前加上形容词——“智能型”,例如智能型洗衣机等等。 而花卉养殖作为大多数人生活中的一部分,却常常因为人们工作等原因被忽略,智能浇花控制系统可为人们解决这一问题,与此同时,智能浇花控制系统若能走进家庭,也是人们生活进入智能化的标志之一。
大家都知道,在二十世纪,人类跨越时代的三个“电”,即电气时代,电子时代和计算机时代。不过,这里的计算机,通常是指个人电脑,这就是我们通常说的PC。它由主机,显示器,键盘和其它组分。此外,还有一类计算机,大多数人非常熟悉。给各种机械赋予智能的单片机(MCU)。这样的计算机系统只使用一个最小的IC可以进行简单的算术和控制。由于其体积小,经常被指责被放置在机械的“肚子”里。整个单元,他的作用就像人的大脑,如果它出了毛病,那么瘫痪的是整个系统。现在,该领域已被开发广泛使用,如智能仪表,导航系统,实时工业控制,通讯设备,家用电器等。用各种家居产品的微控制器后,就能起到使产品升级换代的功效,一般的产品名称与形容词前 - “智能”,如智能洗衣机等。
  1.总体设计

  根据题目要求的要求,确定了以下方案:自己买材料制作,连接到微控制器,使土壤水分控制,并在此基础上,最小系统板安装湿度传感器。然后,湿度测距数据检测模块返回到微控制器,微控制器发送相应的命令来实现对泵的开关控制,实现自动检测和自动浇水湿度的功能。 ## 1.1 主控芯片的选择   现在市场上种类繁多,最能够满足比单片机AT89C51,AVR单片机主体的要求,以及ARM,凌阳,当然他们有自己的优势和劣势在控制芯片,但这个设计过程中,我们选择了AT89C51。相比于其他类型的控制芯片,AT89C51系列更适合我们这个型号,如:AT89C51单片机完全能够完成这一精心设计的所有功能; AT89C51外围威廉希尔官方网站 非常简单,易于控制;在我们的课程对许多AT89C51的演讲;事情TA89C51价格相对于其他的控制芯片,便宜很多,最重要的可能是一个很好的成本控制能力。
考虑到所有这些点的时候我是在最后的设计选用AT89C51单片机来完成这一设计。
## 1.2 AT89C51单片机的基本组成
AT89C51由一个8位的微处理器,128KB片内数据存储器RAM,21个特殊功能寄存器SFR,4KB片内程序存储器Flash ROM,64KB可寻址片内外统一编址的ROM,64KB可寻址片外的RAM, 4个8位并行I/O接口(P0—P3),一个全双工通用异步串行接口UART,两个16位的定时器/计数器,具有位操作功能的布尔处理机及位寻址功能的五个中断源、两个优先级的中断控制系统以及片内振荡器和时钟产生威廉希尔官方网站 。其基本组成框图如图所示。
## 1.3 AT89C51主要特性
AT89C51主要特性有:
·与MCS-51 兼容
·4K字节可编程闪烁存储器
·寿命:1000写/擦循环
·数据保留时间:10年
·全静态工作:0Hz-24Hz
·三级程序存储器锁定
·128*8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟威廉希尔官方网站

#include
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define     LCDIO      P0         //液晶屏数据口
//ADC0832的引脚
***it ADCLK =P1^1;  //ADC0832 clock signal
***it ADDIO =P1^3;  //ADC0832 k in
***it ADCS =P1^4;  //ADC0832 chip seclect


***it rs=P1^0;  //定义1602 RS
***it lcden=P1^2; //定义1602 EN
***it key1=P3^0;    //设定
***it key2=P3^1;    //加
***it key3=P3^2;    //减
***it motor=P3^7;   //继电器接口
***it speak=P1^5;        //蜂鸣器接口
uchar key;         //设定指针
uint RH=400,RL=200;//水位上下限
float temp_f;
ulong temp;
uchar v;
uchar count,s1num;
uchar code table[]= " moisture:          ";
uchar code table1[]="RH:  %              ";
uchar getdata; //获取ADC转换回来的值
/*********************************************/
void delay(uint z)                  //延时
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
/**********************************************/
void write_com(uchar com)
{
        rs=0;
//        rd=0;
        lcden=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;       
}
/*********************************************/
void write_date(uchar date)
{
        rs=1;
//        rd=0;
        lcden=0;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;       
}


void lcdinit()
{
        lcden=0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
}
/***********************************************/
void init()
{
        uchar num;
       
        for(num=0;num<15;num++)
                {
                        write_date(table[num]);
                        delay(5);
                }
        write_com(0x80+0x40);
        for(num=0;num<15;num++)
                {
                        write_date(table1[num]);
                        delay(5);
                }
        }
//****************************************************************************/
/************
读ADC0832函数
************/
//采集并返回
/****************************************************************************
函数功能:AD转换子程序
入口参数:CH(如果读取CH0,channel的值为0x01,如果读取CH1则channel的值为0x03)
出口参数:adval
****************************************************************************/
uchar Adc0832()     //AD转换,返回结果
{
    uchar i;
    uchar dat=0;


    ADCLK=0;
    ADDIO=1;
    ADCS=0;                  //拉低CS端
    ADCLK=1;                 
    ADCLK=0;                 //拉低CLK端,形成下降沿1


    ADDIO=1;//指定转换通道是CH1还是CH2,指定值位与0x1,取最后一位的值
    ADCLK=1;   
    ADCLK=0;                 //拉低CLK端,形成下降沿2


    ADDIO=0;//指定值右移一位,再取最后一位的值
    ADCLK=1;
    ADCLK=0;                //拉低CLK端,形成下降沿3




    ADDIO=1;               
        for(i=0;i<8;i++)
    {
        ADCLK=1;
        ADCLK=0;           //形成一次时钟脉冲
        if(ADDIO)
                   dat|= 0x80>>i;  //收数据
    }




    ADCS=1;                //拉低CS端
    ADCLK=1;
    ADDIO=1;               //拉高数据端,回到初始状态
    return(dat);           //return dat
}
/***************************************************************************/




/********************************************************/
void displayRH()                        //下限显示
{write_com(0xc0+3);
write_date(RH/100%10+0x30);//上限百位
write_date(RH/10%10+0x30);//上限十位
//write_date('.');
//write_date(RH%10+0x30);
}
void displayRL()          //下限显示
{write_com(0xca);
  write_date('R');
  write_date('L');
  write_date(':');
write_date(RL/100%10+0x30);//下限百位
write_date(RL/10%10+0x30);//下限十位
write_date('%');
}
/**************************************************/
/********************************************************/
void keyscan()                 //按键处理
{bit kk1=0,kk2=0;
if(key1==0)
{delay(30);
  while(key1==0);
   if(key>=2)
   {key=0;
   }
   else
   {key++;
   }
   switch(key)
   {speak=1;kk2=motor;motor=1;
    case 1:{write_com(0x0f);write_com(0xce); //光标闪烁
        while(key1!=0)         //等待按键松开
        {
    if(key2==0)                //key2按键下
   {delay(30);                //按键延时消抖
   if(key2==0)                //确定key2按下
   {
    while(key2==0); //等待松开
        if(RL>=998)
        {RL=999;                //RL下限最大设置为99
        }
        else
        {RL+=10;                //RL加1
        }       
   }
   displayRL();                //调用RL下限显示函数
   write_com(0xce);
  }   
   if(key3==0)                //key3按下
   {delay(30);                //按键延时消抖
   if(key3==0)                //确定key3按下
   {
    while(key3==0);         //等待key3按键松开
        if(RL<=1)                 //RL最小设置为1
        {RL=0;
        }
        else
        {RL-=10;                 //RL下限减1
        }
   }
   displayRL();                //调用RL下限显示函数
   write_com(0xce);
  }

   
   }while(key1==0);       
        }
        case 2:{write_com(0x0f);write_com(0xc4);  //RH设置数据,光标闪烁
   while(key1==1)
   {
    if(key2==0)           //key2按下
   {delay(30);           //按键延时消抖
   if(key2==0)           //确定key2按下
   {
    while(key2==0);        //等待松开
        if(RH>=998)                //RH最大设置为99
        {RH=999;
        }
        else
        {RH+=10;                //RH加1
        }
       
   }
   displayRH();                //RH上限显示函数
    write_com(0xc4);
  }

   
   
   if(key3==0)          //key3按下
   {delay(30);          //按键延时消抖
   if(key3==0)          //确定按下
   {
    while(key3==0);//等待松开
        if(RH<=1)           //RH最小设置为1
        {RH=0;
        }
        else
        {RH-=10;                //RH减1
        }


   }
   displayRH();                //调用RH显示函数
    write_com(0xc4);
  }



   }
   while(key1==0);
   }
        case 0:{write_com(0x0c);
                        motor=kk2;


            break;}
   }
   }
}
/**************************************************/
void Conut(void)          //土壤检测数据转换
{          
      v=Adc0832();
          temp=v;
      temp_f=temp*9.90/2.55;
      temp=temp_f;
          temp=1000-temp;         
          write_com(0x80+10);
          write_date(temp/100%10+0x30);//千位
          write_date(temp/10%10+0x30);//百位
          write_date('.');
          write_date(temp%10+0x30);
          write_date('%');//显示符号位
       
         }
/********************************************************/
void main(void)
{
        lcdinit();
        init();
        displayRH();   //显示上限
        displayRL();   //显示下限
        delay(50);         //启动等待,等LCD讲入工作状态
        delay(50);         //延时片刻(可不要)
        delay(50);                         //延时
        delay(50);
        Conut();           //显示函数
        delay(150);        
        while(1)
        {        
             Conut();        //显示当前湿度
                 keyscan();
                 if(temp>RH)  //如果湿度大于上限停止浇水
                 {motor=1;          //关闭继电器
                 }
                 else if(temp                  {motor=0;                 //启动继电器
                 }
                 if(temp                  {speak=0;                                //启动报警
                  delay(150);                         //延时
                  speak=1;
                 }
                 keyscan();                 //按键检测
                 delay(150);                         //延时50MS
        }
}
  3.1 总威廉希尔官方网站 设计图

  
  

  

  4. 联机调试

  
  

  

  总结

  本次设计的智能大棚浇水系统以电子类的自动浇水器的工作原理为参考,运用现代传感器技术及单片机控制技术构成一个土壤温湿度采集与控制系统。再用数字威廉希尔官方网站 控制自动给水系统及时的给浇水系统供水。整个盆花自动浇水系统包括土壤温湿度的检测和显示、自动浇水和蓄水箱自动上水及水位报警三个部分。蓄水箱自动上水及水位报警采用纯硬件威廉希尔官方网站 控制,实现水箱水位实时监测、自动上水以及水位上下限报警的功能。
通过本次课程设计,让我进一步了解了电脑控制的智能系统。也使我们真正接触到了检测控制系统的设计,虽然是一个人们日常生活中的小系统,但也让我明白了很多设计上应该注意的问题。比如实用性、经济性以及安装条件等。
  
举报

更多回帖

发帖
×
20
完善资料,
赚取积分