ble开发-低电量管理

发布时间 2023-06-10 11:06:49作者: foorun

现有客户需求,低电量模式进行操作后LED进行闪烁,不操作则闪三秒后结束

首先对电量获取进行分析,其是通过ADC回调函数进行获取电量,然后如果电量发生变化则通过蓝牙发送电量变化后的值,ADC获取电量函数如下,当大于3V时 battery_percent 电量值为100,低于1.8V则为0 

 

_ATTR_SECTION_SRAM__ static void adc_evt(adc_Evt_t* pev)
{
	float value = 0;
    int i = 0;
    bool is_high_resolution = FALSE;
    bool is_differential_mode = FALSE;
    uint8_t ch = 0;
    int level_mv = 0;
    if((pev->type != HAL_ADC_EVT_DATA) || (pev->ch < 2))
        return;

    channel_done_flag |= BIT(pev->ch);

    if(channel_done_flag == adc_cfg.channel)
    {
        for(i=2; i<8; i++)
        {
            if(channel_done_flag & BIT(i))
            {
                is_high_resolution = ( adc_cfg.is_high_resolution & BIT(i)) ? TRUE : FALSE ;
                is_differential_mode = ( adc_cfg.is_differential_mode & BIT(i))? TRUE : FALSE ;
                value = hal_adc_value_cal( (adc_CH_t)i, pev->data, pev->size, is_high_resolution, is_differential_mode);
                level_mv = (int)(value * 1000);
                switch(i)
                {
                case ADC_CH1N_P11:
                    ch=11;
                    break;

                case ADC_CH1P_P23:
                    ch=23;
                    break;

                case ADC_CH2N_P24:
                    ch=24;
                    break;

                case ADC_CH2P_P14:
                    ch=14;
                    break;

                case ADC_CH3N_P15:
                    ch=15;
                    break;

                case ADC_CH3P_P20:
                    ch=20;
                    break;

                default:
                    break;
                }

                if(ch!=0)
                {
                    if( level_mv > 3000 )
                    {
                        battery_percent = 100;
                    }
                    else if( level_mv <= 3000 && level_mv >= 1800 )
                    {
                        battery_percent = ((value*1000 -1800)*100) / (3000 - 1800);
                    }
                    else
                    {
                        battery_percent = 0;
                    }
                    
                    BATT_LOG("[BATT]-%dmv %d% \n", level_mv, battery_percent);
					bat_level_mv = level_mv;
                    update_batt_value(battery_percent);
                }
                else
                {
                    BATT_LOG("invalid channel\n");
                }
            }
        }

        channel_done_flag = 0;
    }
}

  蓝牙将变化后的电量值发送的函数为,其中 battMeasure() 即为获取电量函数,现我们只需通过此函数进行编写代码即可。

bStatus_t Batt_MeasLevel( void )
{
    uint8 level;
    level = battMeasure();

    // If level has gone down
    if (level < battLevel)
    {
        // Update level
        battLevel = level;
        // Send a notification
        battNotifyLevel();
    }

    return SUCCESS;
}

 将 battMeasure()  定义为全局函数,并在按键回调函数中进行调用,然后加一个3s低电量的LED闪烁即可。当按键按下后如果电量低则闪烁,同时也实现了不操作则闪烁3s三秒关闭。

__ATTR_SECTION_SRAM__ void hal_bsp_btn_callback(uint8 evt)//在这里面最后添加

            if(battMeasure()<=30)
        {
            led_low_power_send();//LED 3s闪烁函数
        }