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部分还有很多待优化。之前测试的小米计量插座精度很高。简单做个总结

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
后台采用apache服务器下的cgi处理c语言做微信小程序后台逻辑的脚本映射。PC端的服务器和客户端都是基于c语言写的。采用mysql数据库进行用户数据和聊天记录的存储。.zip C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值