[其他ST产品] STM32语音识别分类智能垃圾桶控制系统设计

[复制链接]
 楼主| 远芳侵古道 发表于 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 | 显示全部楼层
三、部分代码
  1. //单片机头文件
  2. #include "stm32f10x.h"
  3. #include "stm32f10x_gpio.h"
  4. #include "stm32f10x_rcc.h"
  5. //网络协议层
  6. #include "onenet.h"
  7. //网络设备
  8. #include "esp8266.h"
  9. //硬件驱动
  10. #include "delay.h"
  11. #include "usart.h"
  12. //C库
  13. #include <string.h>
  14. #include "PWM.h"
  15. #include "jidianqi.h"

  16. #include "YuYin.h"
  17. #include "MP3.h"
  18. #include "SysTick.h"
  19. #include "oled.h"


  20. char T[5]={0,0,0};
  21. char H[5]={0,0,0};
  22. u16 temperature=0,humidity=0;
  23. char ret;
  24. u8 hump_temp[10];


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

  26. unsigned char *dataPtr = NULL;

  27. short flag = 0;

  28. u8 Target1=0;
  29. u8 Target2=0;
  30. u8 Target3=0;
  31. u8 Target4=0;

  32. u8 all_staus = 0;

  33. u8 Open_JumpEdge=0;
  34. u8 WakeUp_Flag=0;



  35. /功能函数

  36. /*
  37. ************************************************************
  38. *        函数名称:        Hardware_Init
  39. *
  40. *        函数功能:        硬件初始化
  41. *
  42. *        入口参数:        无
  43. *
  44. *        返回参数:        无
  45. *
  46. *        说明:                初始化单片机功能以及外接设备
  47. ************************************************************
  48. */
  49. void Hardware_Init(void)
  50. {
  51.        
  52.                 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //中断控制器分组设置
  53.        
  54.                 delay_init();                                                                        //systick初始化
  55.           Usart3_Init(115200);                                  //串口3,驱动ESP8266用
  56.                 PWM_Init();                   //初始化PWM
  57.           ESP8266_Init();                                              //初始化ESP8266
  58.                 LED_Config();                                                                        //初始化LED指示灯或者说是继电器
  59.                
  60.                 YuYin_Init();                                                                        //语音识别初始化
  61.                 MP3_Init();                                                                                //播放模块初始化
  62.                 SysTick_Init();                                                                //公共定时器初始化
  63.        
  64.                 OLED_Init();                                                                        //OLED屏初始化

  65.        
  66. }


  67. /*
  68. ************************************************************
  69. *        函数名称:         Keep_Connet_Esp8266
  70. *
  71. *        函数功能:        不断上传数据,使之保持接入物联网平台
  72. *
  73. *        入口参数:        无
  74. *
  75. *        返回参数:        无
  76. *
  77. *        说明:                一旦停止数据上传,物联网平台会断开
  78. ************************************************************
  79. */
  80. void Keep_Connet_Esp8266 (void)
  81. {
  82.        
  83.                         if(++timeCount >= 2000)                                                                        //发送间隔20s
  84.                                 {
  85.                                         OneNet_SendData();                                                                        //发送数据               
  86.                                         timeCount = 0;
  87.                                         ESP8266_Clear();
  88.                                 }
  89.                                
  90.                                 dataPtr = ESP8266_GetIPD(0);
  91.                                 if(dataPtr != NULL)
  92.                                         OneNet_RevPro(dataPtr);
  93.                                
  94.                                 delay_ms(10);
  95.                                
  96. }


  97. /*
  98. ************************************************************
  99. *        函数名称:        main
  100. *
  101. *        函数功能:       
  102. *
  103. *        入口参数:        无
  104. *
  105. *        返回参数:        0
  106. *
  107. *        说明:               
  108. ***
  109. *********************************************************
  110. */
  111. int main(void)
  112. {
  113.        

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

  115.         while(OneNet_DevLink())                        //接入OneNET
  116.                 delay_ms(500);

  117.         OLED_CLS();
  118.         ShowSmartTrash();                                //显示“智能垃圾桶”
  119.         Show_Author();                                        //显示“设计·作者名“
  120.         //ShowTemperature();                        //显示”温湿度”
  121.        
  122.        
  123.         while(1)
  124.         {
  125.                
  126.                
  127.                                 Keep_Connet_Esp8266();
  128.                
  129.                
  130.                                 if(YuYin_RX_STA == 1)
  131.                                 {
  132.                                         if(MP3_State() == 0)
  133.                                         {
  134.                                                 if(YuYin_RX_CMD==49 || YuYin_RX_CMD==50)
  135.                                                 {
  136.                                                         WakeUp_Flag = 1;
  137.                                                         MP3_Star(5);
  138.                                                 }
  139.                                                 else if(WakeUp_Flag == 1)
  140.                                                 {
  141.                                                         WakeUp_Flag=0;
  142.                                                        
  143.                                                         if(YuYin_RX_CMD%4 == 1)
  144.                                                         {
  145.                                                                 MP3_Star(1);
  146.                                                                 Target1 = 1;
  147.                                                                 Show_chiyu();
  148.                                                         }
  149.                                                         else if(YuYin_RX_CMD%4 == 2)
  150.                                                         {
  151.                                                                 MP3_Star(2);
  152.                                                                 Target2 = 1;
  153.                                                                 Show_qita();
  154.                                                         }
  155.                                                         else if(YuYin_RX_CMD%4 == 3)
  156.                                                         {
  157.                                                                 MP3_Star(3);
  158.                                                                 Target3 = 1;
  159.                                                                 Show_youhai();
  160.                                                         }
  161.                                                         else
  162.                                                         {
  163.                                                                 MP3_Star(4);
  164.                                                                 Target4 = 1;
  165.                                                                 Show_kehuishou();
  166.                                                         }
  167.                                                 }
  168.                                         }
  169.                                        
  170.                                         YuYin_RX_STA = 0;
  171.                                 }
  172.                
  173.                 if(SysTick_JumpEdge(&Open_JumpEdge, &SysTickBit.Time1s)==1)
  174.                 {
  175.                   if(Target1 != 0)
  176.                         {
  177.                           Target1++;
  178.                                 TIM_SetCompare1(TIM4,700);
  179.                                 if(Target1>6)
  180.                                 {                                       
  181.                                         TIM_SetCompare1(TIM4,500);                                       
  182.                                   Target1 = 0;
  183.                                         ShowTrashNoPeople();
  184.                                 }                                       
  185.                         }
  186.                         if(Target2 != 0)
  187.                         {
  188.                                 Target2++;
  189.                                 TIM_SetCompare2(TIM4,900);
  190.                                 if(Target2>6)
  191.                                 {
  192.                                         TIM_SetCompare2(TIM4,600);
  193.                                         ShowTrashNoPeople();
  194.                                         Target2 = 0;
  195.                                 }       
  196.                         }       
  197.                         if(Target3 != 0)
  198.                         {
  199.                                 Target3++;
  200.                                 TIM_SetCompare4(TIM4,900);                        //有害
  201.                                 if(Target3>6)
  202.                                 {
  203.                                         TIM_SetCompare4(TIM4,500);
  204.                                         ShowTrashNoPeople();
  205.                                         Target3 = 0;
  206.                                 }       
  207.                         }
  208.                         if(Target4 != 0)
  209.                         {
  210.                                 Target4++;
  211.                                 TIM_SetCompare3(TIM4,900);                        //可回收
  212.                                 if(Target4>6)
  213.                                 {
  214.                                         TIM_SetCompare3(TIM4,550);
  215.                                         ShowTrashNoPeople();
  216.                                         Target4 = 0;
  217.                                 }       
  218.                         }
  219.                 }
  220.                
  221.                 switch( flag )
  222.                 {
  223.                         case 1 :GPIO_SetBits(GPIOA,GPIO_Pin_1); break;
  224.                         case 2 :GPIO_ResetBits(GPIOA, GPIO_Pin_1); break;
  225.                         case 3 :TIM_SetCompare1(TIM4,700);break;
  226.                         case 4 :TIM_SetCompare1(TIM4,500);break;
  227.                         case 5 :TIM_SetCompare2(TIM4,900);break;
  228.                         case 6 :TIM_SetCompare2(TIM4,600);break;
  229.                         case 7 :TIM_SetCompare4(TIM4,900);break;
  230.                         case 8 :TIM_SetCompare4(TIM4,500);break;
  231.                         case 9 :TIM_SetCompare3(TIM4,900);break;
  232.                         case 10:TIM_SetCompare3(TIM4,550);break;

  233.                 }
  234.                
  235.                
  236.         }
  237. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

886

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部