涂鸦智能颈部按摩仪设计——语音播报加热(嵌入式)

Posted 三明治开发社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了涂鸦智能颈部按摩仪设计——语音播报加热(嵌入式)相关的知识,希望对你有一定的参考价值。

在产品创建和五大功能模式都实现的基础上接着实现语音播报、加热、档位切换的功能。

一、语音播报

1、功能简述

本次用到了WTN6系列的离线语音模块,WTN6系列产品为多功能单芯片语音合成4位元为控制器。
在这里插入图片描述

(1) 工作电压:2.4V~5.2V
(2) 待机模式下,静态电流小于5uA
(3) 精准的+/-1%内部震荡,有低压复位(LVR=1.8V)看门狗计时
(4) 12位元PWM纯音频输出,可直接驱动8Ω/0.5W喇叭和蜂鸣器,DAC音频输出,可外接功放
(5) 内置看门狗;
(6) 具备串口控制模式:一线串口,两线串口(最多可以加载224段语音,后续有详解),数脉冲
(7) 支持BUSY状态输出功能

Pad NamePad No.ATTR.Description 描述
PA21I/O忙信号输出
PA12I/O两线串口时钟信号输入端/一线串口数据信号输入端/数脉冲数据信号输入端
PA03I/O两线串口数据信号输入端/复位脚
PA34I/O暂未使用(NC)
PWM-5outPWM 输出脚
VDD6Power电源正极
PWM+/DAC7I/OPWM、DAC 输出脚
GND8Power电源负极
2、一线串口通讯

本次仅用到了一线串口通讯,一线串口模式可以利用 MCU 通过 DATA 线给 WTN6 系列语音芯片发送数据以达到控制的目的。可以实现控制语音播放、停止、循环等。
(1)管脚分配:

管脚作用
PA1DATA
PA2BUSY

(2)一线语音地址对应关系:

数据(十六进制)功能
00H播放第 0 段语音
01H播放第 1 段语音
02H播放第 2 段语音
…………
DFH播放第 222 段语音
3、一线串口时序图

先把数据线拉低 5ms 后,发送 8 位数据,先发送低位,再发送高位,使用高电平和低电平比例来表示
每个数据位的值。
在这里插入图片描述
在这里插入图片描述

4、功能代码

(1)功能引脚初始化

void voice_prompt_init(void)
{
    gpio_set_func(WTN6_DATA_PIN | WTN6_BUSY_PIN, AS_GPIO);
    gpio_set_input_en(WTN6_BUSY_PIN, 1);
    gpio_set_output_en(WTN6_DATA_PIN, 1);

    gpio_write(WTN6_BUSY_PIN, 0);
}

(2)声音播放

void voice_playing(uint8_t sb_data)
{
	uint8_t s_data, j;
	bool b_data;
	s_data = sb_data;
	gpio_write(WTN6_DATA_PIN, 0);
	sleep_us(5000);		//延时 5ms
	b_data = s_data & 0X01;

	for (j=0; j<8; j++) {
		if (b_data == 1) {
			gpio_write(WTN6_DATA_PIN, 1);
			sleep_us(600); //延时 600us
			gpio_write(WTN6_DATA_PIN, 0);
			sleep_us(200); //延时 200us
		} else {
			gpio_write(WTN6_DATA_PIN, 1);
			sleep_us(200); //延时 200us
			gpio_write(WTN6_DATA_PIN, 0);
			sleep_us(600); //延时 600us
		}
			s_data = s_data >> 1;
			b_data = s_data & 0X01;
	}
	gpio_write(WTN6_DATA_PIN, 1);
}

输入参数填入对应地址voice_playing(0x01)即可播放离线语音。

二、加热功能

在这里插入图片描述
加热功能是通过控制P7引脚的拉高拉低来实现加热开、加热关的,内置温度检测模块,加热时当温度超过40℃会自动关闭加热功能以免过热引起不适或被烫伤。
在这里插入图片描述

int switching_heat(unsigned char warm)
{
	if (warm > 1) {
		TUYA_APP_LOG_ERROR("*********No such model!!!**********");
	}
//	printf("wram%d massage_state.heat%d\\r\\n", warm, massage_state.heat);

	switch (warm) {
	case strong_heat:
		TUYA_APP_LOG_INFO("**********strong_heat************");
		gpio_write(HEAT_PIN, 1);
		temperature_detection();
		break;
	case off_heat:
		TUYA_APP_LOG_INFO("**********off_heat************");
		gpio_write(HEAT_PIN, 0);
		break;

	default:
		break;
	}

	return 0;
}
/*温度检测,弱热强热功能开启时调用*/
int temperature_detection(void)
{
	int Rntc = 0, Vcc = 0;
	adc_channel_checkout(channel_x1);
	Vcc = adc_sample_and_get_result();	//uint:mv
	Rntc = Vcc*R25 / (3300-Vcc);
	TUYA_APP_LOG_INFO("Rntc_val=%dΩ", Rntc);
	if (Rntc >= 5311) {		// NTC在40℃时电阻值为5311Ω
		TUYA_APP_LOG_WARNING("********High Temperature Warning!!!********");
		gpio_write(HEAT_PIN, 0);	//超过40℃关闭加热功能
	}

	return 0;
}

NTC温度与阻值对照表
在这里插入图片描述

以上是关于涂鸦智能颈部按摩仪设计——语音播报加热(嵌入式)的主要内容,如果未能解决你的问题,请参考以下文章

涂鸦智能颈部按摩仪设计——功能模式实现(嵌入式)

涂鸦智能颈部按摩仪设计——档位切换实现(嵌入式)

涂鸦智能颈部按摩仪设计——断电记忆云端控制(嵌入式)

开发功能更加完善的智能颈部按摩仪

智能颈部按摩仪硬件设计

智能颈部按摩仪拆机分享