目录
[2.1 硬件清单:](#2.1 硬件清单:)
[2.2 功能介绍:](#2.2 功能介绍:)
[资料获取 查看主页介绍:兆龙电子单片机设计](#资料获取 查看主页介绍:兆龙电子单片机设计)
一、设计背景和意义
1.1设计背景:
在社区垃圾分类、校园环保教育、办公场所及家庭智能家居等场景下,垃圾精准分类、投放便捷管控、满溢智能提醒已成为智能环卫管理的核心需求。传统垃圾分类管理方式存在明显局限:高端智能垃圾分类站功能全面但成本高昂、部署复杂,难以普及到中小型社区及家庭用户;而普通分类垃圾桶仅靠标识区分,功能单一,缺乏自动开关盖、满溢监测、远程提醒及语音交互等功能,无法满足现代化场景下便捷、智能、高效的垃圾分类管控需求。此外,现有方案还存在功能割裂、集成度低的问题,无法实现多传感联动与多模交互的统一管控。基于此,本设计以STM32F103C8T6芯片为主控,其外围电路均为自主设计搭建,融合舵机驱动、语音识别、红外感应、按键交互、OLED显示及蓝牙通信等模块,构建低成本、高集成度的智能分类垃圾桶系统,以解决传统垃圾桶操作繁琐、智能化程度低及分类管控效率低下的问题。
1.2设计意义:
从使用体验与管控效率角度,该系统突破了传统垃圾桶管理的局限:一是实现语音识别控制与按键控制双模式开关盖,用户可通过语音指令或按键一键开启对应分类垃圾桶,无需手动接触桶盖,大幅提升投放便捷性与卫生性;二是配备OLED实时显示四个分类垃圾桶的开关状态,红外传感器监测垃圾是否已满并通过指示灯提示,方便管理人员及时掌握桶内状态;三是通过手机蓝牙APP接收垃圾桶满溢消息,并可远程控制垃圾桶开关,实现垃圾满溢即时通知与远程管控,提升环卫管理精细化水平。从技术实践与成本控制角度,本设计以STM32F103C8T6为核心,最小系统及全部外围电路均为自主设计搭建,充分利用其高性价比与低功耗优势,搭配舵机、语音识别模块、红外传感器等低成本通用器件,整体成本大幅降低,更易普及到中小型社区、学校、办公场所及家庭等场景,且系统支持模块化扩展,具备良好的灵活性与可扩展性。
**二、**实物展示
下方为实物演示视频
下方为实物展示图片

三、硬件功能介绍
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;
}
}
七、单片机实物资料
