ZigBee TI ZStack CC2530 5.7 实例(三)多功能按键02-指示灯

简介: (配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 上一节中讲述了如何实现基于系统时钟的多功能按键,本节将讲述对这一多功能按键的升级优化——添加指示灯。 一、实验内容及目的 多功能按键的功能虽然很好用,但是如果没有任何提示的,光靠人自己数数的估算按键时间的话,着实不是很好便。

(配套源码软件开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911


上一节中讲述了如何实现基于系统时钟的多功能按键,本节将讲述对这一多功能按键的升级优化——添加指示灯。


一、实验内容及目的

多功能按键的功能虽然很好用,但是如果没有任何提示的,光靠人自己数数的估算按键时间的话,着实不是很好便。一般实际项目开发中,与多功能按键一起使用的,还会有一个指示灯。灯的状态就可以有很多了,灯的颜色、亮暗、是否闪烁以及闪烁快慢或频率等,不同的状态可以代表各种不同的提示信息!

因此,本次实验的内容就是为我们的多功能按键增加一个指示灯;目的是为了通过LED灯的状态,来提示用户按键时间的长短,从而更加人性化地实现”多功能“!具体实验现象将会是:

1、按键时间20ms ~ 5s  :LED指示灯无任何现象,保持熄灭的状态;

2、按键时间   5  s ~ 10s:LED指示灯以较高的频率(125ms/次)闪烁;

3、按键时间  10 s ~ 15s:LED指示灯切换到较低的频率(500ms/次)闪烁;

4、按键时间  15 s 以上  :LED指示灯重新回到熄灭的状态;

PS:每次松开按键,不管当前LED灯是什么状态,都会重新回到熄灭的状态,表示可以重新进行下一次按键操作。

二、实验的原理

当按键一开始被按下的时候,触发一次5000ms之后的按键时间判断,具体代码实现就是向Hal_TaskID任务发送一个HAL_KEY_TIME_EVT事件,5000ms之后触发:

void halProcessKeyInterrupt (void)
{
  ......
    if((PICTL & HAL_KEY_SW_1_EDGEBIT)==HAL_KEY_SW_1_EDGEBIT)//由于“下降沿”触发中断
    {
      ......
      osal_start_timerEx( Hal_TaskID, HAL_KEY_TIME_EVT, 5000);
    }
  ......
}

5000ms之后,Hal_TaskID任务的HAL_KEY_TIME_EVT事件被触发。Hal_TaskID任务的任务处理函数为hal_drivers.c文件中的Hal_ProcessEvent()函数,具体执行代码如下:

  if ( events & HAL_KEY_TIME_EVT )
  {
    processHalKeyTimeEvt();
    return (events ^ HAL_KEY_TIME_EVT);
  }

此处增加的这段代码,其实就是为Hal_ProcessEvent()函数增加了一个事件处理分支,而这个事件的定义放在了hal_drivers.h文件中:

#define HAL_KEY_TIME_EVT      0x0010

由此可以看出,实际处理的函数其实是processHalKeyTimeEvt()。该函数的声明与定义也都放在了hal_drivers.c文件中。如下:

void processHalKeyTimeEvt( void );
void processHalKeyTimeEvt( void )
{
  if (HAL_PUSH_BUTTON1())
  {
    uint32 interval = osal_GetSystemClock() - HAL_KEY_starting_time;

    if(interval >= 10000)
    {
      HalLedBlink( HAL_LED_2, 10, 50, 500 ); //慢闪
    }
    else if(interval >= 5000)
    {
      HalLedBlink( HAL_LED_2, 40, 50, 125 ); //快闪
      osal_start_timerEx( Hal_TaskID, HAL_KEY_TIME_EVT, 5000);
    }
  }
}

从最初按下按键,到执行到这个函数,已经过去了5000ms,也就是5s。如果此时按键仍然保持被按下的状态,则LED指示灯进入“快闪”状态。与此同时,再触发一次5000ms之后的按键时间判断。再过5s之后,如果按键依旧保持被按下的状态,则LED指示灯进入“慢闪”状态。

每次按键一旦松开,OnBoard_KeyCallback()函数中,都会调用OnBoard_SendKeys()函数,将按键信息发送到应用层任务。这里我们在发送按键信息到应用层任务之前,就先将LED指示灯恢复到默认熄灭的状态。具体代码实现为调用一次LED闪烁函数——HalLedBlink( ),重新指定LED灯的状态为闪烁一次即停止闪烁:

void OnBoard_KeyCallback ( uint8 keys, uint8 state )
{
  ......
  HalLedBlink( HAL_LED_2, 1, 50, 100 ); //停止闪烁
  ......
}
具体效果就是每次一旦松开按键,不管当前LED灯是什么状态,都会立即重新回到熄灭的状态。

三、实验验证

1、编译下载

本次实验验证只需要一个ZigBee设备即可完成,这里我们选择“CoordinatorEB”编译下载:

2、实验现象

下载成功之后,除了有上一节中的实验现象之外,还可以看到LED指示灯同步闪烁!

此处实验现象在博客中不方便呈现,大家自己验证即可。源码请自行去文首或文末的百度网盘链接中下载。


(配套源码软件开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911

相关文章
|
传感器 物联网
( zigbee)CC2530+BH1750光敏传感器获取光照强度
( zigbee)CC2530+BH1750光敏传感器获取光照强度
837 0
( zigbee)CC2530+BH1750光敏传感器获取光照强度
|
网络安全 开发者
CC 自定义功能使用介绍|学习笔记
快速学习 CC 自定义功能使用介绍
153 0
CC 自定义功能使用介绍|学习笔记
|
安全 网络安全 API
WAF 功能-CC 自定义规则 | 学习笔记
快速学习 WAF 功能-CC自 定义规则
326 0
|
传感器 网络协议 物联网
基于CC2530(ZigBee)设计的景观照明控制系统+配套手机APP
基于CC2530(ZigBee)设计的景观照明控制系统+配套手机APP
569 0
基于CC2530(ZigBee)设计的景观照明控制系统+配套手机APP
|
传感器 网络协议 物联网
基于CC2530(ZigBee)设计的自动照明系统
基于ZigBee的自动照明系统设计,上面连接了光感传感器,ESP8266WIFI模块。通过ESP8266与手机APP之间通信,ESP8266创建热点,配置为TCP服务器模式; 手机APP连接上ESP8266的热点之后,再连接ESP8266创建的服务器,完成通信。 手机APP上通过按钮可以控制B,C开发板上LED灯的开关。
571 0
|
传感器 物联网 Linux
基于CC2530(ZigBee设计)的温度报警器
这是基于CC2530设计的远程温度报警器,通过CC2530终端检测环境温度上传给手机APP实时显示。 一共有两块CC2530开发板,这里就分别称为A板(当做协调器)、B板(当做温度节点),A板上接了ESP8266 WIF模块,用于与手机APP之间通信。B板上接了DS18B20 温度传感器模块,用于给A板传递检测的温度,A板收到DS18B20的温度之后,发送给手机APP显示。APP上位机采用Qt框架设计,支持跨平台,Android、windows、IOS、Linux都可以编译运行安装。
867 0
|
物联网
ZigBee(CC2530)最小系统PCB设计(AD18开发软件)
ZigBee(CC2530)最小系统PCB设计(AD18开发软件
ZigBee(CC2530)最小系统PCB设计(AD18开发软件)
|
物联网
ZigBee TI ZStack CC2530 2.3 协议栈版本
(配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 一、协议栈发展历史 TI的ZigBee 协议栈Z-Stack,从最开始的Z-Stack 0.1到大家熟悉的ZStack-CC2530-2.5.1a,再到几个月前刚刚发布的最新版本——Z-Stack 3.0.1,历经了非常多的版本。
3250 0
|
移动开发 物联网 流计算
ZigBee TI ZStack CC2530 3.12 LED驱动移植及使用
(配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 一、前言 关于Z-Stack协议栈中的LED控制,如果使用协议栈中自带的驱动,很简单就可以实现非常丰富的功能。
2082 0
|
物联网
ZigBee TI ZStack CC2530 3.14 按键驱动01-轮询模式
(配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 在Z-Stack协议栈中,对于按键的检测,分为两种不同的机制,分别称为“轮询模式”和“中断模式”,类比单片机中的按键检测,还是很好理解的。
1720 0