Linux开发项目(四)

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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值