SU03T(语音识别播报模块)

news2024/9/30 12:18:26

SU03T(语音识别播报模块)

  • 注意:学习模块的方法是最重要的

目录

SU03T(语音识别播报模块)

查找资料 - SU03T

配置固件

1、进入智能公元,并注册登入

2、点击对应的模块,创建产品

3、随便选择一个产品类别,这里选择RGB

4、点击下一步后进入配置,降噪可选可不选

5、配置引脚

6、唤醒词配置

7、唤醒回复

8、命令词自定义

编程

1、初始化函数

2、中断服务函数

3、发送已一个字节函数

4、发送不定长数组

5、数据解析函数

6、在主函数中调用响应函数


查找资料 - SU03T

  • 先从网上查找资料,找到官方资料

-- 最好找到开发该模块的公司,从而找到官方资料

alt text

alt text

-- 如果这个简单的文档资料找不到你想应用的功能,那就取文档中心查看 

alt text

-- 这里面的文档就会比较丰富,有的模块还会有对应的视频,方便你学习

alt text

-- 还有相应的智能公元平台,可以去b站看使用方法

alt text

配置固件

1、进入智能公元,并注册登入

alt text

2、点击对应的模块,创建产品

alt text

3、随便选择一个产品类别,这里选择RGB

alt text

 

alt text

4、点击下一步后进入配置,降噪可选可不选

alt text

5、配置引脚

alt text

  • 后来会用这个引脚来下载一个空工程

6、唤醒词配置

  • 这里写的数据用来唤醒语音识别模块,可以说唤醒词来唤醒

alt text

7、唤醒回复

  • 你说唤醒词时,该模块会唤醒并播报你设置的内容 

    alt text

8、命令词自定义

alt text

  • 当触发方式选择的是命令词时 

    alt text

alt text

  • 配置控制

alt text

  • 点击添加控制

alt text

  • 选择端口输出(这里选择端口输出的意思是,该语音模块听到命令词时,该模块会向单片机发送数据)

alt text

  • 配置参数 

    alt text

  • 参数应写成相应的协议格式,已知协议包括帧头,消息,帧尾三部分,其中帧头和帧尾是固定的,消息是可变的,这里我们只发送一个数据,所以消息部分就写一个数据即可。而帧头和帧尾可以自己定义

alt text

  • 关灯跟开灯的配置一样

  • 下面配置播报co2溶度,因为播报co2溶度不仅要发给单片机让单片机将数据传给语音模块,还要让语音模块播报数据,所以这里需要配置两个控制

alt text

-- 这里的数据对应的操作,单片机编程的时候会写

  • 配置控制,跟关灯一样,注意数据要有区分,除了帧头和帧尾相同 

    alt text

  • 再添加一条,用来单片机向语音模块发送co2 

    alt text

  • 这里选择添加触发,收到语音后,语音模块会向单片机发送数据,单片机收到数据后,再向语音模块发送数据,

alt text

alt text

  • 添加控制,语音模块收到数据后,播报数据

alt text

  • 配置发音人,随机

alt text

  • 配置开机播报

alt text

  • 之后分别点击保存,检查配置,发布版本

alt text

  • 点击快速测试版本即可

alt text

  • 之后等待生成

alt text

  • 生成后将该压缩包放在没有中文路径之下,并解压

alt text

  • 打开串口下载器 

    alt text

  • 下载 

    alt text

  • 接线,将模块与单片机相连

  • 注意:一样要断电接线

alt text

 

alt text

 

alt text

  • 先向单片机里下载一个空工程,下载完后,将固件烧录到模块中 

    alt text

  • 点击烧录,注意这里点击烧录后,要将该语音播报模块重新上电,也就是将5v重新插一下,就开始烧录了,直到下载完成,关闭串口下载器即可 

    alt text

  • 之后将固件生成的.c和.h文件放到工程中 

    alt text

alt text

  • 移代码

alt text

  • 之后在.c中添加如下代码,将数据发送给语音模块

alt text

  • 然后将co2数据转换的函数写进解析数据函数中 

    alt text

  • 之后再将语音播报模块重新插线将Rx和Tx插到uart5对应的引脚上,分别是PC12和PD2

alt text

  • 开始编写代码

编程

1、初始化函数

  • 这里用的是UART5,直接在上一个kqm6600的基础上更改即可
void su03t_init(void)
{
//时钟 C\D端口  UART5(外设自身也有时钟)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);			//看数据手册在哪条线上 - APB1				//注意串口名字

//IO PC10,PC11
GPIO_InitTypeDef GPIO_InitStructure = {0};						//定义结构体变量,并且将结构体变量赋初值
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; 						//引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;			//速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;				//复用推挽
GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; 							//引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;		//浮空输入
GPIO_Init(GPIOD, &GPIO_InitStructure);

//外设

USART_InitTypeDef USART_InitStructure = {0};
USART_InitStructure.USART_BaudRate = 9600;   					 			//波特率  常用的是4800 9600  115200
USART_InitStructure.USART_WordLength = USART_WordLength_8b;	//数据位长度
USART_InitStructure.USART_StopBits = USART_StopBits_1;			//停止位长度
USART_InitStructure.USART_Parity = USART_Parity_No;					//奇偶校验(这里写不使用)
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制失能(不使用硬件流控制)
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//模式
USART_Init(UART5, &USART_InitStructure);

USART_Cmd(UART5,ENABLE);//开启串口    //使能或者失能 UART5外设(一般外设都要写这个)


//使能中断源			//串口有10个,用哪一个就要开哪一个中断源
USART_ITConfig(UART5,USART_IT_RXNE,ENABLE);

//中断
NVIC_InitTypeDef NVIC_InitStructure = {0}; 
NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn; //中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能(使能哪个中断通道,就要写哪个(必须写)中断服务函数)
NVIC_Init(&NVIC_InitStructure);

}

2、中断服务函数

  • 这里用的是UART5,直接在上一个kqm6600的基础上更改即可
//中断服务函数
void UART5_IRQHandler()//每次收到一个字节就会触发一次中断
{	
//判断接收中断是否发生
if(USART_GetITStatus(UART5, USART_IT_RXNE) == SET)
{
	//处理中断:保存数据
	su03t.rxbuff[su03t.rxlen++] = USART_ReceiveData(UART5);
	if(su03t.rxlen == 3)//触发了3次中断
	su03t.rxflag = 1;
	su03t.rxlen %= 5;//对5求余,他就一直会小于10
	//清理终端
	USART_ClearITPendingBit(UART5,USART_IT_RXNE);
}
}

3、发送已一个字节函数

//发送
void uart5_tx(uint8_t data)//参数就是要发送的数据
{
while(USART_GetFlagStatus(UART5, USART_FLAG_TXE )== RESET){}
	//上次的数据发送完成,为空表示上个数据已经发送完成
	//等待的时候是还没有发送,一旦发送完成,就变成1了
USART_SendData(UART5, data);
}

4、发送不定长数组

//发送不定长数组
void uart5_txbuff(uint8_t *buff,uint8_t len)
{
for(uint8_t i=0;i<len;i++)
	uart5_tx(buff[i]);

}

5、数据解析函数

//数据解析函数的模板:
//1、判断数据是否接收完毕
//2、错误判断(预热、校验。。。)
//3、解析数据
//4、清除接收缓冲区

void su03t_data_parsing(void)//解析
{
//1、判断数据是否接收完毕

if(su03t.rxflag == 1)
{
	if(su03t.rxlen !=3){            //因为发过来的数据为3位
		printf("数据长度错误\r\n");
		goto AAA;
	}
	
	
	//2、错误判断(预热、校验。。。)
	if(su03t.rxbuff[0] != 0xff  || su03t.rxbuff[2] != 0xAA)
	{
		printf("校验错误\r\n");
		goto AAA;
	}
		
	//3、解析数据
	
	switch(su03t.rxbuff[1])
	{
		case 1:
			LED1(1);
		break;//开灯
		case 2:
			LED1(0);
		break;//关灯
		case 3:
			_uart_co22(kqm.co2);
		//printf("co2:%.2fPPM\r\n",kqm.co2);
		break;//播报二氧化碳
		
	}

	
AAA:
		memset(su03t.rxbuff,0,10);
		su03t.rxlen = 0;
		su03t.rxflag = 0;
}


//4、清除接收缓冲区

}

1、判断数据是否接收完毕,首先是前面已经说过了,发送到单片机的数据为3位,并且由前面的中断服务函数可以知道,每次接收到一个字节就会触发一次中断,所以当接收到3个字节的时候,rxflag就会变成1,所以这里就是判断rxflag是否为1,如果为1就表示数据接收完毕了。
2、错误判断,如果数据不是3位,如果帧头和帧尾不正确
3、解析数据,对应的数据对应不同的操作
4、如果出现错误,就要清空数据

  • su03t.h中定义结构体
#ifndef _SU03T_H_
#define _SU03T_H_

#include "stdio.h"
#include "STM32f10x.h"

void su03t_init(void);

typedef struct {
	uint8_t rxbuff[5];//接收缓冲区 因为那里面传输了3字节
	uint8_t rxlen;		//接收计数值
	uint8_t rxflag;
	
	float voc;//空气质量
	float co2;//二氧化碳
	float hcho;//甲醛
}SU03T;

void uart5_txbuff(uint8_t *buff,uint8_t len);
void su03t_data_parsing(void);
#endif

6、在主函数中调用响应函数

int main()
{
	

	su03t_init();
	led_init();
	kqm6600_init();
	SysTick_Config(72000);
	usart_init();
	while(1)
	{
		if(sutime >=100)
		{
			sutime =0 ;
			su03t_data_parsing();
		}
		if(kqmtime >= 500)
		{
			kqmtime =0 ;
			kqm_data_parsing();
			
			if(kqm.voc >= 7)
			{
				relay_on();
				Delay_nms(100);
				relay_off();
			}
			//printf("1\r\n");
		}	
		
	}
}
  • 之后下载程序,就可以控制该模块了

alt text

alt text

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2179590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试|数据库常见面试题

在软件测试数据库的面试中&#xff0c;面试官通常会考察应聘者对数据库的理解、SQL语言的应用、数据库性能优化、以及数据库相关的技术栈和工具等方面的知识。以下是一些可能的面试问题及建议的回答思路&#xff1a; 1、什么是关系型数据库&#xff0c;主键&#xff0c;外键&am…

揭秘网络钓鱼:如何识破并防范这场数字时代的诈骗游戏

网络钓鱼是一种网络攻击&#xff0c;它利用伪装的电子邮件欺骗收件人提供信息、下载恶意软件或采取其他期望的行动。 网络钓鱼是网络害虫&#xff0c;自20世纪90年代初从暗网出现以来&#xff0c;至今仍危害全球。根据SlashNext的报告&#xff0c;2023年平均每天有31,000次网络…

SpringCloudAlibaba的nacos启动注册实现

首先安装nacos&#xff0c;注意看清楚版本号码&#xff0c;后面设置pom依赖的时候有用。 安装地址&#xff1a;Nacos 快速开始 | Nacos 官网 选择这里&#xff1a; 然后在这个跳转的页面中&#xff0c;找到你需要的版本&#xff0c;比如选择2.0.4 进入之后&#xff0c;选择你…

软考题-数据库2-数据模型/ER图/关系模式规范化

一、概念数据模型-ER图 1.概念数据模型-ER图的构件-属性的分类 属性分多值属性和单值属性&#xff0c;题目已经给出联系方式的值有手机电话和办公室电话&#xff0c;所以是多值属性 派生属性是由其他属性而来&#xff0c;年龄来自于出生年月 部门号是EMP表的外键二、关系模式 …

vue-element 表格组合查询 - fc-table-search 组件封装

开发目的 解决搜索form参数读取&#xff0c;配合异步请求&#xff0c;更新渲染数据&#xff1b;支持自适应高度&#xff0c;分页查询&#xff0c;搜索查询/重置。 额外提供formater类型&#xff1a;标签定义&#xff0c;金额&#xff0c;时间格式化&#xff0c;跨页勾选&#x…

Minstrel自动生成结构化提示,让AI为AI写提示词的多代理提示生成框架

在人工智能快速发展的今天&#xff0c;如何有效利用大型语言模型&#xff08;LLMs&#xff09;成为了一个普遍关注的话题。这是9月份的一篇论文&#xff0c;提出了LangGPT结构化提示框架和Minstrel多代理提示生成系统&#xff0c;为非AI专家使用LLMs提供了强大支持。 对于非人…

PHP人才机遇桥梁招聘求职全能系统小程序源码

人才机遇桥梁 —— 招聘求职全能系统全解析 &#x1f4bc;&#x1f680; &#x1f309; 搭建人才与机遇的桥梁 在这个竞争激烈的职场环境中&#xff0c;找到一份心仪的工作或招募到合适的人才&#xff0c;往往不是一件容易的事。但幸运的是&#xff0c;我们有了“人才机遇桥梁…

Hello-Java-Sec靶场搭建

安装环境&#xff1a;宝塔Linux面板 1.将靶场克隆到本地 git clone https://github.com/j3ers3/Hello-Java-Sec 2.安装maven yum install maven &#xff08;kali&#xff1a;apt install maven&#xff09; 3.安装成功后 mvn -v验证⼀下 4. 配置数据库连接&#xff0c;数据…

SysML图例-悬架作动器(Suspension Aactuator)

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>>

【Android】获取备案所需的公钥以及签名MD5值

目录 重要前提 获取签名MD5值 获取公钥 重要前提 生成jks文件以及gradle配置应用该文件。具体步骤请参考我这篇文章&#xff1a;【Android】配置Gradle打包apk的环境_generate signed bundle or apk-CSDN博客 你只需要从头看到该文章的配置build.gradle&#xff08;app&…

【议题征集 】上海站 nMeetup 将于十月份开启!

上海&#xff0c;作为我国的经济和金融中心&#xff0c;正迅速发展成为全球领先的科技创新城市。这座城市不仅拥有深厚的文化底蕴&#xff0c;还积极拥抱数字化转型&#xff0c;推动着数据库和人工智能基础设施的快速发展。第三站 nMeetup 我们将走进上海&#xff0c;本次活动由…

面向未来的设计:数字化转型时代的企业架构与建模革新

在数字化转型浪潮席卷全球的今天&#xff0c;企业架构&#xff08;Enterprise Architecture, EA&#xff09;与建模技术正成为引领未来业务发展的核心工具。企业如何设计面向未来的架构&#xff0c;不仅关乎技术的部署&#xff0c;更直接影响业务的战略定位和市场竞争力。《面向…

【PCL】Ubuntu22.04 安装 PCL 库

文章目录 前言一、更新系统软件包二、安装依赖项三、下载 PCL 源码四、编译和安装 PCL五、测试安装成功1、 pcd_write.cpp2、CMakeLists.txt3、build 前言 PCL&#xff08;Point Cloud Library&#xff09;是一个开源的大型项目&#xff0c;专注于2D/3D图像和点云处理。PCL为点…

创客匠人第二期“老蒋面对面”交流会圆满收官!

磅礴的大雨浇不灭奋斗的激情。9月24日&#xff0c;创客匠人第二期老蒋面对面—“创客匠人让知识变现不走弯路”内部大会在集美隆重举行。 本次内部大会旨在传递公司战略精神&#xff0c;深度探讨公司品牌传播的价值、方向和策略。这不仅是一次内部的交流与分享&#xff0c;更是…

详解 JDBC和连接池

目录 一.JDBC概述 1.介绍 2.好处 3.JDBC API 二.数据库连接 1.前置工作 2.方法一 3.方法二 4.方法三 5.方法四 6.方式五(配置文件) 三.ResultSet&#xff08;结果集&#xff09; 1.介绍 2.代码演示 3.底层原理 四.预处理 1.SQL注入 2.PreparedStatement 接口 …

一个很好的例子说明均值平滑滤波器有旁瓣泄漏效应

禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》P89

【C/C++】错题记录(二)

题目一 题目二 x是int型&#xff0c;当x被赋值为1.2浮点型时&#xff0c;x实际赋值为1&#xff0c;所以4.8/5.0由于/是整除&#xff0c;结果为小于1的小数&#xff0c;所以y被赋值为0。 题目三 题目四 题目五 题目六 在这段代码中&#xff0c;定义了一个联合体union X&#xf…

创建Vue项目的时出现:无法加载文件 E:\software\node\node_global\vue.ps1,因为在此系统上禁止运行脚本

创建Vue项目的时出现的问题:出现&#xff1a;无法加载文件 E:\software\node\node_global\vue.ps1&#xff0c;因为在此系统上禁止运行脚本 解决方法&#xff1a; .PowerShelll的执行政策阻止了该操作,用 get-ExecutionPolicy 查看执行策略的状态为受限 输入Set-ExecutionPo…

中关村环球时尚产业联盟 东晟时尚产业创新中心成立

2024年9月6日&#xff0c;中关村环球时尚产业联盟与东晟时尚创新科技&#xff08;北京&#xff09;有限公司于中关村科技园东城园举行了隆重的战略合作签约仪式。 中关村科技园东城园领导发表了致辞&#xff0c;并表示东城区作为首都北京的核心区域&#xff0c;拥有深厚的历史…

书生大模型实战训练营 第三期 入门岛

1.Linux 任务一 完成SSH连接与端口映射并运行hello_world.py vscode自带的端口设置功能很方便 2.Python 任务一 实现wordcount函数 任务二 vscode 单步调试