多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
* 导师**视频**讲解:[**去听课**](https://www.bilibili.com/video/BV1k34y1D7Vz/) >[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/zigbee) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> 设备简单描述符: ![](https://img.kancloud.cn/12/7e/127e6cfaf9892adfdeec83da323f39d4_688x426.png =600x) ### ZHA Lighting的工程结构和我们先前的智能插座工程是一模一样的: ![](https://img.kancloud.cn/52/8f/528f647f4bf463ece44eaafa04e5aa96_362x176.png =300x) ### 首先添加协调器建立网络、设备加入网络程序(加入失败会启动定时事件重新尝试加入): ![](https://img.kancloud.cn/4a/d3/4ad3cc1c79de1cea768cb338a85f9246_816x288.png =600x) ### ## \*\* **ZCL General命令处理函数** 查看ZCL的“General”命令处理函数列表: ![](https://img.kancloud.cn/21/c8/21c8992b2e0c9a2c76180426b013945b_830x540.png =600x) ### 其中最重要的函数是zclSampleLight\_LevelControlMoveToLevelCB,当我们通过ZCL发送调节灯的亮度命令到该设备时,就会进入这个函数。该函数的处理流程如下: ### >[info] zclSampleLight\_LevelControlMoveToLevelCB > \--> 调用函数:zclSampleLight\_MoveBasedOnTime > \--> 启动事件:SAMPLELIGHT\_LEVEL\_CTRL\_EVT > \--> 事件处理函数中调用:zclSampleLight\_AdjustLightLevel ### 也就是说最后会进入函数zclSampleLight\_AdjustLightLevel中,上面几个函数的调用以及内容最终是为了调节灯亮度;可能大家会问,调节亮度直接调用一个API不就完事了么,为什么要这么多步骤?这是因为ZCL支持对亮度的分时调节,比如说用2秒时间从亮度100%调节到1%,这样的优点是提高了用户体验,给人一种渐变的温馨效果,这个分时时长是可以设置的,但是最小单位是100毫秒,比如2秒就是20个100毫秒。 ### 亮度调节的逻辑协议栈已经帮我们做好了,但是并没有提供灯的驱动程序,所以我们只需编写灯的驱动程序,然后在调节亮度函数中进行调用就可以。灯的驱动程序(笔者随手写的程序,不是很严谨,仅做参考无法商用): ![](https://img.kancloud.cn/e8/cc/e8cc7a9041d75f2ebf9fe1766069be90_294x332.png =200x) ### 驱动程序提供几个API: ![](https://img.kancloud.cn/a3/72/a3724346857c51068418c03111703a89_738x210.png =600x) ### API参数说明: * type - 提供两种模式:On/Off、Dimmable,也就是灯可以被配置为只支持开关的On/Off Lighting,或者支持调亮度的Dimmable Lighting * gpio - 灯的硬件连接,我们可以在P1\_4上连接了一个LED灯用于调光用,也可以用板载P0\_4的LED来进行On/Off操作。 ### 其中函数hwLight\_SetLevel是用来设置LED的亮度的,该函数来自基础篇的定时器PWM输出调光章节的内容,程序比较简单不做展开。 ### 使用这个驱动程序首先需要初始化: 文件:hal\_drivers.c \--> 函数:HalDriverInit \--> 最后的地方调用: ``` hwLight_Init( HW_LIGHT_TYPE_ONOFF, HW_LIGHT_GPIO_P04 ); //hwLight_Init( HW_LIGHT_TYPE_DIMMABLE, HW_LIGHT_GPIO_P14 ); ``` ### 然后我们只需要在上文提到的zclSampleLight\_AdjustLightLevel这个函数中调用hwLight\_SetLevel就可以了: ### 文件:zcl\_samplelight.c \--> 函数:zclSampleLight\_AdjustLightLevel \--> 最后调用(协调器不调用):hwLight\_SetLevel ### 如果是P0\_4,那么我们判断亮度值是否小于 254 / 2,如果是那么关灯,否则开灯;到这里,灯调节亮度的逻辑就完成了!!