传感器技术模块

发布者:智能控制技术专业教学资源库项目组发布时间: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检测传感器设备是否已连接

{
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{
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);
}
}

Baidu
map