当前位置:   article > 正文

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

stm32垃圾分类

需求

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

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

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

硬件:单片机,语音识别模块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);

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

舵机

舵机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.5ms
    if (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<-->100
    motor_contorl(1, 0);//关闭垃圾桶舵机1
    motor_contorl(2, 0);//关闭垃圾桶舵机2
    motor_contorl(3, 0);//关闭垃圾桶舵机3
    motor_contorl(4, 0);//关闭垃圾桶舵机4

    TIM4_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);//关闭垃圾桶舵机1
            motor_contorl(2, 0);//关闭垃圾桶舵机2
            motor_contorl(3, 0);//关闭垃圾桶舵机3
            motor_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);//打开垃圾桶舵机1
                sec_auto_close_flag = 1;//开启20秒自动关闭
                sec_auto_close = 20;//20秒自动关闭

                no_command_flag = 0;//有指令则无需再计时回答
            } else if (Res == 0x03) {
                motor_contorl(2, 1);//打开垃圾桶舵机2
                sec_auto_close_flag = 1;//开启20秒自动关闭
                sec_auto_close = 20;//20秒自动关闭

                no_command_flag = 0;//有指令则无需再计时回答
            } else if (Res == 0x04) {
                motor_contorl(3, 1);//打开垃圾桶舵机3
                sec_auto_close_flag = 1;//开启20秒自动关闭
                sec_auto_close = 20;//20秒自动关闭

                no_command_flag = 0;//有指令则无需再计时回答
            } else if (Res == 0x05) {
                motor_contorl(4, 1);//打开垃圾桶舵机4
                sec_auto_close_flag = 1;//开启20秒自动关闭
                sec_auto_close = 20;//20秒自动关闭

                no_command_flag = 0;//有指令则无需再计时回答
            } else if (Res == 0x06) {
                motor_contorl(1, 1);//打开垃圾桶舵机1
                sec_auto_close_flag = 1;//开启20秒自动关闭
                sec_auto_close = 20;//20秒自动关闭

                no_command_flag = 0;//有指令则无需再计时回答
            } else if (Res == 0x07) {
                motor_contorl(2, 1);//打开垃圾桶舵机2
                sec_auto_close_flag = 1;//开启20秒自动关闭
                sec_auto_close = 20;//20秒自动关闭

                no_command_flag = 0;//有指令则无需再计时回答
            } else if (Res == 0x08) {
                motor_contorl(3, 1);//打开垃圾桶舵机3
                sec_auto_close_flag = 1;//开启20秒自动关闭
                sec_auto_close = 20;//20秒自动关闭

                no_command_flag = 0;//有指令则无需再计时回答
            } else if (Res == 0x09) {
                motor_contorl(4, 1);//打开垃圾桶舵机4
                sec_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);//关闭垃圾桶舵机1
                    motor_contorl(2, 0);//关闭垃圾桶舵机2
                    motor_contorl(3, 0);//关闭垃圾桶舵机3
                    motor_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 没有听到您的指令.  操作完毕,如需重新操作请说扔垃圾

                }
            }

        }
    }
}



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331

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

帮助、问询
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/520043
推荐阅读
相关标签
  

闽ICP备14008679号