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,又或者修改最低电量的值这就得具体情况具体分析了