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

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

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

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

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

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

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

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

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

   // Received whenever the device changes state in the network
case ZDO_STATE_CHANGE:
SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
if ( (SampleApp_NwkState == DEV_ZB_COORD)
|| (SampleApp_NwkState == DEV_ROUTER)
|| (SampleApp_NwkState == DEV_END_DEVICE) )
{
initial_lcd();
clear_screen();
HalLcdWriteString( "DS18B20 Test ", HAL_LCD_LINE_1 );
// full_display();
// Start sending the periodic message in a regular interval.
if(SampleApp_NwkState != DEV_ZB_COORD)
{
osal_start_timerEx( SampleApp_TaskID,
SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
}
}
else
{
// Device is no longer in the network
}
break;

 

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

  // Send a message out - This event is generated by a timer
// (setup in SampleApp_Init()).
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
{
// Send the periodic message
SampleApp_SendPeriodicMessage(); // Setup to send message again in normal period (+ a little jitter)
osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) ); // return unprocessed events
return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
}

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

/*********************************************************************
* @fn SampleApp_SendPeriodicMessage
*
* @brief Send the periodic message.
*
* @param none
*
* @return none
*/
void SampleApp_SendPeriodicMessage( void )
{
uint8 SensorBuf[2];
SensorBuf[0]=Read_Temperature()/10+0x30;
SensorBuf[1]=Read_Temperature()%10+0x30; HalLcdWriteString( SensorBuf, HAL_LCD_LINE_2 );
//HalUARTWrite(0,&SensorBuf[1],i);
// HalUARTWrite(SERIAL_APP_PORT,&SensorBuf[0],i);
if ( AF_DataRequest( &SampleApp_Periodic_DstAddr,
&SampleApp_epDesc,
SAMPLEAPP_FLASH_CLUSTERID,
2,
&SensorBuf[0],
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
//Successfully requested to be sent
}
else
{
// Error occurred in request to send.
}
}

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

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

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

if ( AF_DataRequest( &SampleApp_Periodic_DstAddr,
&SampleApp_epDesc,
SAMPLEAPP_FLASH_CLUSTERID,
2,
&SensorBuf[0],
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
//Successfully requested to be sent
}
else
{
// Error occurred in request to send.
}

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

/*********************************************************************
* @fn SampleApp_MessageMSGCB
*
* @brief Data message processor callback. This function processes
* any incoming data - probably from other devices. So, based
* on cluster ID, perform the intended action.
*
* @param none
*
* @return none
*/
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
uint16 flashTime;
uint8 buffer[2];
switch ( pkt->clusterId )
{
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) );
buffer[0]=pkt->cmd.Data[0];
buffer[1]=pkt->cmd.Data[1];
HalLcdWriteString( buffer, HAL_LCD_LINE_2 );
break;
}
}

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

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

  

 

基于CC2530/CC2430 的温度采集系统--DS18B20的更多相关文章

  1. 基于CC2530/CC2430 的光强采集系统--ADC实验

    使用光敏电阻,程序通用所有模拟量传感器 参见论坛中实例视频讲解http://bphero.com.cn/forum.php?mod=viewthread&tid=15&extra=pa ...

  2. 基于CC2530/CC2430 的温湿度采集系统--DHT11

    采用常用的温湿度传感器DHT11 参见论坛中实例视频讲解http://bphero.com.cn/forum.php?mod=viewthread&tid=15&extra=page% ...

  3. 基于 CC2530 的温度采集系统(未定稿)

    前言 最近在自学 Zigbee,每天的主要是任务是:看博客,看 CC2530 的 datasheet 和实践,熟悉片上的 SFR 以及控制板子. 学和做内容包括:IO.外部中断.Timer1/3/4. ...

  4. 基于AXI VDMA的图像采集系统

    基于AXI VDMA的图像采集系统 转载 2017年04月18日 17:26:43 标签: framebuffer / AXIS / AXI VDMA 2494 本课程将对Xilinx提供的一款IP核 ...

  5. 基于ARM-LINUX的温度传感器驱动-DS18B20

    转载:http://blog.csdn.net/ayangke/article/details/6883244 作者:冯建,华清远见嵌入式学院讲师. DS18B20数字温度传感器接线方便,封装成后可应 ...

  6. 基于CC2530的ZigBee转以太网网关的设计与实现

    *已刊登至:<无线电>8月刊 物联网技术的实现中,无线技术是必不可少的部分. 近年无线技术的发展,将ZigBee推入人们的视线中.那么ZigBee是如何的一种技术呢?带着疑问.我查询了它的 ...

  7. 单片机温度控制系统DS18B20

    单片机温度控制系统核心 由895X系列单片机来控制来驱动18b20温度传感器模块,通过编写C语言代码,来实现对模块的控制驱动,不断的接收读取18b20传过来的温度信号.将传过来的高低位字节经过个人代码 ...

  8. 基于SDRAM的视频图像采集系统

    本文是在前面设计好的简易SDRAM控制器的基础上完善,逐步实现使用SDRAM存储视频流数据,实现视频图像采集系统,CMOS使用的是OV7725. SDRAM控制器的完善 1. 修改SDRAM的时钟到1 ...

  9. 基于单片机的Wifi温度湿度测量仪

    这次的制作背景是由于单片机课程实训课程要求 刚好手上有块ESP8266-12F的WiFi模块 于是就选择了制作一个基于单片机,使用WiFi传输数据的温湿度采集测量仪 制作过程: 由于有使用过WiFi模 ...

随机推荐

  1. Python函数之递归函数

    递归函数的定义:在这个函数里再调用这个函数本身 最大递归深度默认是997或者998,python从内存角度做的限制 优点:代码变简单 缺点:占内存 一:推导年龄 问a的值是多少: a 比 b 小2,b ...

  2. python指定分隔符来分割文件

    1 import re 2 p = re.compile('AAAAAAAA',re.S) 3 f = open(r"D:\test\oldfile.txt","r&qu ...

  3. SQL Server索引维护

    索引维护的两个重要方面是索引碎片和统计信息. 一:索引碎片 降低碎片的产生,当索引上的页不在具有物理连续性时,就会产生碎片,下面的情景会产生碎片: INSERT操作.UPDATE操作.DBCC SHR ...

  4. Go之viper配置

    这个模块功能强大,读取配置,命令行,监听配置改变. 堪称多面手,在k8s,docker中,都多有应用. 这套应用,主要包括cobra,pflag,viper三件套. 了解得差不多啦...:) pack ...

  5. [转] Lodash

    与underscore 类似 , 是1个js库,内部封装了诸多对字符串.数组.对象等常见数据类型的处理函数. 模块组成 Lodash 提供的辅助函数主要分为以下几类,函数列表和用法实例请查看 Loda ...

  6. linux 软中断过高性能优化案例

    案例如下: 发现cpu0上的软中断高达50%

  7. Codeforces 342D Xenia and Dominoes 状压dp

    码就完事了. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define ...

  8. js 时间动画优化

    function moveDivTimeBasedImprove(div, fps) { var left = 0; var current = +new Date; var previous = + ...

  9. BZOJ4589 Hard Nim FWT 快速幂 博弈

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4589.html 题目传送门 - BZOJ4589 题意 有 $n$ 堆石子,每一堆石子的取值为 $2$ ...

  10. HDU6031 Innumerable Ancestors 倍增 - 题意详细概括 - 算法详解

    去博客园看该题解 题目 查看原题 - HDU6031 Innumerable Ancestors 题目描述 有一棵有n个节点的有根树,根节点为1,其深度为1,现在有m个询问,每次询问给出两个集合A和B ...