[原创] 【Nucleo+BLUENRG心得】+BLUENRG 通过APP控制 RGB

蓝雨夜   2014-12-30 13:04 楼主
【Nucleo+BLUENRG心得】+BLUENRG 通过APP控制 RGB

APP:Multitool
硬件:Nucleo+BLUENRG心




BLUENRG 服务定义:
IMG_3130.PNG

通过其中一个服务了解它
//添加SERVICE  0XFFF0
  ret = aci_gatt_add_serv(UUID_TYPE_16, service_uuid, PRIMARY_SERVICE, 7+10, &sampleServHandle); /* original is 9?? */
  if (ret != BLE_STATUS_SUCCESS) goto fail;   

       
  //1添加一个  Characteristic 服务 0XFFF1
        ret =  aci_gatt_add_char(sampleServHandle,  UUID_TYPE_16, charUuidTX, 1, CHAR_PROP_READ|CHAR_PROP_WRITE|CHAR_PROP_WRITE_WITHOUT_RESP, ATTR_PERMISSION_NONE, GATT_SERVER_ATTR_WRITE,
                                                                                                        16, 1, &TXCharHandle);
  if (ret != BLE_STATUS_SUCCESS) goto fail;
       

        //1添加一个特征描述符来服务
        //Add a characteristic descriptor to a service
  ret = aci_gatt_add_char_desc(sampleServHandle,
                               TXCharHandle,
                               UUID_TYPE_16,
                               (tHalUint8 *)&charUuidRX4,
                               22,
                               4,
                               (char *)"Rad",
                               ATTR_PERMISSION_NONE,
                               ATTR_ACCESS_READ_ONLY,
                               0,
                               16,
                               1,
                               &descHandle[0]);


其他类推!


接收程序

void Attribute_Modified_CB(tHalUint16 handle, tHalUint8 data_length, tHalUint8 *att_data)
{
        uint8 newVal;
  uint8 rgbwVal[LIGHTSPROFILE_RGBW_LEN];

        if (handle == TXCharHandle + 1)                 //11 UUID=0xFFB1  ATT_CHAR_USER_DESC_UUID=Red 接收状态下    //if(att_data[0] == 0x01) notification_enabled = TRUE;
        {         
                receiveData(att_data, data_length);
                lvalRed = att_data[0] << 4;
  }
        else if(handle == RXCharHandle + 1)        //13        UUID=0xFFB2,ATT_CHAR_USER_DESC_UUID=Green
        {
    receiveData(att_data, data_length);
                lvalGreen = att_data[0] << 4;
  }
        else if(handle == RXCharHandle1+1 ) //15        UUID=0xFFB3,ATT_CHAR_USER_DESC_UUID=Blue
        {
                receiveData(att_data, data_length);
                lvalBlue = att_data[0] << 4;
        }
        else if(handle == RXCharHandle2+1)        //17        UUID=0xFFB4,ATT_CHAR_USER_DESC_UUID=White
        {
                receiveData(att_data, data_length);
                lvalWhite = att_data[0] << 4;
        }       
        else if(handle == RXCharHandle3+1 )        //19        UUID=0xFFB5,ATT_CHAR_USER_DESC_UUID=RGBW  总开/关
        {
                receiveData(att_data, data_length);
                //BSP_LED_Toggle(LED2);
                  lvalRed = att_data[0] << 4;
      lvalGreen = att_data[1] << 4;
      lvalBlue = att_data[2] << 4;
      lvalWhite = att_data[3] << 4;
        }
       
        pwmFadeVals();
  pwmUpdateVals();
        /* if(HAL_UART_Transmit(&UartHandle, (uint8_t*)att_data, data_length, 5000)!= HAL_OK)
  {
    Error_Handler();   
  }*/
}

回复评论 (8)

RGB控制
void stepval(volatile int16 *val, int16 *step, int16 lo, int16 hi)
{
  *val += *step;
  if (*val > hi) {
    *val = hi - (*val - hi);
    *step *= -1;
  } else if (*val < lo) {
    *val = lo - *val;
    *step *= -1;
  }
}
  
static void pwmFadeVals(void)
{
  static int16 rstep = 0x20;
  static int16 gstep = 0x30;
  static int16 bstep = 0x10;
  static int16 wstep = 0x05;
  

//  currentRed = oldRed + ((i * (newRed - oldRed)) / (steps - 1)
  
//  alpha = abs((time.elapsed() % 510) - 254);

  stepval(&lvalRed, &rstep, 0, LIGHTMAXVAL);
  stepval(&lvalGreen, &gstep, 0, LIGHTMAXVAL);
  stepval(&lvalBlue, &bstep, 0, LIGHTMAXVAL);
  stepval(&lvalWhite, &wstep, 0, LIGHTMAXVAL);
}
点赞  2014-12-30 13:06
引用: 蓝雨夜 发表于 2014-12-30 13:06
RGB控制
void stepval(volatile int16 *val, int16 *step, int16 lo, int16 hi)
{
  *val += *step;
  if (*val > hi) {
    *val = hi - (*val - hi);
    *step *= -1;
  } else if (*val < lo) {
    *val = lo - *val;
    *step *= -1;
  }
}
  
static void pwmFadeVals(void)
{
  static int16 rstep = 0x20;
  static int16 gstep = 0x30;
  static int16 bstep = 0x10;
  static int16 wstep = 0x05;
  

//  currentRed = oldRed + ((i * (newRed - oldRed)) / (steps - 1)
  
//  alpha = abs((time.elapsed() % 510) - 254);

  stepval(&lvalRed, &rstep, 0, LIGHTMAXVAL);
  stepval(&lvalGreen, &gstep, 0, LIGHTMAXVAL);
  stepval(&lvalBlue, &bstep, 0, LIGHTMAXVAL);
  stepval(&lvalWhite, &wstep, 0, LIGHTMAXVAL);
}

点赞  2014-12-30 13:28
直接复制TI的例程
点赞  2014-12-30 13:40
楼主强大
点赞  2015-1-2 19:23
楼主很强大!!!
点赞  2015-9-11 21:59
楼主想请教下你NRG啊!!!
点赞  2015-9-11 22:00
想问下handle的值是怎样得出来的???
点赞  2015-9-11 22:15
楼主,我的BlueNRG 为什么添加多个服务或者一个服务下添加多个特征值会导致蓝牙不能广播?是哪里没有配置好么?
点赞  2016-11-21 15:04
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复