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. 异常小结:上一张图搞清楚Java的异常机制

    下面是Java异常类的组织结构,红色区域的异常类表示是程序需要显示捕捉或者抛出的. Throwable Throwable是Java异常的顶级类,所有的异常都继承于这个类. Error,Excepti ...

  2. ubuntu下如何编译C语言

    ubuntu下如何编译C语言     如果没有gcc编译器的话,使用以下命令获取 ~# sudo apt-get install gcc同时要下载辅助工具 ~# sudo apt-get instal ...

  3. python——mysql京东数据库设计案例(源码)

    # 显示界面信息# 循环界面信息# 根据用户输入数据来做相应的选择from pymysql import connect def jingdong_info(): '''#显示界面信息''' prin ...

  4. Eciplce ALT+/失效的解决方法

    最近公司电脑上的Eclipse没有了自动提示功能,也不是全部不提示,大多数情况下按下“alt+/”键还会产生提示,但是当我在java项目中邪main方法和syso的时候,“alt+/”则会失效,今天在 ...

  5. Python - 去除list中的空字符

    list1 = ['122', '2333', '3444', '', '', None] a = list(filter(None, list1)) # 只能过滤空字符和None print(a) ...

  6. cuda by example【读书笔记1】

    cuda 1. 以前用OpenGL和DirectX API简介操作GPU,必须了解图形学的知识,直接操作GPU要考虑并发,原子操作等等,cuda架构为此专门设计.满足浮点运算,用裁剪后的指令集执行通用 ...

  7. 【UOJ244】【UER #7】短路

    题解: 感觉贪心水平有所提高.. 首先比较显然的事情是我们可以枚举最深进行到哪一层 我们会发现,当且仅当该层是最小值才会使用决策, 并且是从该层的左上,走到右下 另外中间步骤就是(好难描述啊)一个单调 ...

  8. alpha冲刺5/10

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:冲刺5 团队部分 后敬甲(组长) 过去两天完成了哪些任务 文字描述 最近事情有点多,只是跟进了下进度,写了写博客 接下来 ...

  9. Android SDK离线安装更新方法

    直接使用Android SDK Manager进行下载.更新速度很慢,有时候会出现错误.网上查找了不少网友的方法,做个总结. 1.启动Android SDK Manager,并等待reposity加载 ...

  10. 用ArcMap打开MXD文件报One or more layers failed to draw错误!

    错误信息: One or more layers failed to draw: FDO error: 0General function failure [PW_X]参数不足,期待是 1. 原因: ...