CC2541读取电池电量并且广播出去

来源:互联网 发布:淘宝官方活动 编辑:程序博客网 时间:2024/05/22 10:37

                                                                                                             CC2541之电池电量查询并广播                        

一、简介

     以SimpleBLEPeripheral工程为例, 介绍如何读取电量并且广播。


二、实验平台

协议栈版本: BLE-CC254x-1.4.0
编译软件: IAR 8.20.2
硬件平台: CC2541 + USB-RS232      USB dongle

手机平台: 苹果4s
APPLightBlue


三、实现步骤

1.保证项目中有hal_adc.chal_adc.h

2.添加Profile如下图所示


我的文件路径在:C:\Texas Instruments\BLE-CC254x-1.4.0\Projects\ble\Profiles\Batt

(如果找不到建议下载一个“光速搜索”,这个软件用起来很好用)


3.添加两文件的路径(因为我的改了名字,你们的不必和我的一致,和你们的名字相同就行了)


4.打开ADC采样的宏


5.添加头文件(simpleBLEPeripheral.c

 #include "battservice.h"


6.修改代码给电源电量预留的位置( simpleBLEPeripheral.c)

static uint8 advertData[] =
{
  0x07,
  GAP_ADTYPE_MANUFACTURER_SPECIFIC, // manufacturer specific advertisement data type
  0x20, //给MAC地址预留位置     2
  0x20,
  0x20,
  0x20,
  0x20,
  0x20, //                      7  
  
  0x01,
  GAP_ADTYPE_MANUFACTURER_SPECIFIC, // manufacturer specific advertisement data type
  0x20,//给电池电量预留的位置   10


7.添加相应的变量 (simpleBLEPeripheral.c)



8、添加相应的代码simpleBLEPeripheral.c)

   //读取电池电量
    Batt_GetParameter(BATT_PARAM_LEVEL,battLevel);
    osal_memcpy (advertData + 10, battLevel,1);
    //更新广播数据
    GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID,TRUE,sizeof(advertData),advertData );


    读取电池电量这里需要注意我在simpleBLEPeripheral.c中调用battservice.c中调用下面这个函数

    不能用,我也添加了相应的声明在“.h”文件中 并且把static去掉了还是不能再其他的.c文件中调用。只能在

    battservice.c中调用(这个希望大神们指导)

    

在下面这个函数中调用battMeasure函数读取相应的电池电量。(battservice.c)

 bStatus_t Batt_GetParameter( uint8 param, void *value )
{
  bStatus_t ret = SUCCESS;
  switch ( param )
  {
    case BATT_PARAM_LEVEL:
      //wodejiqing
      battLevel = battMeasure();
      *((uint8*)value) = battLevel;
      break;

9、在 simpleBLEperipheral.h中添加一个新的事件


10、在 simpleBLEperipheral.c中下面位置启动这个事件


11.添加相应的处理函数(我的是广播30秒后不再广播)

 //周期性广播处理事件
    if ( events & SBP_ADV_PERIODIC_PROCESS_EVT )
    {
     static uint8 k = 0;
     osal_memcpy (advertData + 2, ownAddress,6);
     osal_memcpy (advertData + 10, battLevel,1);
    // GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );
     GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID,TRUE,sizeof(advertData),advertData ); //更新广播数据
      k += 2;
      if(k <= 30 )
     {
       osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_ADV_PERIODIC_PROCESS_EVT, adv_per_time );
     }else{
            uint8 initial_advertising_enable = FALSE;
            GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
          }
     return (events ^ SBP_ADV_PERIODIC_PROCESS_EVT);
}

然后就可以了

下面是运行结果因为用的是usb供电所以电量一直未100、我也用过电子供电,结果很理想。





我是一个无线通信爱好者

希望这篇博客可以帮到更多的人

注:

      本人新手,写博客想记录成长历程还有请大神们指正不足之处,还有许多不足的地方,希望各位大神不吝赐教。谢谢

1 0
原创粉丝点击