百味勺子——复位配网和电量报警实现篇

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;
}

上一篇:
百味勺子——环境搭建篇
下一篇:
百味勺子——味觉模式实现篇

以上是关于百味勺子——复位配网和电量报警实现篇的主要内容,如果未能解决你的问题,请参考以下文章

百味勺子——硬件设计篇

百味勺子——环境搭建篇

智能除味器——嵌入式开发

智能“百味”勺子开发实战营,为你的生活添滋味!

智能“百味”勺子开发实战营,小白 VS 大神不是不可能!

勺子和浓缩咖啡测试