⑴温湿度传感器节点监控程序的设计
温湿度传感器根据用户设置的测量精度采集数据,并且可以完成温度和湿度数据转换。程序流程图如图所示:

①设置温湿度传感器。
const struct_ subDevicelnfo 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[l] = RHTRlt[ O];
CC. cVal[O] = RHTRlt[l];
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[O];
CC. cVal[O] = RHTRlt[1];
RH = C1 + C2 * CC. iVal + C3 * CC.iVal * CC.iVal;
sprintf ( buftestSensor, " % .2f ", RH) ;
retrun buftestSensor;
}
else
{ return””; }
}
④设置温湿度传感器进程
typedef char * _DeviceCall( uint8 cmd,uint8 dataLen, uinta8 * data);
_DeviceCall * SubDeviceProcessor[SUBDEVICE_NUMBER]=
{
ThermoSensor,
}
⑤通过回调函数或者函数处理表,调用所连接的设备,查找其中温湿度传感器,并进行处理。
void subDeviceReceiveDataParse (uint8 cmd, uint8 subDev,uint8 dataLen, uintB * data)
{
char S[20];
static counter;
counter + + ;
if(subDev>= O&&subDev<SUBDEVICE_NUMBER)//检测传感器设备是否已连接
{
char * res;
switch(sutoev)//根据传感器设备,此处“0”表示温度,“1”表示湿度
{
case 0:
res=ThermoSensor(cmd , dataLen. data);
break;
case l:
res = HumiSensor(cmd.dataLen,data);
break;
{
sprintf ( s,"Call % d temp = % s ", counter, res );
HalUARIWrite( SERIAL_APP_PORT,S.strlen(s) ) ;
if (res)
//处理温湿度传感器进程
DeviceCanmandResponse(cmd,subDev, osal _ strlen(res)+l,res );
else
DeviceCamnandResponse(com,subDev,O ,0);
}
}
⑥读取温度函数。
char ReadT(void)
{
char Rlt=0;
longi=0;
I2CReset();∥复位通信
I2CStart();∥发送起始位
Rlt=I2CSendB(TEMP);∥发送测温命令
if(Rlt= =0) return 0;∥是否要拉高数据线?
PODIR=PODIR&OxBF;//p0.6为输入模式
for(i=0;i<1999999;i + +)
{
if (SHTDAT = = O) break;
{
if (SHTDAT = = O) retum O;
∥测试数据线传感器已经测试完成
∥读回数据
RHTRlt[ O ] = I2CReadB( O ) ;
FHTRlt[ l ] = I2CReadB( O ) ;
RHTRlt[ 2 ] = I2CReadB(1) ;
return l;
}
⑦读取湿度函数。
char ReadRH(void)
{
char Rlt=0;
long i=0;
I2CReset();//复位通信
I2CStart();//发送起始位
Rlt= I2CSendB(HUMI);//发送测湿命令.注意,此处设置与测量温度不同
if(Rlt= =0)return 0;
for(i= O;i<1999999;i+ + )
{
if(SHTDAT= =0)break;
}
if(SHTDAT= =1)return 0;
//测试数据线传感器已经测试完成
//读回数据
RHTRlt[O]=I2CReadB(0);
RHTRlt[l]=I2CReadB(O);
RHTRlt[2]=I2CReacB(1);
return l;
}
通过读取温湿度传感器的数据,可以根据RHTRlt中读出的数据得到当前的温度和湿度,从而根据需要进行调节。
⑵温湿度传感器ZigBee协议栈的设计
温湿度传感器的ZigBee协议栈的设计与任务1-1中的气体传感器方法类似。
⑶加热器与加湿器控制程序的设计
通过获得温度和湿度数据,可以了解农作物当前的环境状态。状态获取流程如图所示

核心代码为发送读取命令,通过sendReadCmd函数实现。
void ZigbeeThread : : sendReadCmd( )
{
for( int i = O; i<nzbDevice; i+ + )
{
for ( int j = O; j<zbDeviceList[i] . nSub; j + + )
{
QByteArray temp ( zbDeviceList[i] .subDevice[ j ] .name);
QString name(temp);
if ( name = = "TmperSensor" )
{
ZigbeeCommandSubmit ( zbDeviceList[ i ] .shortAddr,j, ZD_RFAD, O, O, i, O);
}
}
}
}
当温室内温度低于设定值时,系统启动加热器来升温,直到温度达到设定值为止。当控制节点接收到温度实时数据与阈值之间的关系。如果实时数据高于阈值,控制节点控制相应的继电器关闭加热器;如果实时数据低于阈值,控制节点便控制相应的继电器开启加热器。

新建一个Qt GUI工程,拖放QLabel、QLineEdit、QCheckBox控件,记录当前温度数据,界面效果图如图所示。
窗体对应函数如下所示:
void Widget : : GetRecvData( QString name, QByteArray data)
{
m_data = data,toFloat ( ) ;
QString temp(data) ;
ui - >lineEdit_ data - >setText (temp) ;
}
这是一个自动触发函数。当收到嵌入式网关的数据时,触发信号函数,把数据发送给函数;函数根据数据来
判断,通过判断命令区分数据类型
ZD_READ用于读取传感器数据。当cmd为ZD_READ时,将数据转换成字符串,显示在界面上,并用全局变量
data保存,判断是否打开加热器。