Zigbee 计量插座

项目介绍

主控:NXP JN5169
计量:采用贝岭计量芯片

功能介绍

既然是zigbee计量插座,要具备zigbee的无线属性,而且有计量的功能。
所以简单地说,要可以接入到网关,网关控制设备开、关。
计量值可以配置 为定时上报,另外手动触发设备开关时,可以自动上报状态到网关。

开发环境:

BeyondStudio for NXP

SDK代码结构:

在官方示例基础上进行修改 基于JN-AN-1217 示例

代码编译基于Makefile,引用外部SDK。安装开发环境时,默认是在系统C盘,目录大概如下:

C:/NXP/bstudio_nxp
configuration
features
jre
msys
p2
plugins
readme
sdk
tools
workspace
bstudio_nxp.exe

上面最重要的是sdk,存放nxp zigbee sdk
workspace 存放我们的工程代码,workspace中工程依赖SDK中代码。该项目采用的是 JN-SW-4170

项目编译

BeyondStudio是基于Eclipse 做的修改,所以操作上类似。
在工程上右键 Clean Project -清理项目 Build Project 编译项目
清理后编译项目比较慢,Java的IDE就这样

项目代码结构

IDE展开视角

JN-AN-1217-Zigbee-3-0-Plug
Includes
Common
JN-SW-4170
Router
	Build
	Source

工程目录视角

Common
Doc
EndDevice
JN516x
NCI
NFC
NTAG
Router

Includes、Common、JN-SW-4170 都是类似于快捷方式,文件组织目录在JN516x下的.project

	<linkedResources>
   	<link>
   		<name>Common</name>
   		<type>2</type>
   		<location>C:/NXP/bstudio_nxp/workspace/JN-AN-1217-Zigbee-3-0-Plug/Common</location>
   	</link>
   	<link>
   		<name>JN-SW-4170</name>
   		<type>2</type>
   		<location>C:/NXP/bstudio_nxp/sdk/JN-SW-4170</location>
   	</link>	
   	<link>
   		<name>Router</name>
   		<type>2</type>
   		<location>C:/NXP/bstudio_nxp/workspace/JN-AN-1217-Zigbee-3-0-Plug/Router</location>
   	</link>
   </linkedResources>
代码解读
  • Makefile
    跟常规Makefile一样,需要关注Source目录,Include目录,编译宏选项

板型选择

ifeq ($(JENNIC_CHIP_FAMILY), JN516x)
JENNIC_SDK              = JN-SW-4170
ZNCLKCMD                = AppBuildZBPro.ld
JENNIC_PCB              = DEVKIT4
ENDIAN 	                = BIG_ENDIAN
endif

生成目标

ifeq ($(TARGET),Router)
 ifeq ($(OTA_ENCRYPTED),0)
  OTA_DEVICE_ID = 0x0101
  OTA_STRING = $(OTA_HW)$(OTA_HW_VARIANT)-$(JENNIC_CHIP)00000000000000
 else
  OTA_DEVICE_ID = 0x1101
  OTA_STRING = $(OTA_HW)$(OTA_HW_VARIANT)-$(JENNIC_CHIP)--ENCRYPTED000
 endif
endif 

编译宏选项

#CFLAGS += -DDEBUG_APP_METERING
CFLAGS += -DDEBUG_APP_SYSTIME
CFLAGS += -DDEBUG_APP
CFLAGS += -DDEBUG_APP_OTA
CFLAGS += -DTRACE_OTA_DEBUG
CFLAGS += -DDEBUG_APP_BDB
CFLAGS += -DDEBUG_APP_EVENT

应用代码路径

APPSRC += pdum_gen.c
APPSRC += pdum_apdu.S
APPSRC += zps_gen.c
APPSRC += app_start.c
APPSRC += app_router_node.c
APPSRC += app_zcl_task.c
APPSRC += app_buttons.c
APPSRC += app_led.c

include 目录

INCFLAGS += -I$(COMPONENTS_BASE_DIR)/ZCL/Include
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/ZCIF/Include
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/Xcv/Include/
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/Recal/Include/
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/MicroSpecific/Include
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/HardwareAPI/Include
  • C code

入口函数:
app_start.c -> vAppMain()

    /* idle task commences here */
    DBG_vPrintf(TRUE,"\n");
    DBG_vPrintf(TRUE, "***********************************************\n");
    DBG_vPrintf(TRUE, "* SMART PLUG RESET                                *\n");
    DBG_vPrintf(TRUE, "***********************************************\n");

    DBG_vPrintf(TRACE_APP, "APP: Entering APP_vSetUpHardware()\n");

    APP_vSetUpHardware();   
    //vAHI_TickTimerRegisterCallback(tick_callback_func);
    
    DBG_vPrintf(TRACE_APP, "APP: Entering APP_vInitResources()\n");
    APP_vInitResources();   
    
    DBG_vPrintf(TRACE_APP, "APP: Entering APP_vInitialise()\n");
    APP_vInitialise();      
    
#if (defined APP_NTAG_ICODE) || (defined APP_NTAG_AES)
    DBG_vPrintf(TRACE_APP, "\nAPP: Entering APP_vNtagPdmLoad()");
    /* Didn't start BDB using PDM data ? */
    if (FALSE == APP_bNtagPdmLoad())
#endif
    {
        DBG_vPrintf(TRACE_APP, "APP: Entering BDB_vStart()\n");
        BDB_vStart();       
    }

    DBG_vPrintf(TRACE_APP, "APP: Entering APP_vMainLoop()\n");
    APP_vMainLoop();

时钟初始化、协议栈初始化、设备硬件初始化等。整体的架构还是基于定时器做的,单片机没有多线程的概念,只能不停的轮转任务。

测试方法

测试计量其实需要精度很高的专用设备,由于之前公司没有此类设备,合作工厂也只有一个精度不高的设备,测个大概。一般的测量设备、大功率下温度升高,设备功率就不稳定,所以要想精度高,测试设备也有较高要求

结论

一个基本的模型,精度以及zigbee部分还有很多待优化。之前测试的小米计量插座精度很高。简单做个总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值