【STM32单片机】基于语音识别的智能分类垃圾桶,ld3320语音识别模块如何使用,mp3播放模块如何使用

文章目录

  • 需求
  • 语音识别模块
  • MY1690 播放模块
  • 舵机
  • 源码

需求

对于“可回收物”“有害垃圾”“厨余垃圾”“其它垃圾”,不能分清扔到哪个垃圾桶怎么办?

基于语音识别的智能分类垃圾桶,识别到关键词就打开对应的垃圾桶,完全没有分不清的烦恼。
在这里插入图片描述

//可回收物:塑料瓶、玻璃瓶、铝罐、纸张、纸板、报纸、纸质包装盒、金属罐头等。
//有害垃圾:废电池、废灯管、废荧光灯、废油漆、废杀虫剂、废药品、废电子产品等。
//厨余垃圾:剩菜剩饭、果皮果核、蔬菜瓜果的残余、茶叶渣、咖啡渣等。
//其他垃圾:烟蒂、一次性纸杯、一次性餐具、尘土、一次性尿布、卫生纸、旧衣物、陶瓷碎片等。

硬件:单片机,语音识别模块ld3320,4个舵机(垃圾桶),4个LED灯,4个按键,my1690和喇叭 。
软件:
1、 4个舵机对应 可回收物、有害垃圾、厨余垃圾、其它垃圾, 舵机为0度表示垃圾桶盖关闭,舵机为90度表示垃圾桶盖打开。视频里的垃圾桶那些东西属于手工活了,技术大老粗做手工不行,技术这边用舵机做了之后,客户需要自己把舵机安装在垃圾桶盖上。
2、 开机后语音播报“欢迎使用智能语音分类垃圾箱”
3、唤醒词“扔垃圾”,成功唤醒后,回复语音“请说出所扔垃圾种类或者垃圾名称”,客户说出物品名称,单片机打开对应舵机。 这里需要设定一些常见垃圾词和对应类别。
4、唤醒词“扔垃圾”,成功唤醒后,直接说“可回收物”“有害垃圾”“厨余垃圾”“其它垃圾”也可以打开对应垃圾箱。
5、唤醒后20秒无语音命令,则语音提示“操作完毕,如需重新操作请说扔垃圾”退出唤醒状态。
6、对应垃圾桶打开后,对应小灯应打开。对应垃圾桶关闭后,对应小灯应熄灭。
7、对应按键按下,则垃圾桶打开。对应按键松开,则垃圾桶关闭。

语音识别模块

使用STM32单片机。

5V给这个模块供电,这个模块是3.3V的ttl电平。

需要给这个模块下载程序,使用冷启动方式。

识别效果优化:比如“牛奶”,可以添加 niu nai 和 liu nai。

在这里插入图片描述

MY1690 播放模块

使用百度翻译或者其他软件获取 语音合成的声音mp3文件,将文件放入tf卡,命名是0001到9999。

5V供电,3.3v的ttl输出。

功放电流大,可能导致单片机失效,在程序最开始可以设置模块的声音小一点,1到33个等级。

对应代码:

void uart_send(u8 data) {while (USART_GetFlagStatus(USART2, USART_FLAG_TC) != SET); //等待发送结束USART_SendData(USART2, data);//向串口2发送数据}void bofang(void) {uart_send(0x7E);uart_send(0x03);uart_send(0x11);uart_send(0x12);uart_send(0xEF);
}void tingzhi(void) {uart_send(0x7E);uart_send(0x03);uart_send(0x1e);uart_send(0x1d);uart_send(0xEF);
}
void set_volume( unsigned char volume )
{unsigned char jiaoyan;unsigned char cmd = 0x31;if(volume<5){volume=5;}if(volume>30){volume=30;}jiaoyan = 0x04 ^ cmd;jiaoyan = jiaoyan ^ volume;//uart_send( 0x7E ); uart_send( 0x7E );       uart_send( 0x04 );       uart_send( cmd );        uart_send( volume );        uart_send( jiaoyan );    uart_send( 0xEF );       
}void select_song_number(unsigned char cs2) {unsigned char jiaoyan;unsigned char cmd = 0x41;unsigned char cs1 = 0;jiaoyan = 0x05 ^ cmd;jiaoyan = jiaoyan ^ cs1;jiaoyan = jiaoyan ^ cs2;//uart_send(0x7E);uart_send(0x7E);uart_send(0x05);uart_send(cmd);uart_send(cs1);uart_send(cs2);uart_send(jiaoyan);uart_send(0xEF);}

舵机

舵机20ms 的pwm驱动,1ms到2ms的高电平时间对应了不同的角度。

源码

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
void motor_contorl(u8 motor, u8 open) {//https://qq742971636.blog.csdn.net/article/details/115017052//手册可能写的是高电平是1ms到2ms,其实给0.5ms到2.5msif (motor == 1) {if (open) {TIM_SetCompare1(TIM3, 50);//舵机打开,意味着垃圾桶1打开LED1 = 0;//小灯打开} else {TIM_SetCompare1(TIM3, 100);//舵机关闭,意味着垃圾桶1关闭LED1 = 1;//小灯关闭}} else if (motor == 2) {if (open) {TIM_SetCompare2(TIM3, 50);//舵机打开,意味着垃圾桶2打开LED2 = 0;//小灯打开} else {TIM_SetCompare2(TIM3, 100);//舵机关闭,意味着垃圾桶2关闭LED2 = 1;//小灯关闭}} else if (motor == 3) {if (open) {TIM_SetCompare3(TIM3, 50);//舵机打开,意味着垃圾桶3打开LED3 = 0;//小灯打开} else {TIM_SetCompare3(TIM3, 100);//舵机关闭,意味着垃圾桶3关闭LED3 = 1;//小灯关闭}} else if (motor == 4) {if (open) {TIM_SetCompare4(TIM3, 50);//舵机打开,意味着垃圾桶4打开LED4 = 0;//小灯打开} else {TIM_SetCompare4(TIM3, 100);//舵机关闭,意味着垃圾桶4关闭LED4 = 1;//小灯关闭}}
}void uart_send(u8 data) {while (USART_GetFlagStatus(USART2, USART_FLAG_TC) != SET); //等待发送结束USART_SendData(USART2, data);//向串口2发送数据}void bofang(void) {uart_send(0x7E);uart_send(0x03);uart_send(0x11);uart_send(0x12);uart_send(0xEF);
}void tingzhi(void) {uart_send(0x7E);uart_send(0x03);uart_send(0x1e);uart_send(0x1d);uart_send(0xEF);
}
void set_volume( unsigned char volume )
{unsigned char jiaoyan;unsigned char cmd = 0x31;if(volume<5){volume=5;}if(volume>30){volume=30;}jiaoyan = 0x04 ^ cmd;jiaoyan = jiaoyan ^ volume;//uart_send( 0x7E ); uart_send( 0x7E );       uart_send( 0x04 );       uart_send( cmd );        uart_send( volume );        uart_send( jiaoyan );    uart_send( 0xEF );       
}void select_song_number(unsigned char cs2) {unsigned char jiaoyan;unsigned char cmd = 0x41;unsigned char cs1 = 0;jiaoyan = 0x05 ^ cmd;jiaoyan = jiaoyan ^ cs1;jiaoyan = jiaoyan ^ cs2;//uart_send(0x7E);uart_send(0x7E);uart_send(0x05);uart_send(cmd);uart_send(cs1);uart_send(cs2);uart_send(jiaoyan);uart_send(0xEF);}u8 sec_auto_close = 0;//自动关闭垃圾桶的计时器
u8 sec_auto_close_flag = 0;//自动关闭垃圾桶的计时器的标志位u8 no_command_flag = 0;//没有指令的标志位
u8 no_command = 0;//没有指令的计时器int main(void) {u8 key = 1;delay_init();             //延时函数初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);     //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(9600);USART2_Init(9600);USART3_Init(9600);LED_Init();                 //LED端口初始化KEY_Init();TIM3_PWM_Init(1000, 71 * 20);     //50HZ  20ms<-->1000 1ms<-->50  2ms<-->100motor_contorl(1, 0);//关闭垃圾桶舵机1motor_contorl(2, 0);//关闭垃圾桶舵机2motor_contorl(3, 0);//关闭垃圾桶舵机3motor_contorl(4, 0);//关闭垃圾桶舵机4TIM4_Int_Init(1000, 71 * 20);//20ms//delay_ms(200);set_volume(10);//delay_ms(200);select_song_number(0x01);//播放0001 欢迎使用智能语音分类垃圾箱while (1) {delay_ms(10);key = KEY_Scan(1);//得到键值if (key) {//有按键按下if (key == 1) {motor_contorl(1, 1);//打开垃圾桶舵机1} else if (key == 2) {motor_contorl(2, 1);//打开垃圾桶舵机2} else if (key == 3) {motor_contorl(3, 1);//打开垃圾桶舵机3} else if (key == 4) {motor_contorl(4, 1);//打开垃圾桶舵机4}while (KEY_Scan(1));motor_contorl(1, 0);//关闭垃圾桶舵机1motor_contorl(2, 0);//关闭垃圾桶舵机2motor_contorl(3, 0);//关闭垃圾桶舵机3motor_contorl(4, 0);//关闭垃圾桶舵机4}}
}//软件:
//1、 4个舵机对应 可回收物、有害垃圾、厨余垃圾、其它垃圾, 舵机为0度表示垃圾桶盖关闭,舵机为90度表示垃圾桶盖打开。视频里的垃圾桶那些东西属于手工活了,技术大老粗做手工不行,技术这边用舵机做了之后,客户需要自己把舵机安装在垃圾桶盖上。
//2、 开机后语音播报“欢迎使用智能语音分类垃圾箱”
//3、唤醒词“扔垃圾”,成功唤醒后,回复语音“请说出所扔垃圾种类或者垃圾名称”,客户说出物品名称,单片机打开对应舵机。  这里需要设定一些常见垃圾词和对应类别(客户补充一下)。
//4、唤醒词“扔垃圾”,成功唤醒后,直接说“可回收物”“有害垃圾”“厨余垃圾”“其它垃圾”也可以打开对应垃圾箱。
//5、唤醒后20秒无语音命令,则语音提示“操作完毕,如需重新操作请说扔垃圾”退出唤醒状态。
//6、对应垃圾桶打开后,对应小灯应打开。对应垃圾桶关闭后,对应小灯应熄灭。
//7、对应按键按下,则垃圾桶打开。对应按键松开,则垃圾桶关闭。//存放在my1690的sd卡的歌曲如下
//0001 欢迎使用智能语音分类垃圾箱
//0002 请说出所扔垃圾种类或者垃圾名称
//0003 操作完毕,如需重新操作请说扔垃圾//如果收到语音模块发过来的指令,每个指令需要对应操作
//指令1  0x00  成功唤醒
//指令2  0x02  识别到"可回收物"
//指令3  0x03  识别到"有害垃圾"
//指令4  0x04  识别到"厨余垃圾"
//指令5  0x05  识别到"其它垃圾"
//指令6  0x06  识别到"塑料瓶"
//指令7  0x07  识别到"电池"
//指令8  0x08  识别到"剩菜剩饭"
//指令9  0x09  识别到"烟头"//ld3320
void USART1_IRQHandler(void)                    //串口1中断服务程序
{u8 Res;if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res = USART_ReceiveData(USART1);    //读取接收到的数据if (Res == 0x00) {//select_song_number(0x01);//播放0001 欢迎使用智能语音分类垃圾箱no_command_flag = 1;//20秒无语音命令标志位   是唤醒状态!!!!!!!!!!!no_command = 20;//20秒自动关闭标志位select_song_number(0x02);//播放0002 请说出所扔垃圾种类或者垃圾名称}if (no_command_flag == 1)//是唤醒状态{if (Res == 0x02) {motor_contorl(1, 1);//打开垃圾桶舵机1sec_auto_close_flag = 1;//开启20秒自动关闭sec_auto_close = 20;//20秒自动关闭no_command_flag = 0;//有指令则无需再计时回答} else if (Res == 0x03) {motor_contorl(2, 1);//打开垃圾桶舵机2sec_auto_close_flag = 1;//开启20秒自动关闭sec_auto_close = 20;//20秒自动关闭no_command_flag = 0;//有指令则无需再计时回答} else if (Res == 0x04) {motor_contorl(3, 1);//打开垃圾桶舵机3sec_auto_close_flag = 1;//开启20秒自动关闭sec_auto_close = 20;//20秒自动关闭no_command_flag = 0;//有指令则无需再计时回答} else if (Res == 0x05) {motor_contorl(4, 1);//打开垃圾桶舵机4sec_auto_close_flag = 1;//开启20秒自动关闭sec_auto_close = 20;//20秒自动关闭no_command_flag = 0;//有指令则无需再计时回答} else if (Res == 0x06) {motor_contorl(1, 1);//打开垃圾桶舵机1sec_auto_close_flag = 1;//开启20秒自动关闭sec_auto_close = 20;//20秒自动关闭no_command_flag = 0;//有指令则无需再计时回答} else if (Res == 0x07) {motor_contorl(2, 1);//打开垃圾桶舵机2sec_auto_close_flag = 1;//开启20秒自动关闭sec_auto_close = 20;//20秒自动关闭no_command_flag = 0;//有指令则无需再计时回答} else if (Res == 0x08) {motor_contorl(3, 1);//打开垃圾桶舵机3sec_auto_close_flag = 1;//开启20秒自动关闭sec_auto_close = 20;//20秒自动关闭no_command_flag = 0;//有指令则无需再计时回答} else if (Res == 0x09) {motor_contorl(4, 1);//打开垃圾桶舵机4sec_auto_close_flag = 1;//开启20秒自动关闭sec_auto_close = 20;//20秒自动关闭no_command_flag = 0;//有指令则无需再计时回答}}}}//my1690
void USART2_IRQHandler(void) {u8 res;if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) /* 接收到数据 */{res = USART_ReceiveData(USART2);}
}//定时器4中断服务程序
void TIM4_IRQHandler(void)   //TIM4中断
{static u8 cnt = 0;if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源{TIM_ClearITPendingBit(TIM4, TIM_IT_Update);  //清除TIMx的中断待处理位:TIM 中断源cnt++;if (cnt == 50)//1秒{cnt = 0;if (sec_auto_close_flag)//开启20秒自动关闭{if (sec_auto_close) {sec_auto_close--;//20秒自动关闭计时} else {sec_auto_close_flag = 0;//关闭20秒自动关闭motor_contorl(1, 0);//关闭垃圾桶舵机1motor_contorl(2, 0);//关闭垃圾桶舵机2motor_contorl(3, 0);//关闭垃圾桶舵机3motor_contorl(4, 0);//关闭垃圾桶舵机4}}if (no_command_flag)//开启20秒自动关闭{if (no_command) {no_command--;//20秒自动关闭计时} else {no_command_flag = 0;//关闭20秒自动关闭select_song_number(0x03);//播放0003 没有听到您的指令.  操作完毕,如需重新操作请说扔垃圾}}}}
}

全部工程:
在这里插入图片描述
下载:https://github.com/xddun/blog_code_search

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一图解释 为什么选择实时云渲染而不是像素流?

首先我们要明白两个概念&#xff0c;实时云渲染和像素流到底是什么&#xff1f; 像素流送&#xff0c;指在用户看不到的计算机上远程运行UE开发的应用。虚幻引擎使用该计算机可用的资源&#xff08;CPU、GPU、内存等&#xff09;来运行游戏逻辑并渲染每一帧。它不断地将此渲染…

2023年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版

文章目录 一、问题求解&#xff1a;真题&#xff08;2023-01&#xff09;真题&#xff08;2023-02&#xff09;真题&#xff08;2023-03&#xff09;真题&#xff08;2023-04&#xff09;真题&#xff08;2023-05&#xff09;真题&#xff08;2023-06&#xff09;真题&#xff…

安防视频监控/视频融合/云存储EasyCVR页面数据显示不全该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

语文老师怎么和家长沟通

作为一位语文老师&#xff0c;深知教育不单单是传授知识&#xff0c;更是引导学生发展潜能&#xff0c;培养品格。而在这个过程中&#xff0c;与家长建立良好的沟通关系是至关重要的。 建立信任关系 与家长沟通的第一步是建立信任关系。作为老师&#xff0c;需要展现出专业、热…

Vim多行编辑

Vim多行编辑 Ctrlq进入多行编辑模式&#xff0c;然后上下选择要编辑的行 按下I或者Shifti&#xff0c;进入编辑模式 编辑的时候多行不会同时变化&#xff0c;不要担心&#xff0c;确实是多行编辑 编辑完成&#xff0c;想要结束多行编辑&#xff0c;按下Esc&#xff0c;此时…

一文例说嵌入式 C 程序的内聚和耦合

1 - 原理篇 低耦合&#xff0c;是指模块之间尽可能的使其独立存在&#xff0c;模块之间不产生联系不可能&#xff0c;但模块与模块之间的接口应该尽量少而简单。这样&#xff0c;高内聚从整个程序中每一个模块的内部特征角度&#xff0c;低耦合从程序中各个模块之间的关联关系…

社区新零售:重塑零售业的全新模式

社区新零售&#xff1a;重塑零售业的全新模式 近年来&#xff0c;新零售业成为了研究的焦点&#xff0c;它是一种以互联网为基础的零售形式。新零售通过运用先进技术手段&#xff0c;如大数据和人工智能&#xff0c;对商品的生产、流通和销售过程进行升级改造&#xff0c;重新构…

mysql处理40w数据脚本执行慢问题

需求背景&#xff1a; 2张表 SS_ZYXX 1w数据&#xff0c;WD_GZPZ 50w数据 SS_ZYXX.id WD_GZPZ.zyxx_id 找到SS_ZYXX表有数据&#xff0c;关联表WD_GZPZ没有数据的SS_ZYXX表的id 处理方案 方案一&#xff1a; 联合查询&#xff1a; 下面sql&#xff0c;在mysql执行时间3…

java第二十章总结多线程

20.2创建线程 20.2.1继承Thread类 Thread类是Java.lang包中的一个类&#xff0c;从这个类中实例化的对象代表线程&#xff0c;程序员启动一个新线程需要建议Thread实例。 public class ThreadTest extedns Thread{} run方法格式&#xff1a; public void run(){} 20.1让线程…

深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动

文章目录 前言一、输入系统的基本组成部分二、输入系统相关源码分析1、IMS 构建1.1、SystemServer # startOtherServices()1.2、InputManagerService1.3、NativeInputManager # nativeInit()1.4、NativeInputManager1.5、InputManager1.6、InputDispatcher1.7、InputReader1.8、…

实战Flask+BootstrapTable最实用服务端分页查询动态表头及数据(ajax方式)

看到这篇文章的朋友们是幸运的,我用了很久才实战出如下结果,且行且珍惜,祝好! 话不多说,有图有源码 1.看图,实现服务端动态表头数据,分页,查询,排序 1.数据准备 CREATE TABLE goods (id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) DEFAULT NULL COMMENT 商品名,no …

mac电脑下载Netflix Mac(奈飞客户端)安装教程

Netflix Mac&#xff0c;奈飞官方客户端&#xff0c;带给您无限的电影和剧集体验&#xff01;与朋友分享最新热门剧集、电影&#xff0c;与家人一起享受高品质的流媒体内容。 通过Netflix Mac&#xff0c;您可以轻松地搜索、浏览和观看各种类型的影片&#xff0c;包括剧情片、…