【STM32项目开源】STM32单片机语音分类垃圾桶-蓝牙APP

目录

一、设计背景和意义

1.1设计背景:

1.2设计意义:

二、实物展示

三、硬件功能介绍

[2.1 硬件清单:](#2.1 硬件清单:)

[2.2 功能介绍:](#2.2 功能介绍:)

四、软件设计流程图

五、硬件PCB展示

六、软件主函序展示

七、单片机实物资料

[资料获取 查看主页介绍:兆龙电子单片机设计](#资料获取 查看主页介绍:兆龙电子单片机设计)


一、设计背景和意义

1.1设计背景:

在社区垃圾分类、校园环保教育、办公场所及家庭智能家居等场景下,垃圾精准分类、投放便捷管控、满溢智能提醒已成为智能环卫管理的核心需求。传统垃圾分类管理方式存在明显局限:高端智能垃圾分类站功能全面但成本高昂、部署复杂,难以普及到中小型社区及家庭用户;而普通分类垃圾桶仅靠标识区分,功能单一,缺乏自动开关盖、满溢监测、远程提醒及语音交互等功能,无法满足现代化场景下便捷、智能、高效的垃圾分类管控需求。此外,现有方案还存在功能割裂、集成度低的问题,无法实现多传感联动与多模交互的统一管控。基于此,本设计以STM32F103C8T6芯片为主控,其外围电路均为自主设计搭建,融合舵机驱动、语音识别、红外感应、按键交互、OLED显示及蓝牙通信等模块,构建低成本、高集成度的智能分类垃圾桶系统,以解决传统垃圾桶操作繁琐、智能化程度低及分类管控效率低下的问题。

1.2设计意义:

从使用体验与管控效率角度,该系统突破了传统垃圾桶管理的局限:一是实现语音识别控制与按键控制双模式开关盖,用户可通过语音指令或按键一键开启对应分类垃圾桶,无需手动接触桶盖,大幅提升投放便捷性与卫生性;二是配备OLED实时显示四个分类垃圾桶的开关状态,红外传感器监测垃圾是否已满并通过指示灯提示,方便管理人员及时掌握桶内状态;三是通过手机蓝牙APP接收垃圾桶满溢消息,并可远程控制垃圾桶开关,实现垃圾满溢即时通知与远程管控,提升环卫管理精细化水平。从技术实践与成本控制角度,本设计以STM32F103C8T6为核心,最小系统及全部外围电路均为自主设计搭建,充分利用其高性价比与低功耗优势,搭配舵机、语音识别模块、红外传感器等低成本通用器件,整体成本大幅降低,更易普及到中小型社区、学校、办公场所及家庭等场景,且系统支持模块化扩展,具备良好的灵活性与可扩展性。

**二、**实物展示

下方为实物演示视频

【开源】基于STM32单片机智能语音分类垃圾桶 蓝牙 APP_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1AHgQ6jEZZ/?spm_id_from=333.1387.homepage.video_card.click&vd_source=2a672ca4e8794dca68cbe6d047b42ca5

下方为实物展示图片

三、硬件功能介绍

2.1 硬件清单:

  • STM32F103C8T6
  • OLED显示
  • 光电红外传感器X4
  • 舵机X4
  • 垃圾桶X4
  • 语音识别电路
  • 蓝牙模块

2.2 功能介绍:

(1)STM32F103C8T6芯片为主控,外围电路均为自主设计并搭建,未使用现成最小系统板

(2)舵机驱动垃圾桶盖打开与关闭

(3)按键控制四个分类垃圾桶的开关

(4)语音识别控制分类垃圾桶开关

(5)光电红外传感器监测垃圾是否已满,并指示灯提示

(6)OLED显示屏显示分类垃圾桶开关状态

(7)手机蓝牙APP接收分类垃圾桶已满消息,以及APP控制垃圾桶开关

四、软件设计流程图

五、硬件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);											//延时100ms
TIM_SetCompare4(TIM1,1850); 				//PWM输出
Delay_ms(100);											//延时100ms
TIM_SetCompare1(TIM2,1850); 				//PWM输出
Delay_ms(100);											//延时100ms
TIM_SetCompare2(TIM2,1850); 				//PWM输出
Delay_ms(100);											//延时100ms
while(1)
	{
Key_function();										//按键函数
Monitor_function();								//监测函数
Manage_function();								//处理函数
Delay_ms(10);											//延时10ms
		time_num++;												//计时变量+1
if(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);									//延时2s
Delay_ms(1000);
TIM_SetCompare1(TIM2,1850); 		//关闭
break;
case 2:														//按键2:控制厨余垃圾桶打开
TIM_SetCompare2(TIM2,1900); 		//打开
Delay_ms(1000);									//延时2s
Delay_ms(1000);
TIM_SetCompare2(TIM2,1850); 		//关闭
break;
case 3:														//按键3:控制有害垃圾桶打开
TIM_SetCompare1(TIM1,1900); 		//打开
Delay_ms(1000);									//延时2s
Delay_ms(1000);
TIM_SetCompare1(TIM1,1850); 		//关闭
break;
case 4:														//按键4:控制其他垃圾桶打开
TIM_SetCompare4(TIM1,1900); 		//打开
Delay_ms(1000);									//延时2s
Delay_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);										//延时2s
Delay_ms(1000);
TIM_SetCompare1(TIM2,1850); 			//关闭
USART2_Clear();										//清空缓存
		}
else if(usart2_buf[0] == 0x02)			//收到语音指令是"剩饭|骨头|厨余垃圾",控制厨余垃圾桶打开
		{
TIM_SetCompare2(TIM2,1900); 			//打开
Delay_ms(1000);										//延时2s
Delay_ms(1000);
TIM_SetCompare2(TIM2,1850); 			//关闭
USART2_Clear();										//清空缓存
		}
else if(usart2_buf[0] == 0x03)			//收到语音指令是"灯泡|有害收垃圾",控制有害收垃圾桶打开
		{
TIM_SetCompare1(TIM1,1900); 			//打开
Delay_ms(1000);										//延时2s
Delay_ms(1000);
TIM_SetCompare1(TIM1,1850); 			//关闭
USART2_Clear();										//清空缓存
		}
else if(usart2_buf[0] == 0x04)			//收到语音指令是"木头|其他垃圾",控制其他垃圾桶打开
		{
TIM_SetCompare4(TIM1,1900); 			//打开
Delay_ms(1000);										//延时2s
Delay_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;
	}
}

七、单片机实物资料

资料获取 查看主页介绍:兆龙电子单片机设计

相关推荐
冬奇Lab2 小时前
开源项目第166期:worldmonitor — 实时全球情报仪表盘,73k Star 的 AI 驱动地缘政治监控平台
人工智能·开源·资讯
零涂毕业设计2 小时前
毕业设计模块开发-OLED显示屏(IIC协议0.96寸)STM32 ESP32 FPGA Linux驱动免费分享
linux·stm32·单片机·嵌入式·esp32·fpga·oled
厦门辰迈智慧科技2 小时前
管网遥测终端机赋能城市安全的核心价值
物联网·遥测终端机·管网遥测终端机·排水管网遥测终端·管网遥测终端
tedcloud1232 小时前
OmniRoute怎么部署?开源AI模型路由平台Linux部署教程
linux·服务器·人工智能·开源·音视频
七仔啊3 小时前
modbus快速入门
物联网
会飞的小新3 小时前
Windows CMD 与 PowerShell 深度解析:底层原理、命令差异、自动化选型指南
运维·windows·自动化
阿龙的工作记录3 小时前
深入理解Linux设备驱动模型
linux·嵌入式硬件·工作记录
ye150127774553 小时前
220V转5V1A隔离芯片WT5602
单片机·嵌入式硬件·其他·硬件工程
武汉万象奥科4 小时前
AGV导航控制器方案 | 基于HD-RK3576系列核心板的算控融合一体化平台
arm开发·嵌入式硬件·arm核心板·单板机