DS18B20是常用的温度传感器。CC2530 采集DS18B20 可以实现温度采集系统等等。

模块链接:https://item.taobao.com/item.htm?id=541308617329

代码使用Zstack 的sample 工程作为基本框架。

主要实现内容:一个节点采集DS18B20并发送到另一个节点,并在节点连接的LCD上显示温度信息。

  节点数量:2个(可扩展)

  数据传输: 终端节点到协调器节点

  显示方式:LCD(可扩展串口显示)

 

 

 A: 终端节点采集DS18B20 主要代码分析:

直接在应用层初始化函数中添加如下代码

  1. // Received whenever the device changes state in the network
  2. case ZDO_STATE_CHANGE:
  3. SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
  4. if ( (SampleApp_NwkState == DEV_ZB_COORD)
  5. || (SampleApp_NwkState == DEV_ROUTER)
  6. || (SampleApp_NwkState == DEV_END_DEVICE) )
  7. {
  8. initial_lcd();
  9. clear_screen();
  10. HalLcdWriteString( "DS18B20 Test ", HAL_LCD_LINE_1 );
  11. // full_display();
  12. // Start sending the periodic message in a regular interval.
  13. if(SampleApp_NwkState != DEV_ZB_COORD)
  14. {
  15. osal_start_timerEx( SampleApp_TaskID,
  16. SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
  17. SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
  18. }
  19. }
  20. else
  21. {
  22. // Device is no longer in the network
  23. }
  24. break;

 

当设备启动成功后会初始化液晶,并在液晶上显示“DS18B20”,然后根据设备类型,当设备不是协调器(路由器和终端节点都可以采集数据)定时触发事件SAMPLEAPP_SEND_PERIODIC_MSG_EVT。

 

  1. // Send a message out - This event is generated by a timer
  2. // (setup in SampleApp_Init()).
  3. if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
  4. {
  5. // Send the periodic message
  6. SampleApp_SendPeriodicMessage();
  7.  
  8. // Setup to send message again in normal period (+ a little jitter)
  9. osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
  10. (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );
  11.  
  12. // return unprocessed events
  13. return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
  14. }

SAMPLEAPP_SEND_PERIODIC_MSG_EVT 事件的处理函数,我们可以看到调用了函数SampleApp_SendPeriodicMessage(),这个函数主要是采集DS18B20,并将数据发送到协调器节点。 然后再次调用定时器触发SAMPLEAPP_SEND_PERIODIC_MSG_EVT 事件,形成周期性不停的采集发送-采集发送。

  1. /*********************************************************************
  2. * @fn SampleApp_SendPeriodicMessage
  3. *
  4. * @brief Send the periodic message.
  5. *
  6. * @param none
  7. *
  8. * @return none
  9. */
  10. void SampleApp_SendPeriodicMessage( void )
  11. {
  12. uint8 SensorBuf[2];
  13. SensorBuf[0]=Read_Temperature()/10+0x30;
  14. SensorBuf[1]=Read_Temperature()%10+0x30;
  15. HalLcdWriteString( SensorBuf, HAL_LCD_LINE_2 );
  16. //HalUARTWrite(0,&SensorBuf[1],i);
  17. // HalUARTWrite(SERIAL_APP_PORT,&SensorBuf[0],i);
  18. if ( AF_DataRequest( &SampleApp_Periodic_DstAddr,
  19. &SampleApp_epDesc,
  20. SAMPLEAPP_FLASH_CLUSTERID,
  21. 2,
  22. &SensorBuf[0],
  23. &SampleApp_TransID,
  24. AF_DISCV_ROUTE,
  25. AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  26. {
  27. //Successfully requested to be sent
  28. }
  29. else
  30. {
  31. // Error occurred in request to send.
  32. }
  33. }

在这个函数中使用了Read_tempeature() 读取温度信息,具体DS18B20 处理函数和C51 的一样,主要要注意时序。 上面就是采集节点部分主要代码。

 

 

B 汇集节点,汇集远程节点数据

上面的代码分析到有终端节点发来的数据,我们回顾上面的代码

  1. if ( AF_DataRequest( &SampleApp_Periodic_DstAddr,
  2. &SampleApp_epDesc,
  3. SAMPLEAPP_FLASH_CLUSTERID,
  4. 2,
  5. &SensorBuf[0],
  6. &SampleApp_TransID,
  7. AF_DISCV_ROUTE,
  8. AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  9. {
  10. //Successfully requested to be sent
  11. }
  12. else
  13. {
  14. // Error occurred in request to send.
  15. }

对应的cluster 是  SAMPLEAPP_FLASH_CLUSTERID,那么我们看协调器采集节点的处理函数

  1. /*********************************************************************
  2. * @fn SampleApp_MessageMSGCB
  3. *
  4. * @brief Data message processor callback. This function processes
  5. * any incoming data - probably from other devices. So, based
  6. * on cluster ID, perform the intended action.
  7. *
  8. * @param none
  9. *
  10. * @return none
  11. */
  12. void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
  13. {
  14. uint16 flashTime;
  15. uint8 buffer[2];
  16. switch ( pkt->clusterId )
  17. {
  18. case SAMPLEAPP_PERIODIC_CLUSTERID:
  19. break;
  20.  
  21. case SAMPLEAPP_FLASH_CLUSTERID:
  22. flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
  23. HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
  24. buffer[0]=pkt->cmd.Data[0];
  25. buffer[1]=pkt->cmd.Data[1];
  26. HalLcdWriteString( buffer, HAL_LCD_LINE_2 );
  27. break;
  28. }
  29. }

 

由下面的代码在显示屏的第二行显示温度信息(第一行显示DS18B20 Test,初始化与终端节点使用相同的代码)

  1. buffer[0]=pkt->cmd.Data[0];
  2. buffer[1]=pkt->cmd.Data[1];
  3. HalLcdWriteString( buffer, HAL_LCD_LINE_2 );

  

 

 

版权声明:本文为tuzhuke原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/tuzhuke/p/5948037.html