【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;
	}
}

七、单片机实物资料

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

相关推荐
hsjiasb6 小时前
FreeRTOS学习(二十六)——动态内存管理heap_1到heap_5
stm32·单片机·学习·学习笔记·freertos
科技绘图6 小时前
快鲸GEO vs 传统AI搜索优化:全链路自动化与高效内容生产在转化闭环上的对比
数据库·人工智能·自动化
LCG元7 小时前
STM32+ESP8266+MQTT 物联网气象站:从零搭建温湿度远程监测系统(附完整源码)
stm32·物联网·struts
FakeOccupational8 小时前
【电路笔记 STM32】Cortex-M7 内核上的数据缓存(D-Cache)结构+MPU+DMA&Cache+STM32CubeMX配置
笔记·stm32·缓存
Elastic 中国社区官方博客9 小时前
Elasticsearch:使用 AI Agent 来创建 workflow
大数据·运维·人工智能·elasticsearch·搜索引擎·自动化·全文检索
殷忆枫9 小时前
基于K210与STM32的智能垃圾分类与物联网监管系统
stm32·物联网·分类
周洲083010 小时前
STM32 GPIO 外部中断深度解析:边沿触发 / 电平触发、NVIC 优先级配置、中断嵌套实战
stm32·单片机·嵌入式硬件
LCG元10 小时前
STM32F103 CAN 总线通信实战:标准库双机通信与过滤器配置精讲
stm32·单片机·嵌入式硬件
zlinear数据采集卡11 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
ClouGence12 小时前
PostgreSQL 同步到 Iceberg:开源、私有部署与 SaaS 方案对比
数据库·postgresql·开源