百味勺子——复位配网和电量报警实现篇
Posted 三明治开发社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百味勺子——复位配网和电量报警实现篇相关的知识,希望对你有一定的参考价值。
1、复位配网
百味勺子只有一个物理按键,同时复用为电源键和配网按键。电源按键直接将模组断电而非进入低功耗休眠模式。当用作配网按键时,通过快速上下电三次模组会解除与当前已绑定设备的信息,重新进入配网模式新设备可以正常连接。如果为同一台设备须在APP上解除与当前产品的绑定即可重新配网。
复位配网原理:设立一个配网标志位,在第一次断电重新上电后将标志位的值写入flash,第二次上电标志位的值加一,依此类推,同时开启一个定时器,当时间到某一个设定值(判定设备已进入正常工作状态)后清除当前flash中的标志位。第三次时会调用函数 tuya_ble_device_factory_reset()
进行设备重置,同时添加一个配网指示灯显示当前联网状态。快闪表示进入配网模式等待设备连接,常亮表示设备已配网。功能实现代码如下:
// 清除flash中断电配网标志位
static int clear_ble_flag(void)
{
Flash_Write_Buff[0] = 0;
flash_erase_sector(FLASH_ADDR);
flash_write_page(FLASH_ADDR, FLASH_BUFF_LEN, (unsigned char *)Flash_Write_Buff);
blt_soft_timer_delete(&clear_ble_flag);
return 0;
}
//通断电三次配网
uint8_t switch_setup_network(void)
{
blt_soft_timer_add(&clear_ble_flag, 5000*TIME_MS); // 设备正常使用5s后清除flash中断电配网标志位
flash_read_page(FLASH_ADDR, FLASH_BUFF_LEN, (unsigned char *)Flash_Read_Buff);
Flash_Write_Buff[0] = Flash_Read_Buff[0];
TUYA_APP_LOG_INFO("Flash_Read_Buff[1] = %d", Flash_Read_Buff[0]);
// 上下电三次重新配网
if (Flash_Read_Buff[0] < POWER_COUNT) {
Flash_Write_Buff[0]++;
flash_erase_sector(FLASH_ADDR);
flash_write_page(FLASH_ADDR, FLASH_BUFF_LEN, (unsigned char *)Flash_Write_Buff);
} else {
TUYA_APP_LOG_INFO("start connect new device");
tuya_ble_device_factory_reset(); // 断开与当前设备的连接(会清除已绑定设备的信息),进入配网模式
}
return Flash_Write_Buff[0];
}
void led_connect_status(void) //配网指示灯状态判断 loop中调用
{
if (BONDING_CONN == status_flag) {
gpio_write(BLE_LED_PIN, 0);
} else {
if (clock_time_exceed(time_tick, TIME_MS * 400)) {
time_tick = clock_time();
gpio_toggle(BLE_LED_PIN);
}
}
}
switch_setup_network()
会在初始化函数中调用,led_connect_status()
在loop中调用。
2、电量报警
通过ADC采集到电池电压,当电压值低于总电压的10%(电压为3.5V)时会在APP上报警提示用户对设备充电。get_battery_value()
在loop中调用,每10s采集一次电池电压。
// ADC采样频率14位,参考电压1.2V
static unsigned int get_adc_value(void)
{
adc_init();
adc_base_init(BATTERY_ADC_PORT);
adc_power_on_sar_adc(1);
return adc_sample_and_get_result();
}
// 电池电压采集
unsigned short get_battery_value(void)
{
if (!clock_time_exceed(battery_time_tick, TIME_MS*10000)) {
return 0;
}
battery_time_tick = clock_time();
unsigned int battery_adc_value = 0;
battery_adc_value = get_adc_value() * 2; // 电路分压,实际电池电压 = 2*battery_adc_value
if (battery_adc_value <= BATTERY_ADC_LOWER_LIMIT) { //电量剩余10%APP报警
power_alarm_buf[3] = ALARM;
tuya_ble_dp_data_report(power_alarm_buf, DP_BUF_LEN); //上报报警状态
} else {
power_alarm_buf[3] = NORMAL;
tuya_ble_dp_data_report(power_alarm_buf, DP_BUF_LEN);
}
TUYA_APP_LOG_INFO("battery_val = %dmv", battery_adc_value);
return battery_adc_value;
}
上一篇:
百味勺子——环境搭建篇
下一篇:
百味勺子——味觉模式实现篇
以上是关于百味勺子——复位配网和电量报警实现篇的主要内容,如果未能解决你的问题,请参考以下文章