[其他ST产品]

STM32语音识别分类智能垃圾桶控制系统设计

[复制链接]
145|3
手机看帖
扫描二维码
随时随地手机跟帖
远芳侵古道|  楼主 | 2023-1-31 00:19 | 显示全部楼层 |阅读模式
一、电路设计

        离线语音识别识别垃圾种类并且垃圾桶自动翻盖:说出唤醒词“垃圾桶”后,再说一句垃圾名称,语音识别模块端识别到相应关键词,便会将结果通过串口发送到STM32端,STM32端接着会发送打开相应垃圾桶盖的指令,6s后,垃圾桶盖自动关闭。其中翻盖功能是通过STM32端控制舵机实现。

        语音播报功能:STM32端若判断到有人说出唤醒词了,通过串口发送指令给语音播报模块,外放喇叭便会播报“你好”的音频,若判断到相应的垃圾种类,便会播报相应的垃圾种类音频。

        APP/网页端远程控制垃圾桶:STM32端通过串口连接WIFI模块esp8266-01s,接入Onenet云平台,实现联网功能,通过云端下达指令给设备,从而控制垃圾桶实现翻盖及控制继电器通断。

        OLED屏显示信息:OLED屏可以显示作者的相关信息、及每次语音播报也会显示相应文字信息。

硬件组成

        智能垃圾桶的开发板用到的是STM32F103C8T6最小系统板,各个模块间都是通过串口和主控进行通信。硬件电路上的连接画一个PCB接口板即可,所有模块都可以通过排针或排母直接插上去。由于用到了4个舵机,所以整个系统的供电系统需要用5V2A的电源适配器。

所用到的各个模块材料清单如下图:
7138963d7ee1bb148d.png

使用特权

评论回复
远芳侵古道|  楼主 | 2023-1-31 00:20 | 显示全部楼层
原理图
2741463d7ee36c946b.png

使用特权

评论回复
远芳侵古道|  楼主 | 2023-1-31 00:21 | 显示全部楼层
原理图

8754263d7ee91db598.png

161463d7ee9f6787b.png

使用特权

评论回复
远芳侵古道|  楼主 | 2023-1-31 00:23 | 显示全部楼层
三、部分代码
//单片机头文件
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
//网络协议层
#include "onenet.h"
//网络设备
#include "esp8266.h"
//硬件驱动
#include "delay.h"
#include "usart.h"
//C库
#include <string.h>
#include "PWM.h"
#include "jidianqi.h"

#include "YuYin.h"
#include "MP3.h"
#include "SysTick.h"
#include "oled.h"


char T[5]={0,0,0};
char H[5]={0,0,0};
u16 temperature=0,humidity=0;
char ret;
u8 hump_temp[10];


unsigned short timeCount = 0;        //发送间隔变量

unsigned char *dataPtr = NULL;

short flag = 0;

u8 Target1=0;
u8 Target2=0;
u8 Target3=0;
u8 Target4=0;

u8 all_staus = 0;

u8 Open_JumpEdge=0;
u8 WakeUp_Flag=0;



/功能函数

/*
************************************************************
*        函数名称:        Hardware_Init
*
*        函数功能:        硬件初始化
*
*        入口参数:        无
*
*        返回参数:        无
*
*        说明:                初始化单片机功能以及外接设备
************************************************************
*/
void Hardware_Init(void)
{
       
                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //中断控制器分组设置
       
                delay_init();                                                                        //systick初始化
          Usart3_Init(115200);                                  //串口3,驱动ESP8266用
                PWM_Init();                   //初始化PWM
          ESP8266_Init();                                              //初始化ESP8266
                LED_Config();                                                                        //初始化LED指示灯或者说是继电器
               
                YuYin_Init();                                                                        //语音识别初始化
                MP3_Init();                                                                                //播放模块初始化
                SysTick_Init();                                                                //公共定时器初始化
       
                OLED_Init();                                                                        //OLED屏初始化

       
}


/*
************************************************************
*        函数名称:         Keep_Connet_Esp8266
*
*        函数功能:        不断上传数据,使之保持接入物联网平台
*
*        入口参数:        无
*
*        返回参数:        无
*
*        说明:                一旦停止数据上传,物联网平台会断开
************************************************************
*/
void Keep_Connet_Esp8266 (void)
{
       
                        if(++timeCount >= 2000)                                                                        //发送间隔20s
                                {
                                        OneNet_SendData();                                                                        //发送数据               
                                        timeCount = 0;
                                        ESP8266_Clear();
                                }
                               
                                dataPtr = ESP8266_GetIPD(0);
                                if(dataPtr != NULL)
                                        OneNet_RevPro(dataPtr);
                               
                                delay_ms(10);
                               
}


/*
************************************************************
*        函数名称:        main
*
*        函数功能:       
*
*        入口参数:        无
*
*        返回参数:        0
*
*        说明:               
***
*********************************************************
*/
int main(void)
{
       

        Hardware_Init();                                //初始化外围硬件

        while(OneNet_DevLink())                        //接入OneNET
                delay_ms(500);

        OLED_CLS();
        ShowSmartTrash();                                //显示“智能垃圾桶”
        Show_Author();                                        //显示“设计·作者名“
        //ShowTemperature();                        //显示”温湿度”
       
       
        while(1)
        {
               
               
                                Keep_Connet_Esp8266();
               
               
                                if(YuYin_RX_STA == 1)
                                {
                                        if(MP3_State() == 0)
                                        {
                                                if(YuYin_RX_CMD==49 || YuYin_RX_CMD==50)
                                                {
                                                        WakeUp_Flag = 1;
                                                        MP3_Star(5);
                                                }
                                                else if(WakeUp_Flag == 1)
                                                {
                                                        WakeUp_Flag=0;
                                                       
                                                        if(YuYin_RX_CMD%4 == 1)
                                                        {
                                                                MP3_Star(1);
                                                                Target1 = 1;
                                                                Show_chiyu();
                                                        }
                                                        else if(YuYin_RX_CMD%4 == 2)
                                                        {
                                                                MP3_Star(2);
                                                                Target2 = 1;
                                                                Show_qita();
                                                        }
                                                        else if(YuYin_RX_CMD%4 == 3)
                                                        {
                                                                MP3_Star(3);
                                                                Target3 = 1;
                                                                Show_youhai();
                                                        }
                                                        else
                                                        {
                                                                MP3_Star(4);
                                                                Target4 = 1;
                                                                Show_kehuishou();
                                                        }
                                                }
                                        }
                                       
                                        YuYin_RX_STA = 0;
                                }
               
                if(SysTick_JumpEdge(&Open_JumpEdge, &SysTickBit.Time1s)==1)
                {
                  if(Target1 != 0)
                        {
                          Target1++;
                                TIM_SetCompare1(TIM4,700);
                                if(Target1>6)
                                {                                       
                                        TIM_SetCompare1(TIM4,500);                                       
                                  Target1 = 0;
                                        ShowTrashNoPeople();
                                }                                       
                        }
                        if(Target2 != 0)
                        {
                                Target2++;
                                TIM_SetCompare2(TIM4,900);
                                if(Target2>6)
                                {
                                        TIM_SetCompare2(TIM4,600);
                                        ShowTrashNoPeople();
                                        Target2 = 0;
                                }       
                        }       
                        if(Target3 != 0)
                        {
                                Target3++;
                                TIM_SetCompare4(TIM4,900);                        //有害
                                if(Target3>6)
                                {
                                        TIM_SetCompare4(TIM4,500);
                                        ShowTrashNoPeople();
                                        Target3 = 0;
                                }       
                        }
                        if(Target4 != 0)
                        {
                                Target4++;
                                TIM_SetCompare3(TIM4,900);                        //可回收
                                if(Target4>6)
                                {
                                        TIM_SetCompare3(TIM4,550);
                                        ShowTrashNoPeople();
                                        Target4 = 0;
                                }       
                        }
                }
               
                switch( flag )
                {
                        case 1 :GPIO_SetBits(GPIOA,GPIO_Pin_1); break;
                        case 2 :GPIO_ResetBits(GPIOA, GPIO_Pin_1); break;
                        case 3 :TIM_SetCompare1(TIM4,700);break;
                        case 4 :TIM_SetCompare1(TIM4,500);break;
                        case 5 :TIM_SetCompare2(TIM4,900);break;
                        case 6 :TIM_SetCompare2(TIM4,600);break;
                        case 7 :TIM_SetCompare4(TIM4,900);break;
                        case 8 :TIM_SetCompare4(TIM4,500);break;
                        case 9 :TIM_SetCompare3(TIM4,900);break;
                        case 10:TIM_SetCompare3(TIM4,550);break;

                }
               
               
        }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

735

帖子

0

粉丝