基于ZigBee的无线温度监测与控制器设计

   本文所设计的无线温度监测与控制器主要实现了对环境温度的实时监测和控制。该系统基于Zigbee的无线通信技术,主要分为三部分,分别是网络协调器、终端节点和上位机。终端节点上有温度监测模块和控制模块,用来获取数据和发送数据,协调器通过USB串口与PC连接,用来获取终端数据和上传数据至PC,同时可以下发数据至终端控制模块,上位机主要实现实时温度显示的功能。

通过实际测试,本文设计的无线温度监测与控制器能够实现温度的实时监测功能,同时当温度高于设定值时,能够自动开启风扇,从而达到控制终端节点所在位置的环境温度。

基于IAR的下位机软件设计
(1)网络初始化
在协议栈安装目录 \Projects \z—stack Samples下寻找命名为*.eww的工程文件。协议栈应用工程打开后如图1-1所示。在协议栈目录中分为三部分进行网络初始化,分别是确定网络协调器、进行信道扫描和配置网络参数如图1-2所示。
图1-1 IAR开发环境Z-Stack工程(https://img-blog.csdnimg.cn/20190424172619421.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzQ2MjQ1NQ==,size_16,color_FFFFFF,t_70)
图1-2 网络初始化框图(https://img-blog.csdnimg.cn/20190424172502944.PNG)
(2)节点加入网络
为了建立连接,FFD节点需要向协调器提出请求,协调器接收到节点的连接请求后根据情况决定是否允许其连接,然后对请求连接的节点做出响应,节点与协调器建立连接后,才能实现数据的收发如图1-3所示。
图1-3节点入网框图(https://img-blog.csdnimg.cn/20190424172737394.PNG)
(3)整个系统启动初始化的内容主要有初始化时钟和电压、初始化各硬件模块、初始化 FLASH存储、初始化非易失量(NV)、初始化MAC硬件地址、初始化操作系统、初始化堆栈、初始化各层协议等。

主代码如下

#ifndef NONWK
#include “AF.h”
#endif
#include “hal_adc.h”
#include “hal_flash.h”
#include “hal_lcd.h”
#include “hal_led.h”
#include “hal_drivers.h”
#include “OnBoard.h”
#include “OSAL.h”
#include “OSAL_Nv.h”
#include “ZComDef.h”
#include “ZMAC.h”

/*********************************************************************

  • LOCAL FUNCTIONS
    */

static void zmain_ext_addr( void );
#if defined ZCL_KEY_ESTABLISH
static void zmain_cert_init( void );
#endif
static void zmain_dev_info( void );
static void zmain_vdd_check( void );

#ifdef LCD_SUPPORTED
static void zmain_lcd_init( void );
#endif

extern uint8 AppTitle[]; //应用程序名称

/*********************************************************************

  • @fn main
  • @brief First function called after startup.
  • @return don’t care
    */
    int main( void )
    {
    // Turn off interrupts
    osal_int_disable( INTS_ALL );

// Initialization for board related stuff such as LEDs
HAL_BOARD_INIT();

// Make sure supply voltage is high enough to run
zmain_vdd_check();

// Initialize board I/O
InitBoard( OB_COLD );

// Initialze HAL drivers
HalDriverInit();

// Initialize NV System
osal_nv_init( NULL );

// Initialize the MAC
ZMacInit();

// Determine the extended address
zmain_ext_addr();

#if defined ZCL_KEY_ESTABLISH
// Initialize the Certicom certificate information.
zmain_cert_init();
#endif

// Initialize basic NV items
zgInit();

#ifndef NONWK
// Since the AF isn’t a task, call it’s initialization routine
afInit();
#endif

// Initialize the operating system
osal_init_system();

// Allow interrupts
osal_int_enable( INTS_ALL );

// Final board initialization
InitBoard( OB_READY );

// Display information about this device
zmain_dev_info();

/* Display the device info on the LCD */
#ifdef LCD_SUPPORTED
zmain_lcd_init();
#endif

#ifdef WDT_IN_PM1
/* If WDT is used, this is a good place to enable it. */
WatchDogEnable( WDTIMX );
#endif

osal_start_system(); // No Return from here

return 0; // Shouldn’t get here.
} // main()

/*********************************************************************

  • @fn zmain_vdd_check
  • @brief Check if the Vdd is OK to run the processor.
  • @return Return if Vdd is ok; otherwise, flash LED, then reset
    *********************************************************************/
    static void zmain_vdd_check( void )
    {
    uint8 cnt = 16;

do {
while (!HalAdcCheckVdd(VDD_MIN_RUN));
} while (–cnt);
}

/**************************************************************************************************

  • @fn zmain_ext_addr
  • @brief Execute a prioritized search for a valid extended address and write the results
  •          into the OSAL NV system for use by the system. Temporary address not saved to NV.
    
  • input parameters
  • None.
  • output parameters
  • None.
  • @return None.

*/
static void zmain_ext_addr(void)
{
uint8 nullAddr[Z_EXTADDR_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
uint8 writeNV = TRUE;

// First check whether a non-erased extended address exists in the OSAL NV.
if ((SUCCESS != osal_nv_item_init(ZCD_NV_EXTADDR, Z_EXTADDR_LEN, NULL)) ||
(SUCCESS != osal_nv_read(ZCD_NV_EXTADDR, 0, Z_EXTADDR_LEN, aExtendedAddress)) ||
(osal_memcmp(aExtendedAddress, nullAddr, Z_EXTADDR_LEN)))
{
// Attempt to read the extended address from the location on the lock bits page
// where the programming tools know to reserve it.
HalFlashRead(HAL_FLASH_IEEE_PAGE, HAL_FLASH_IEEE_OSET, aExtendedAddress, Z_EXTADDR_LEN);

if (osal_memcmp(aExtendedAddress, nullAddr, Z_EXTADDR_LEN))
{// Attempt to read the extended address from the designated location in the Info Page.if (!osal_memcmp((uint8 *)(P_INFOPAGE+HAL_INFOP_IEEE_OSET), nullAddr, Z_EXTADDR_LEN)){osal_memcpy(aExtendedAddress, (uint8 *)(P_INFOPAGE+HAL_INFOP_IEEE_OSET), Z_EXTADDR_LEN);}else  // No valid extended address was found.{uint8 idx;

#if !defined ( NV_RESTORE )
writeNV = FALSE; // Make this a temporary IEEE address
#endif

    /* Attempt to create a sufficiently random extended address for expediency.* Note: this is only valid/legal in a test environment and*       must never be used for a commercial product.*/for (idx = 0; idx < (Z_EXTADDR_LEN - 2);){uint16 randy = osal_rand();aExtendedAddress[idx++] = LO_UINT16(randy);aExtendedAddress[idx++] = HI_UINT16(randy);}// Next-to-MSB identifies ZigBee devicetype.

#if ZG_BUILD_COORDINATOR_TYPE && !ZG_BUILD_JOINING_TYPE
aExtendedAddress[idx++] = 0x10;
#elif ZG_BUILD_RTRONLY_TYPE
aExtendedAddress[idx++] = 0x20;
#else
aExtendedAddress[idx++] = 0x30;
#endif
// MSB has historical signficance.
aExtendedAddress[idx] = 0xF8;
}
}

if (writeNV)
{(void)osal_nv_write(ZCD_NV_EXTADDR, 0, Z_EXTADDR_LEN, aExtendedAddress);
}

}

// Set the MAC PIB extended address according to results from above.
(void)ZMacSetReq(MAC_EXTENDED_ADDRESS, aExtendedAddress);
}

#if defined ZCL_KEY_ESTABLISH
/**************************************************************************************************

  • @fn zmain_cert_init
  • @brief Initialize the Certicom certificate information.
  • input parameters
  • None.
  • output parameters
  • None.
  • @return None.

*/
static void zmain_cert_init(void)
{
uint8 certData[ZCL_KE_IMPLICIT_CERTIFICATE_LEN];
uint8 nullData[ZCL_KE_IMPLICIT_CERTIFICATE_LEN] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};

(void)osal_nv_item_init(ZCD_NV_IMPLICIT_CERTIFICATE, ZCL_KE_IMPLICIT_CERTIFICATE_LEN, NULL);
(void)osal_nv_item_init(ZCD_NV_DEVICE_PRIVATE_KEY, ZCL_KE_DEVICE_PRIVATE_KEY_LEN, NULL);

// First check whether non-null certificate data exists in the OSAL NV. To save on code space,
// just use the ZCD_NV_CA_PUBLIC_KEY as the bellwether for all three.
if ((SUCCESS != osal_nv_item_init(ZCD_NV_CA_PUBLIC_KEY, ZCL_KE_CA_PUBLIC_KEY_LEN, NULL)) ||
(SUCCESS != osal_nv_read(ZCD_NV_CA_PUBLIC_KEY, 0, ZCL_KE_CA_PUBLIC_KEY_LEN, certData)) ||
(osal_memcmp(certData, nullData, ZCL_KE_CA_PUBLIC_KEY_LEN)))
{
// Attempt to read the certificate data from its corresponding location on the lock bits page.
HalFlashRead(HAL_FLASH_IEEE_PAGE, HAL_FLASH_CA_PUBLIC_KEY_OSET, certData,
ZCL_KE_CA_PUBLIC_KEY_LEN);
// If the certificate data is not NULL, use it to update the corresponding NV items.
if (!osal_memcmp(certData, nullData, ZCL_KE_CA_PUBLIC_KEY_LEN))
{
(void)osal_nv_write(ZCD_NV_CA_PUBLIC_KEY, 0, ZCL_KE_CA_PUBLIC_KEY_LEN, certData);
HalFlashRead(HAL_FLASH_IEEE_PAGE, HAL_FLASH_IMPLICIT_CERT_OSET, certData,
ZCL_KE_IMPLICIT_CERTIFICATE_LEN);
(void)osal_nv_write(ZCD_NV_IMPLICIT_CERTIFICATE, 0,
ZCL_KE_IMPLICIT_CERTIFICATE_LEN, certData);
HalFlashRead(HAL_FLASH_IEEE_PAGE, HAL_FLASH_DEV_PRIVATE_KEY_OSET, certData,
ZCL_KE_DEVICE_PRIVATE_KEY_LEN);
(void)osal_nv_write(ZCD_NV_DEVICE_PRIVATE_KEY, 0, ZCL_KE_DEVICE_PRIVATE_KEY_LEN, certData);
}
}
}
#endif

/**************************************************************************************************

  • @fn zmain_dev_info
  • @brief This displays the IEEE (MSB to LSB) on the LCD.
  • input parameters
  • None.
  • output parameters
  • None.
  • @return None.

*/
static void zmain_dev_info(void)
{
#ifdef LCD_SUPPORTED
uint8 i;
uint8 xad;
uint8 lcd_buf[Z_EXTADDR_LEN
2+1];

// Display the extended address.
xad = aExtendedAddress + Z_EXTADDR_LEN - 1;

for (i = 0; i < Z_EXTADDR_LEN*2; xad–)
{
uint8 ch;
ch = (*xad >> 4) & 0x0F;
lcd_buf[i++] = ch + (( ch < 10 ) ? ‘0’ : ‘7’);
ch = xad & 0x0F;
lcd_buf[i++] = ch + (( ch < 10 ) ? ‘0’ : ‘7’);
}
lcd_buf[Z_EXTADDR_LEN
2] = ‘\0’;

//DrawRectFill(0 ,0 ,128,128,GREEN);//背景色
DrawRectFill(3 ,20 ,122,106,WHITE); //显示窗口

Color = BLACK; //前景色
Color_BK = GREEN; //背景色
LCD_write_EN_string(64-7*osal_strlen((char *)AppTitle)/2,3,AppTitle); //显示标题

Color = BLACK; //前景色
Color_BK = WHITE; //背景色
HalLcdWriteString( "IEEE: ", HAL_LCD_LINE_3 );
Color = BLUE;
HalLcdWriteString( (char*)lcd_buf, HAL_LCD_LINE_4 );

Color = RED;
LCD_write_CN_string(9, 95, “西安工程大学”);
Color = BLACK;
LCD_write_CN_string(9, 110, “厚德弘毅”);
Color = MAGENTA;
LCD_write_CN_string(63,110, “博学笃行”);
#endif

基于ZigBee的无线温度监测与控制器设计相关推荐

  1. 基于ZigBee的桥梁健康监测系统

    0 引言 桥梁在几十年.甚至上百年的使用过程中,结构长期承受交通荷载的作用,严酷自然环境的侵蚀,自然灾害和人为因素等的祸合作用,不可避免地导致桥梁结构出现各种损伤现象,抗力衰减,使得结构承受力与安全性 ...

  2. 基于NRF905的无线温度采集系统

    基于NRF905的无线温度采集系统 2016-07-30  花花雪  跟单片机谈恋爱 目录 引言 1理论 1.1NRF905相关理论 1.2系统原理图 2实践 2.1连接图 2.2程序 ~~~~~~~ ...

  3. 基于LORA SX1278的温度监控控制系统开发设计-硬件方案设计

    本文的目的是设计一款基于lora无线通信的温度温度采集或者接收终端.首先进行硬件部分设计,完成的结果如下图: 结构分解: 为什么要用LORA,LORA的优势和缺点是什么: LORA是semtech公司 ...

  4. 基于GPIB总线的无线电频谱监测系统的设计delphi多线程超时控

    随着通信技术的发展,无线电资源作为公共资源的一种,需要国家有关部门对其进行有效的分配和.设计界面友好.运行稳定.实时反应迅速的监测软件是对无线电资源进行有效配置的重要环节,也是国家和信息安全保障的重要 ...

  5. 水质检测c语言程序,基于51单片机的水质监测系统的设计.doc

    基于51单片机的水质监测系统的设计 基于AT89C51单片机的水质监测系统的设计 摘要:现在水源污染已经成了社会密切关注的话题,所以对水质进行监测成了保护水资源的一项重要措施,基于此本文设计了一款能够 ...

  6. 基于AT89C52单片机的无线温度监测设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87848530?spm=1001.20 ...

  7. ZigBee网络数据传递流程_基于ZigBee—WSN的温湿度监测系统

    摘要:针对环境监测系统布线复杂.数据的实时性和准确性低等问题,提出了一种基于ZigBee技术的分布式传感器网络平台.选用SHT75传感器实现对监测点温湿度信息的精准采集,并通过由CC2530芯片和CC ...

  8. 基于ZigBee 的多点温度采集系统设计与实现

    摘要:针对广阔空间环境温度采集系统对功耗及成本的要求,设计了基于无线传感网络技术的多点温度采集系统.以CC2430 为主控芯片,选用DS18B20 作为温度采集节点的传感器,基于ZigBee 协议栈构 ...

  9. (单片机原理与应用)智能温度监测系统(设计)

    中文摘要 智能温度检测系统是通过硬件电路设计和软件编程驱动的结合方式,实现0℃-99℃范围内的温度智能监测.可通过LCD实时显示实际温度和预设温度,当温度超出预设范围时及时报警,而且报警声用电子乐曲或 ...

最新文章

  1. c语言的求素数算法,C语言求素数的算法
  2. oracle定时器在项目中的应用
  3. A. 树与路径(树论/多项式/分治FFT)
  4. Android Toolbar样式定制详解
  5. SpringMVC 视图解析器及拦截器
  6. c++利用初始化列表在类内部和类外部定义构造函数的区别
  7. bzoj2751 [HAOI2012]容易题(easy)
  8. Maven : Maven和jenkins报错 ClassNotFoundException : org.slf4j.Logger
  9. GNOME API 参考
  10. HALCON 20.11:深度学习笔记(5)---设置超参数
  11. 【面向对象设计基础】抽象类
  12. 【分布式WebSocket - 1】超详细!WebSocket协议详解
  13. 使用ICallbackEventHandler实现无刷新回调
  14. 老九学堂【C++】保留字[关键字]
  15. install falled update incompatible
  16. 计算机开机慢的原因及解决方法,电脑开机速度慢怎么解决?Win10电脑开机速度变慢的原因及解决方法(2)...
  17. 微信刷脸支付设备奖励计算延长一整年!
  18. 程序员的蜕变之旅-健身
  19. Servlet 的运行原理
  20. Linux 创建用户和添加操作权限

热门文章

  1. windows11升级后,Edge浏览器无法打开
  2. Arduino uno基础教程
  3. html为什么时间显示出不来,HTML怎么显示时间
  4. java计算机毕业设计贫困助学管理系统源码+数据库+系统+lw文档+mybatis+运行部署
  5. 中南民族大学软工算法考试
  6. Java操作excel转pdf工具类
  7. css怎么使用其他的中文字体,CSS如何让中文跟英文使用不同字体
  8. 联合办公空间是什么,跟传统办公室有什么区别
  9. [转]机器学习科普文章:“一文读懂机器学习,大数据/自然语言处理/算法全有了”
  10. 中国长超细纤维市场趋势报告、技术动态创新及市场预测