毕业设计 DS18B20 多终端测温实验---求大神帮助,急急急!!!
多点水温采集显示系统设计(ZigBee)
一共用到4的ZigBee节点,一个为协调器,三个终端。将三个终端的温度发送到协调器上显示,但是ds18b20的测温搞不懂。
终端
void SampleApp_Send_P2P_Message( void )
{
byte str[4];
char strTemp[10];
byte temp;
temp = ReadDs18B20(); //读取温度数据
str[0] = temp/10+48;
str[1] = temp%10+48;
str[2] = ’ ';
str[3] = ‘\0’;
HalUARTWrite(0, “TEMP:”, 5); //终端通过串口输出提示信息
HalUARTWrite(0, str, 4);
HalUARTWrite(0, “\n”,1);
osal_memcpy(strTemp, “TEMP:”, 5);
osal_memcpy(&strTemp[5], str, 5);
HalLcdWriteString(strTemp, HAL_LCD_LINE_3); //LCD显示
Color =BLUE;
LCD_write_CN_string(63,50,“℃”);//LCD显示
//把温度数据无线发给协调器
if ( AF_DataRequest( &SampleApp_P2P_DstAddr, &SampleApp_epDesc,
SAMPLEAPP_P2P_CLUSTERID,
2,
str,
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
}
}
协调器
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
char strTemp1[10],strTemp2[10],strTemp3[10];
uint16 flashTime;
switch ( pkt->clusterId )
{
case SAMPLEAPP_P2P_CLUSTERID: //协调器收到数据通过串口或屏输出
osal_memset(strTemp1,0,10);
osal_memcpy(strTemp1,“TEMP1:”,5);
osal_memcpy(&strTemp1[5],pkt->cmd.Data,pkt->cmd.DataLength);
HalLcdWriteString(strTemp1,HAL_LCD_LINE_3);
Color =BLUE;
LCD_write_CN_string(63,50,“℃”);//LCD显示
HalUARTWrite(0, “TEMP1:”, 5); //提示接收到数据
HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength); //输出接收到的数据
HalUARTWrite(0, “\n”, 1); // 回车换行
osal_memset(strTemp2,0,10);
osal_memcpy(strTemp2,“TEMP2:”,5);
osal_memcpy(&strTemp2[5],pkt->cmd.Data,pkt->cmd.DataLength);
HalLcdWriteString(strTemp2,HAL_LCD_LINE_4);
Color =BLUE;
LCD_write_CN_string(63,65,“℃”);//LCD显示
HalUARTWrite(0, “TEMP2:”, 5); //提示接收到数据
HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength); //输出接收到的数据
HalUARTWrite(0, “\n”, 1); // 回车换行
osal_memset(strTemp3,0,10);
osal_memcpy(strTemp3,“TEMP3:”,5);
osal_memcpy(&strTemp3[5],pkt->cmd.Data,pkt->cmd.DataLength);
HalLcdWriteString(strTemp3,HAL_LCD_LINE_5);
Color =BLUE;
LCD_write_CN_string(63,80,“℃”);//LCD显示
HalUARTWrite(0, “TEMP3:”, 5); //提示接收到数据
HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength); //输出接收到的数据
HalUARTWrite(0, “\n”, 1); // 回车换行
break;
case SAMPLEAPP_PERIODIC_CLUSTERID:
break;
case SAMPLEAPP_FLASH_CLUSTERID:
flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
break;
}
}
用这个程序,终端能测温也能发送给协调器,但是协调器上显示的是同一个温度跳着显示。
后来又参考了DHT11的多终端实验的程序,加了个编号,将程序改成了
终端
void SampleApp_Send_P2P_Message( void )
{
char temp[3], strTemp[7], strBuf[20];
ReadDs18B20(); //获取温度
//将温湿度的转换成字符串,供LCD显示
temp[0] = wendu_shi+0x30;
temp[1] = wendu_ge+0x30;
temp[2] = ‘\0’;
//将数据整合后方便发给协调器显示d
sprintf(strBuf,"%s%s", DeviceId, temp);
//输出到LCD显示
if(InitFlag == 0)//不变的数据只显示一次提高效率
{
InitFlag = 1;
Color = BLACK;
Color_BK = WHITE; //背景色
LCD_write_CN_string(7, 30, "终端一");
LCD_write_CN_string(7, 56, "温度:");
LCD_write_CN_string(64, 56, "℃");
}
Color = RED;
HalLcdWriteEnString( 49, 56, temp );
//把温度数据无线发给协调器
if ( AF_DataRequest( &SampleApp_P2P_DstAddr, &SampleApp_epDesc,
SAMPLEAPP_P2P_CLUSTERID,
8,
(uint8 *)strBuf,
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
}
}
协调器
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
uint8 strBuf[20],strTemp[3];
uint16 flashTime;
switch ( pkt->clusterId )
{
case SAMPLEAPP_P2P_CLUSTERID: //协调器收到数据通过串口或屏输出
osal_memcpy(strBuf, pkt->cmd.Data, pkt->cmd.DataLength);
Color = BLACK;
LCD_write_CN_string(16, 22,"设备");
LCD_write_CN_string(58, 22,"温度");
Color = BLACK;
LCD_write_CN_string(7, 40,"终端一");
LCD_write_CN_string(73, 40, "℃");
Color = BLUE;
LCD_write_CN_string(7, 57,"终端二");
Color = BLACK;
LCD_write_CN_string(73, 57, "℃");
Color = BLACK;
LCD_write_CN_string(7, 74,"终端三");
LCD_write_CN_string(73, 74, "℃");
strTemp[0] = strBuf[3];
strTemp[1] = strBuf[4];
strTemp[2] = 0;
Color = BLUE;
if(strBuf[0] == 'R' || strBuf[0] == 'r')
{
//LCD_write_EN_string(57, 40, strTemp);
}
else if(strBuf[0] == 'E' || strBuf[0] == 'e')
{
LCD_write_EN_string(57, 23+(strBuf[1]-0x30)*17, strTemp);
}
HalUARTWrite(0, "C:", 2); //提示接收到数据
HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength); //输出接收到的数据
HalUARTWrite(0, "\n", 1); // 回车换行
break;
case SAMPLEAPP_PERIODIC_CLUSTERID:
break;
case SAMPLEAPP_FLASH_CLUSTERID:
flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
break;
}
}
这样虽然能显示了,但温度测不出来了。这个4明显不对,也不会变化。