ZigBee技术的使用
上一篇文章介绍了上位机服务器环境的搭建,这一篇重点在于下位机的使用,并不涉及Linux内容。本次硬件使用的是TI公司的CC2530,软件用IAR开发编程并且涉及到了TI开发的ZigBee协议栈Z-Stack的使用。
一、ZigBee相关知识
具体操作之前,简单了解一下协议栈的架构。在Z-Stack使用过程中程序的编写一般都在应用层App目录下的SampleApp.c中。
此外,在ZigBee网络中,每个ZigBee节点按功能的强弱划分为:全功能设备FFD和精简功能设备RFD,RFD节点为网络中存在数最多的端设备,而FFD节点可以担任路由器或是协调器的角色。
本次设计会用到一个协调器和两个终端,做到多点数据的采集。
二、具体操作
1. 串口配置
因为考虑到上位机和协调器之间的串口通信,需要先配置串口信息。在硬件层(HAL)的Target\CC2530EB\Drivers目录下的hal_uart.c文件中,包含了串口驱动程序的各种接口函数,只需要调用相应的函数就可以实现串口通信的功能,而对于串口的初始化函数需要在串口、监控测试层(MT)中查看,此目录下的MT_UART.c文件中,找到MT_UartInit()串口初始化函数,其中又关于波特率BaudRate的描述:
uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE;
右键找到定义,将默认波特率大小改为9600bps:
#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_9600
接着需要将默认开启的串口流控关闭:
#define MT_UART_DEFAULT_OVERFLOW FALSE
最后,根据相关函数在预编译设置里开启所需的串口,其中P1对应串口0。
然后需要在APP目录下的SampleApp.c文件中的SampleApp_Init()函数里加入:
MT_UartInit(); //串口初始化
MT_UartRegisterTaskID(task_id); //注册串口任务
之后使用HalUARTWrite()函数完成串口信息的写入。
2. DHT11温湿度数据收发
将事先编写好的DHT11的头文件和c文件加入App目录下,之后在SampleApp.c文件中的SampleApp_Init()函数里加入:
P0SEL &= 0x7f; //P0_7配置成通用io
P0DIR |= 0x02; //让P0.1为为输出
以及在SampleApp_SendPeriodicMessage()函数里编写所需的内容,这里加入了当湿度大于60%时开启风扇的功能。
byte temp[5],humi[6];
char dispT[20],dispH[20];
Delay_ms(500);
DHT11(); //获取温湿度
Delay_ms(500);
//将温湿度的转换成字符串
temp[0] = wendu_shi+0x30;
temp[1] = wendu_ge+0x30;
temp[2] = ' ';
temp[3] = 'C';
temp[4] = '\0';
humi[0] = shidu_shi+0x30;
humi[1] = shidu_ge+0x30;
humi[2] = ' ';
humi[3] = 'R';
humi[4] = 'H';
humi[5] = '\0';
if((shidu_ge>0)&(shidu_shi>5))
{
P0_1=1; //开启电机
}
else{
P0_1=0;
}
osal_memcpy(dispT, "Temperature:", 12);
osal_memcpy(&dispT[12], temp, 5);
HalLcdWriteString(dispT, HAL_LCD_LINE_3); // LCD第三行显示
osal_memcpy(dispH, "Humidity:", 9);
osal_memcpy(&dispH[9], humi, 6);
HalLcdWriteString(dispH, HAL_LCD_LINE_4); // LCD第四行显示
//仅发送湿度的两位数据
if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
SAMPLEAPP_PERIODIC_CLUSTERID,
2,
humi,
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
}
这样就完成了终端的温湿度数据的LCD显示并且能够发送湿度数据,接下来配置协调器。同样在SampleApp.c文件中,找到SampleApp_MessageMSGCB()函数,修改为:
uint16 flashTime;
switch ( pkt->clusterId )