ble开发-低电量管理
现有客户需求,低电量模式进行操作后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闪烁函数 }
实测到了30的电后led都不亮了,大小改为50或者80,又或者修改最低电量的值这就得具体情况具体分析了
浙公网安备 33010602011771号