【STM32项目开源】基于STM32的智能语音分类垃圾桶
目录
一、设计背景和意义
1.1设计背景
1.2设计意义
二、实物效果展示
2.1实物图片
2.2实物演示视频
三、硬件功能简介
3.1项目功能详解
3.2元器件清单
四、主框图与软件流程图
五、硬件PCB展示
六、软件程序设计
七、项目资料包内容
资料获取:查看主页介绍“充哥单片机设计”
一、设计背景和意义
1.1设计背景
近年来,随着社会对生态文明建设的不断重视和国家垃圾分类政策的强力推进,城市垃圾处理逐渐向智能化、精细化发展。传统垃圾桶功能单一,依赖用户主观判断垃圾类别,不仅导致分类准确率低,还增加了环卫人员的二次分拣负担。此外,用户在垃圾投放过程中面临“分类知识不清楚”“分类过程麻烦”等现实问题,使得垃圾分类推广效果不尽理想。为了解决这些痛点,急需一种便捷、高效且具备人机交互功能的智能垃圾分类系统,辅助居民完成正确的分类投放操作。
1.2设计意义
本课题“智能语音分类垃圾桶”正是针对上述问题,结合当下嵌入式控制技术与物联网通信手段,提出以STM32单片机为核心控制平台,集成语音识别模块、光电红外传感器、舵机执行机构和蓝牙通信模块,构建一个能听懂人类指令、能够根据垃圾类型自动分类并进行实时反馈的智能系统。该系统不仅能实现用户语音输入垃圾名称并自动开启相应桶盖的功能,还能通过传感器对垃圾桶溢满情况进行监控,并通过手机APP实现远程查看和控制,极大地增强了系统的智能性与实用性。
二、实物效果展示
2.1实物图片
2.2实物演示视频
【开源】基于STM32的智能语音分类垃圾桶
三、硬件功能简介
3.1项目功能详解
1.语音识别:识别语音指令打开特定的垃圾桶。
2.识别分类:根据说出的垃圾名自动识别分类并且打开对应的垃圾桶。
3.按键控制:按键控制打开对应类型的垃圾桶。
4.溢满检测:通过红外光电传感器识别四个垃圾桶是否溢满
5.舵机驱动:四个舵机驱动控制垃圾桶的开关。
6.OLED显示:显示垃圾桶的开关状态和溢满状态
7.蓝牙App:蓝牙App可远程监控四个垃圾桶的溢满信息,并且控制四个垃圾桶的开关。
3.2元器件清单
- 主控STM32F103C8T6最小统板
- OLED显示屏幕
- JDY31-APP蓝牙模块
- 红外对管
- SU03T语音模块
- 舵机
- 按键
- LED指示灯
四、主框图与软件流程图
主框图
流程图
五、硬件PCB展示
六、软件程序设计
/**********************************
包含头文件
**********************************/
#include "sys.h"
#include "stdio.h"
#include "string.h"
#include "delay.h"
#include "gpio.h"
#include "key.h"
#include "usart.h"
#include "motor_duoji.h"/**********************************
变量定义
**********************************/
uint8_t key_num = 0; //按键扫描标志位
uint32_t time_num = 0; //10ms计时
uint8_t flag_waste_1 = 0; //可回收垃圾桶标志位
uint8_t flag_waste_2 = 0; //厨余垃圾桶标志位
uint8_t flag_waste_3 = 0; //有害垃圾桶标志位
uint8_t flag_waste_4 = 0; //其他垃圾桶标志位
extern uint8_t usart2_buf[64]; //串口2接收数组/**********************************
函数声明
**********************************/
void Key_function(void); //按键函数
void Monitor_function(void); //监测函数
void Manage_function(void); //处理函数/****
******* 主函数
*****/
int main()
{Delay_Init(); //延时初始化 Gpio_Init(); //IO初始化Key_Init(); //按键初始化Motor_Duoji_Init(); //舵机初始化Motor_Duoji2_Init(); //舵机初始化Usart1_Init(9600); //串口1初始化Usart2_Init(9600); //串口2初始化TIM_SetCompare1(TIM1,1850); //PWM输出Delay_ms(100); //延时100msTIM_SetCompare4(TIM1,1850); //PWM输出Delay_ms(100); //延时100msTIM_SetCompare1(TIM2,1850); //PWM输出Delay_ms(100); //延时100msTIM_SetCompare2(TIM2,1850); //PWM输出Delay_ms(100); //延时100mswhile(1){Key_function(); //按键函数Monitor_function(); //监测函数Manage_function(); //处理函数Delay_ms(10); //延时10mstime_num++; //计时变量+1if(time_num >= 5000){time_num = 0;}}
}/****
*******按键函数
*****/
void Key_function(void)
{key_num = Chiclet_Keyboard_Scan(0); //按键扫描if(key_num != 0) //有按键按下{switch(key_num){case 1: //按键1:控制可回收垃圾桶打开TIM_SetCompare1(TIM2,1900); //打开Delay_ms(1000); //延时2sDelay_ms(1000);TIM_SetCompare1(TIM2,1850); //关闭break;case 2: //按键2:控制厨余垃圾桶打开TIM_SetCompare2(TIM2,1900); //打开Delay_ms(1000); //延时2sDelay_ms(1000);TIM_SetCompare2(TIM2,1850); //关闭break;case 3: //按键3:控制有害垃圾桶打开TIM_SetCompare1(TIM1,1900); //打开Delay_ms(1000); //延时2sDelay_ms(1000);TIM_SetCompare1(TIM1,1850); //关闭break;case 4: //按键4:控制其他垃圾桶打开TIM_SetCompare4(TIM1,1900); //打开Delay_ms(1000); //延时2sDelay_ms(1000);TIM_SetCompare4(TIM1,1850); //关闭break;default:break;}}
}/****
*******监测函数
*****/
void Monitor_function(void)
{if(USART2_WaitRecive() == 0) //如果收到数据{if(usart2_buf[0] == 0x01) //收到语音指令是“废纸|塑料瓶|可回收垃圾”,控制可回收垃圾桶打开{TIM_SetCompare1(TIM2,1900); //打开Delay_ms(1000); //延时2sDelay_ms(1000);TIM_SetCompare1(TIM2,1850); //关闭USART2_Clear(); //清空缓存}else if(usart2_buf[0] == 0x02) //收到语音指令是“剩饭|骨头|厨余垃圾”,控制厨余垃圾桶打开{TIM_SetCompare2(TIM2,1900); //打开Delay_ms(1000); //延时2sDelay_ms(1000);TIM_SetCompare2(TIM2,1850); //关闭USART2_Clear(); //清空缓存}else if(usart2_buf[0] == 0x03) //收到语音指令是“灯泡|有害收垃圾”,控制有害收垃圾桶打开{TIM_SetCompare1(TIM1,1900); //打开Delay_ms(1000); //延时2sDelay_ms(1000);TIM_SetCompare1(TIM1,1850); //关闭USART2_Clear(); //清空缓存}else if(usart2_buf[0] == 0x04) //收到语音指令是“木头|其他垃圾”,控制其他垃圾桶打开{TIM_SetCompare4(TIM1,1900); //打开Delay_ms(1000); //延时2sDelay_ms(1000);TIM_SetCompare4(TIM1,1850); //关闭USART2_Clear(); //清空缓存}}
}
/****
*******处理函数
*****/
void Manage_function(void)
{if(IR_1 == 1) //可回收垃圾桶装满,红灯亮,并通过蓝牙发送"可回收垃圾桶已满"{Delay_ms(1000);if(IR_1 == 1){LED1_G = 1;LED1_R = 0;if(flag_waste_1){UsartPrintf(USART1,"可回收垃圾桶已满\r\n");flag_waste_1 = 0;}}}else //未装满,绿灯亮{LED1_G = 0;LED1_R = 1;flag_waste_1 = 1;}if(IR_2 == 1) //厨余垃圾桶装满,红灯亮,并通过蓝牙发送"厨余垃圾桶已满"{Delay_ms(1000);if(IR_2 == 1){LED2_G = 1;LED2_R = 0;if(flag_waste_2){UsartPrintf(USART1,"厨余垃圾桶已满\r\n");flag_waste_2 = 0;}}}else //未装满,绿灯亮{LED2_G = 0;LED2_R = 1;flag_waste_2 = 1;}if(IR_3 == 1) //有害垃圾桶装满,红灯亮,并通过蓝牙发送"有害垃圾桶已满"{Delay_ms(1000);if(IR_3 == 1){LED3_G = 1;LED3_R = 0;if(flag_waste_3){UsartPrintf(USART1,"有害垃圾桶已满\r\n");flag_waste_3 = 0;}}}else //未装满,绿灯亮{LED3_G = 0;LED3_R = 1;flag_waste_3 = 1;}if(IR_4 == 1) //其他垃圾桶装满,红灯亮,并通过蓝牙发送"其他垃圾桶已满"{Delay_ms(1000);if(IR_4 == 1){LED4_G = 1;LED4_R = 0;if(flag_waste_4){UsartPrintf(USART1,"其他垃圾桶已满\r\n");flag_waste_4 = 0;}}}else //未装满,绿灯亮{LED4_G = 0;LED4_R = 1;flag_waste_4 = 1;}
}