传感器技术模块

发布者:智能控制技术专业教学资源库项目组发布时间:2018-06-05浏览次数:2196

传感器技术模块

传感器技术
传感器是一种检测装置,能检测到被测量的信息,并能将检测到的信息进行采样后,变换成为有意义的信号输出,以满足信息的传输、处理、存储、显示、记录和控制等要求。传感器技术是实现自动检测和自动控制的首要环节。在智能农业管理系统中,传感器技术是整个系统的根本。

 
子模块1:温湿度监控管理子模块
 
Ø 
任务描述

农业生产过程中,通过温湿度传感器可以检测环境温度和湿度。农作物在生长过程中对于温度和湿度都有一定的要求,检测温湿度对农作物的生长非常重要。当环境温湿度不满足要求时,可以通过加热器和加湿器进行调节。


Ø  学习目的

1.       
了解温湿度传感器工作原理

2.       
掌握温湿度传感器节点控制程序的设计

3.       
掌握加热器和加湿器的实现


Ø  实现方法及步骤

1. 
温湿度传感器节点监控程序的设计

温湿度传感器根据用户设置的测量精度,进行数据采集,并且可以在温度和湿度进行转换。

程序流程图如图所示:


设置温湿度传感器

const struct _subDeviceInfo subDeviceList[SUBDEVICE_NUMBER]={
    {//
温度传感器

    ZD_THERMO_SENSOR, //
传感器类型

    ZD_READ, //
将传感器设置为可读模式

    'TmperSensor',//
温度传感器

    '',
    '%',
  },
  {//
湿度传感器

    ZD_THERMO_SENSOR,
    ZD_READ,
    'HumidSensor',//
湿度传感器

    '',
    '%',
  },
};
 
定义全局变量,用以保存传感器数据。

char buftestSensor[10];
 
定义温湿度传感器的调用函数。

char *ThermoSensor(uint8 cmd,uint8 dataLen,uint8 *data)
{//
温度

    if(ReadT()==1)
    {
      CC.cVal[1]=RHTRlt[0];
      CC.cVal[0]=RHTRlt[1];
       TT=D1+D2*CC.iVal;
      sprintf(buftestSensor,'%5.2f',TT);
      return buftestSensor; 
    }
    else
    { return '';}
}
char *HumiSensor(uint8 cmd,uint8 dataLen,uint8 *data)
{//
湿度

    if(ReadRH()==1)
    {
      CC.cVal[1]=RHTRlt[0];
      CC.cVal[0]=RHTRlt[1];
      RH=C1+C2*CC.iVal+C3*CC.iVal*CC.iVal;
      sprintf(buftestSensor,'%.2f',RH);
      return buftestSensor; 
    }
    else
    { return '';}
}
 
设置温湿度传感器进程

typedef char *_DeviceCall(uint8 cmd,uint8 dataLen,uint8 *data);
_DeviceCall *SubDeviceProcessor[SUBDEVICE_NUMBER]=

ThermoSensor,
};
通过回调函数或者函数处理表,调用所连接的设备,查找其中的温湿度传感器,并进行处理。

void SubDeviceReceiveDataParse(uint8 cmd,uint8 subDev,uint8 dataLen,uint8* data)
{
  char s[20];
  static counter;
  counter++;
  if(subDev>=0&&subDev<SUBDEVICE_NUMBER) //
检测传感器设备是否已连接

  {
    char *res;
    switch(subDev) //
根据传感器设备,此处
0为温度、1为湿度
    {
           case 0:
        res=ThermoSensor(cmd,dataLen,data);
        break;
      case 1:
        res=HumiSensor(cmd,dataLen,data);
        break;
    }
    sprintf(s,'Call %d temp=%s ',counter,res);
         HalUARTWrite( SERIAL_APP_PORT,s,strlen(s));
        
    if(res)
//
处理温湿度传感器进程

      DeviceCommandResponse(cmd,subDev,osal_strlen(res)+1,res);
    else
      DeviceCommandResponse(cmd,subDev,0,0);
  }
}
 
读取温度函数

char ReadT(void)
{
  char Rlt=0;
  long i=0;
  I2CReset();//
复位通讯

  I2CStart();//
发送起始位

  Rlt=I2CSendB(TEMP); //
发送测温命令

  if(Rlt==0) return 0; //
是否要拉高数据线
?
  P0DIR=P0DIR&0xBF;//p0.6
为输入模式

  for(i=0;i<1999999;i++)
  {
    if(SHTDAT==0) break;
  }
  if(SHTDAT==1) return 0;
  //
测试数据线传感器已经测试完成

  //
读回数据

  RHTRlt[0]=I2CReadB(0);
  RHTRlt[1]=I2CReadB(0);
  RHTRlt[2]=I2CReadB(1);
  return 1;
}
 
读取湿度函数

char ReadRH(void)
{
  char Rlt=0;
  long i=0;
  I2CReset();//
复位通讯

  I2CStart();//
发送起始位

  Rlt=I2CSendB(HUMI); //
发送测湿命令,注意,此处设置与温度不同

  if(Rlt==0) return 0;
  for(i=0;i<1999999;i++)
  {
    if(SHTDAT==0) break;
  }
  if(SHTDAT==1) return 0;
  //
测试数据线传感器已经测试完成

  //
读回数据

  RHTRlt[0]=I2CReadB(0);
  RHTRlt[1]=I2CReadB(0);
  RHTRlt[2]=I2CReadB(1);
  return 1;
 }
通过读取温湿度传感器的数据,可以根据
RHTRlt中读出的数据得到当前的温度和湿度,从而根据需要进行调节。
 
2.   
加热器与加湿器控制程序的设计

通过获得温度和湿度数据,可以了解农作物当前的环境状态。状态获取流程如图所示:


核心代码为发送读取命令,通过
sendReadCmd函数来实现。

当温室内温度低于设定值时,系统便启动加热器来升温,直到温度达到设定值为止。当控制节点接收到温度实时数据时,它会判断实时数据与阀值之间的关系。如果实时数据高于阀值,控制节点便控制相应的继电器关闭加热器;如果实时数据低于阀值,控制节点便控制相应的继电器开启加热器。


 
子模块2:红外感应管理子模块
普通人体会发射
10um左右的特定波长红外线,用专门设计的传感器就可以针对性的检测这种红外线的存在与否,当人体红外线照射到传感器上后,因热释电效应将向外释放电荷,后续电路经检测处理后就能产生控制信号。这种专门设计的探头只对波长为 10μm左右的红外辐射敏感,所以除人体以外的其他物体不会引发探头动作。探头内包含两个互相串联或并联的热释电元,而且制成的两个电极化方向正好相反,环境背景辐射对两个热释元件几乎具有相同的作用,使其产生释电效应相互抵消,于是探测器无信号输出。
一旦人侵入探测区域内,人体红外辐射通过部分镜面聚焦,并被热释电元接收,但是两片热释电元接收到的热量不同,热释电也不同,不能抵消,于是输出检测信号。

红外感应管理模块的实现核心函数如下:

const struct _subDeviceInfo subDeviceList[SUBDEVICE_NUMBER]={
  {
    ZD_THERMO_SENSOR,
    ZD_READ,
    'InfrarSensor',//
光照传感器

    '',
    '',
  },
};
char buftestSensor[10];
char GetME003S(void)
{
  char Port1; 
  P1DIR&=~(1<<1);
  if(P1_1)
         return 1;
  else
         return 0;
}
 
void SubDeviceReceiveDataParse(uint8 cmd,uint8 subDev,uint8 dataLen,uint8* data)
{
  if(subDev>=0&&subDev<SUBDEVICE_NUMBER)
  {
    char *res;
    switch(subDev)
    {
      case 0:
                  res=buftestSensor;
                  sprintf(res,'%d',GetME003S());
        break;
    }
   
    if(res)
      DeviceCommandResponse(cmd,subDev,osal_strlen(res)+1,res);
    else
      DeviceCommandResponse(cmd,subDev,0,0);
  }
}