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