智能颈部按摩——4.语音播报、加热

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

一、语音播报
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温度与阻值对照表
在这里插入图片描述

颈部按摩仪是一种可以缓解颈部疲劳和疼痛的电子产品,其主要原理是通过机械震动的方式来按摩颈部肌肉,从而提高血液循环、缓解肌肉疲劳、改善睡眠等。下面是一个基于STM32的颈部按摩仪的设计与实现步骤: 1. 硬件设计 首先,需要选择一款适合的STM32单片机作为控制芯片,同时还需要选择一些适合的电机和驱动模块。电机可以选择直流电机或者步进电机,驱动模块可以选择L298N或者A4988等。此外,还需要一些传感器,如加速度传感器、温度传感器等。 2. 硬件连接 将所选的电机和驱动模块连接到STM32单片机上,并将传感器连接到对应的引脚。需要注意的是,电机和驱动模块的电源需要稳定,电源电压一般为12V。 3. 软件设计 在软件设计方面,需要编写STM32的程序,实现控制电机的功能。首先需要初始化单片机的各个引脚,然后编写电机控制函数。在电机控制函数中,需要根据加速度传感器的数据来控制电机的转速和转向,从而实现按摩的功能。 4. 界面设计 可以在按摩仪上加入一个液晶屏幕,用于显示一些状态信息,如电机转速、温度、按摩时间等。同时,也可以加入一些按键,用于控制按摩仪的开关、转速等。 5. 实现测试 完成硬件和软件设计后,需要对按摩仪进行测试。可以通过连接电源和按下开关,测试电机是否正常工作。同时,也需要测试加速度传感器和温度传感器的准确性。 总的来说,基于STM32的颈部按摩仪的设计与实现需要考虑硬件和软件两个方面,需要选择合适的电机、驱动模块和传感器,并编写相应的程序。完成后,还需要进行测试,确保按摩仪的正常工作。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值