找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3326|回复: 0
收起左侧

智能语音垃圾桶带4路超声波测距(原理图PCB+STM32程序)

[复制链接]
ID:273434 发表于 2020-10-18 20:23 | 显示全部楼层 |阅读模式
智能语音垃圾桶带4路超声波测距,该系统采用语音模块设计,能够对语音进行识别,控制,并且四个超声波模块探测垃圾位置,看是否满?
里面包含C程序,基于stm32的,还有原理图。

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
51hei.png 51hei.png 51hei.png

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "steering.h"
  3. #include "usart_voice_rec.h"
  4. #include "usart_dfplayer.h"
  5. #include "dfplayer.h"
  6. #include "timer2_cap.h"
  7. #include "UltrasonicWave.h"
  8. #include "delay.h"
  9. #include "tim.h"
  10. #include "bsp_usart1.h"
  11. volatile uint32_t tim6_half_ms = 0;                                                                                                                                                 // 0.5ms 计时变量
  12. volatile uint8_t voice_receive_status = VOICE_RECEIVE_CMD_WAIT;                                 // 语音模块接收状态
  13. volatile uint8_t steering_cmd_target = STEERING_TARGET_NULL;                                                // 舵机操作等待对象
  14. volatile uint8_t steering_cmd_status = STEERING_CMD_WAIT;                                                                // 舵机操作等待指令

  15. void SteeringToON(void);
  16. void SteeringToOFF(void);
  17. void DelayMs(uint16_t ms);

  18. /**
  19.   * @brief  主函数
  20.   * @param  无  
  21.   * @retval 无
  22.   */
  23. int main(void)
  24. {
  25.     unsigned char count=0;
  26.         delay_init();
  27.    
  28.     NVIC_Configuration1();
  29.     TIM2_Cap_Init(0xffff,72-1); //以1Mhz的频率计数
  30.     UltrasonicWave_Configuration();
  31.     /* USART1 配置模式为 115200 8-N-1,中断接收 */
  32.         USART1_Config();
  33.    
  34.         // 初始化舵机控制io端口
  35.         STEERING_GPIO_Config();
  36.         
  37.         // 配置语音识别模块usart
  38.         VIOCE_REC_USART_Config();
  39.         // 配置语音播放模块usart
  40.         DFPLAYER_USART_Config();
  41.         
  42.         //基本定时器 TIMx,x[6,7] 定时配置
  43.    
  44.         BASIC_TIM_Config();
  45.         DFPlayer_SetVolume(30);
  46.         // 开机语音问好
  47.         DFPlayer_Play(VOICE_RECEIVE_CMD_1);
  48.    
  49.   while(1)
  50.   {
  51.           switch(count)
  52.               {case 0:UltrasonicWave_StartMeasure();
  53.                   count=1;
  54.                           break;
  55.                 case 1:UltrasonicWave_StartMeasure2();
  56.                  count=2;
  57.                          break;        
  58.                 case 2:UltrasonicWave_StartMeasure3();
  59.                  count=3;
  60.                          break;               
  61.                 case 3:UltrasonicWave_StartMeasure4();
  62.                  count=0;
  63.                          break;
  64.           }
  65.           printf("1:%d|2:%d|3:%d|4:%d\n",tempup1,tempup2,tempup3,tempup4);
  66.           if(tempup1>10&&tempup1<50)
  67.           {
  68.             printf("1号垃圾桶满了\n");
  69.           }
  70.           if(tempup2>10&&tempup2<50)
  71.           {
  72.             printf("2号垃圾桶满了\n");
  73.           }
  74.           if(tempup3>10&&tempup3<50)
  75.           {
  76.             printf("3号垃圾桶满了\n");
  77.           }
  78.           if(tempup4>10&&tempup4<50)
  79.           {
  80.             printf("4号垃圾桶满了\n");
  81.           }
  82.          
  83.           delay_ms(500);
  84.          
  85.                 // 识别到语音命令 & 所有舵机已经没有待执行的命令
  86.                 if(voice_receive_status != VOICE_RECEIVE_CMD_WAIT && steering_cmd_status == STEERING_CMD_WAIT){
  87.                         // 播放相应的语音
  88.                         DFPlayer_Play(voice_receive_status);
  89.                         DelayMs(1000);
  90.                         if(voice_receive_status != VOICE_RECEIVE_CMD_1){
  91.                                 steering_cmd_status = STEERING_CMD_OPEN;
  92.                                 if(voice_receive_status == VOICE_RECEIVE_CMD_2_RECYCLABLE){
  93.                                         steering_cmd_target = STEERING_TARGET_RECYCLABLE;
  94.                                 } else if(voice_receive_status == VOICE_RECEIVE_CMD_2_KITCHEN){
  95.                                         steering_cmd_target = STEERING_TARGET_KITCHEN;
  96.                                 } else if(voice_receive_status == VOICE_RECEIVE_CMD_2_HARMFUL){
  97.                                         steering_cmd_target = STEERING_TARGET_HARMFUL;
  98.                                 } else if(voice_receive_status == VOICE_RECEIVE_CMD_2_OTHER){
  99.                                         steering_cmd_target = STEERING_TARGET_OTHER;
  100.                                 }
  101.                         }
  102.                         // 清除语音识别状态位
  103.                         voice_receive_status = VOICE_RECEIVE_CMD_WAIT;
  104.                 }
  105.                
  106.                 // 有指令等待被执行
  107.                 if(steering_cmd_status != STEERING_CMD_WAIT){
  108.                         // 开启垃圾桶
  109.                         tim6_half_ms = 0;
  110.                         uint16_t all_half_ms = 0;
  111.                         while(steering_cmd_status == STEERING_CMD_OPEN){
  112.                                 if(tim6_half_ms < STEERING_PWM_HI_TIME){
  113.                                         SteeringToON();
  114.                                 } else {
  115.                                         SteeringToOFF();
  116.                                         // 一个pwm周期
  117.                                         if(tim6_half_ms >= STEERING_PWM_PERIOD){
  118.                                                 tim6_half_ms = 0;
  119.                                                 all_half_ms += STEERING_PWM_PERIOD;
  120.                                         }
  121.                                 }
  122.                                 // 开启保持
  123.                                 if(all_half_ms == STEERING_OPEN_KEEP_TIME){
  124.                                         steering_cmd_status = STEERING_CMD_CLOSE;
  125.                                 }
  126.                         }
  127.                         // 关闭垃圾桶
  128.                         steering_cmd_status = STEERING_CMD_CLOSE;
  129.                         tim6_half_ms = 0;
  130.                         all_half_ms = 0;
  131.                         while(steering_cmd_status == STEERING_CMD_CLOSE){
  132.                                 if(tim6_half_ms < STEERING_PWM_LO_TIME){
  133.                                         SteeringToON();
  134.                                 } else {
  135.                                         SteeringToOFF();
  136.                                         // 一个pwm周期
  137.                                         if(tim6_half_ms >= STEERING_PWM_PERIOD){
  138.                                                 tim6_half_ms = 0;
  139.                                                 all_half_ms += STEERING_PWM_PERIOD;
  140.                                         }
  141.                                 }
  142.                                 // 关闭保持
  143.                                 if(all_half_ms == STEERING_CLOSE_KEEP_TIME){
  144.                                         steering_cmd_target = STEERING_TARGET_NULL;
  145.                                         steering_cmd_status = STEERING_CMD_WAIT;
  146.                                 }
  147.                         }
  148.                 }
  149.                
  150.   }
  151. }

  152. void SteeringToON(void){
  153.         if(steering_cmd_target == STEERING_TARGET_RECYCLABLE){
  154.                 RECYCLABLE_ON;
  155.         } else if(steering_cmd_target == STEERING_TARGET_KITCHEN){
  156.                 KITCHEN_ON;
  157.         } else if(steering_cmd_target == STEERING_TARGET_HARMFUL){
  158.                 HARMFUL_ON;
  159.         } else if(steering_cmd_target == STEERING_TARGET_OTHER){
  160.                 OTHER_ON;
  161.         }
  162. }

  163. void SteeringToOFF(void){
  164.         if(steering_cmd_target == STEERING_TARGET_RECYCLABLE){
  165.                 RECYCLABLE_OFF;
  166.         } else if(steering_cmd_target == STEERING_TARGET_KITCHEN){
  167.                 KITCHEN_OFF
  168.         } else if(steering_cmd_target == STEERING_TARGET_HARMFUL){
  169.                 HARMFUL_OFF
  170.         } else if(steering_cmd_target == STEERING_TARGET_OTHER){
  171.                 OTHER_OFF;
  172.         }
  173. }

  174. void DelayMs(uint16_t ms){
  175.         tim6_half_ms = 0;
  176.         while(tim6_half_ms < ms * 2);
  177. }
  178. /*********************************************END OF FILE**********************/
复制代码

所有资料51hei提供下载(PCB+程序):
新建文件夹.7z (11.46 MB, 下载次数: 133)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表