1. 项目背景与核心价值
在垃圾分类日益普及的今天,传统垃圾桶已经无法满足现代生活的需求。我最近完成了一个基于单片机的智能垃圾桶控制系统,这个项目完美解决了以下几个痛点:
- 无需手动触碰桶盖,避免细菌交叉感染
- 自动识别垃圾类型并提示正确投放位置
- 实时监测桶内垃圾量,及时提醒清理
- 低功耗设计,适合长期无人值守场景
这个系统特别适合应用在以下场景:
- 医院、学校等公共场所
- 智能家居环境
- 办公场所
- 户外垃圾分类站点
2. 系统整体设计方案
2.1 硬件架构设计
整个系统采用模块化设计,主要包含以下核心组件:
- 主控模块:STC89C52RC单片机(性价比高,开发资源丰富)
- 感应模块:HC-SR04超声波传感器(检测人体接近)
- 执行机构:SG90舵机(控制桶盖开合)
- 显示模块:0.96寸OLED屏幕(显示垃圾分类信息)
- 检测模块:红外对管(监测垃圾满溢状态)
- 供电系统:18650锂电池+TP4056充电模块(支持USB充电)
2.2 软件流程设计
系统工作流程分为以下几个关键阶段:
- 待机状态:系统进入低功耗模式,定期唤醒检测
- 人体检测:超声波传感器检测到人体接近(30cm范围内)
- 桶盖控制:舵机带动桶盖打开,OLED显示分类提示
- 投放监测:红外传感器检测垃圾投放动作
- 状态反馈:根据垃圾量变化更新显示信息
- 关闭回收:5秒无动作后自动关闭桶盖
3. 核心硬件选型与电路设计
3.1 单片机选型考量
选择STC89C52RC主要基于以下考虑:
- 8位51内核,完全满足控制需求
- 8KB Flash存储,足够存放程序代码
- 32个I/O口,满足多传感器接入
- 支持ISP在线编程,调试方便
- 价格仅3-5元,性价比极高
提示:虽然STM32性能更强,但对于这种简单控制系统会造成资源浪费,增加不必要的成本。
3.2 传感器电路设计要点
超声波传感器接口电路:
c复制// 引脚定义
#define TRIG P2_0
#define ECHO P2_1
// 初始化代码
void Ultrasonic_Init() {
TRIG = 0;
ECHO = 1;
}
红外传感器电路设计:
- 采用TCRT5000红外反射传感器
- 检测距离可调(2-30mm)
- 输出数字信号,直接接入单片机I/O
3.3 电源管理系统设计
考虑到户外应用场景,电源系统需要特别注意:
- 采用两节18650锂电池并联(容量可达6000mAh)
- TP4056充电模块支持5V/1A输入充电
- AMS1117-3.3V为单片机提供稳定电压
- 加入1000μF电容滤波,防止舵机动作时电压波动
4. 关键软件实现细节
4.1 超声波测距算法优化
原始测距公式:
code复制距离 = (高电平时间 × 声速)/2
优化后的代码实现:
c复制float Get_Distance() {
float distance;
TRIG = 1;
delay_10us(20);
TRIG = 0;
while(!ECHO);
TR0 = 1; // 启动定时器
while(ECHO);
TR0 = 0; // 停止定时器
distance = (TH0*256+TL0)*0.017; // 计算距离(cm)
TH0 = 0;
TL0 = 0;
return distance;
}
注意:实际应用中需要做多次采样取中值,避免误触发。
4.2 舵机控制PWM生成
SG90舵机控制参数:
- 周期:20ms
- 0度:0.5ms高电平
- 90度:1.5ms高电平
- 180度:2.5ms高电平
使用定时器中断实现:
c复制void Timer0_Init() {
TMOD |= 0x01;
TH0 = 0xFE;
TL0 = 0x0C;
ET0 = 1;
EA = 1;
TR0 = 1;
}
void Timer0_ISR() interrupt 1 {
static unsigned char count = 0;
TH0 = 0xFE;
TL0 = 0x0C;
count++;
if(count <= angle) SERVO = 1;
else SERVO = 0;
if(count >= 200) count = 0;
}
4.3 低功耗模式实现
待机状态下的省电策略:
- 关闭OLED显示屏
- 降低超声波传感器采样频率(从10Hz降至1Hz)
- 单片机进入空闲模式
- 通过外部中断唤醒系统
关键代码:
c复制void Enter_Sleep_Mode() {
PCON |= 0x01; // 进入空闲模式
OLED_Off();
Ultrasonic_Interval = 1000;
}
void EXTI0_ISR() interrupt 0 {
PCON &= ~0x01; // 退出空闲模式
OLED_On();
Ultrasonic_Interval = 100;
}
5. 系统调试与优化经验
5.1 常见问题排查指南
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 桶盖不开启 | 超声波传感器故障 | 检查VCC/GND连接,测试传感器输出 |
| 舵机抖动 | 电源供电不足 | 增加电容或更换更大电流电源 |
| 显示乱码 | OLED通信异常 | 检查I2C引脚连接,重初始化OLED |
| 误触发 | 环境干扰 | 调整超声波检测阈值,增加滤波算法 |
5.2 实测性能优化记录
通过实际测试发现的改进点:
-
防夹手设计:
- 增加红外对射传感器检测手部位置
- 关闭过程中检测到手立即停止并反转
-
抗干扰优化:
- 超声波采样增加数字滤波
- 设置最小触发距离(10cm)
-
功耗优化:
- 待机电流从15mA降至3mA
- 通过PWM控制舵机速度减少冲击电流
5.3 扩展功能实现
在基础功能上可以进一步扩展:
-
联网功能:
- 添加ESP8266 WiFi模块
- 上报垃圾桶状态到云平台
-
语音提示:
- 加入WT588D语音芯片
- 不同垃圾分类对应不同提示音
-
太阳能供电:
- 增加6V/5W太阳能板
- 搭配TP4056充电管理
6. 完整工程文件说明
项目开发使用的工具链:
- Keil uVision5(编译环境)
- STC-ISP(烧录工具)
- Altium Designer(电路设计)
- 3D打印(外壳制作)
工程目录结构:
code复制/SmartBin
/Hardware # 电路设计文件
Schematic.pdf
PCB.pdf
/Software # 源代码
main.c # 主程序
ultrasonic.c
oled.c
/3D_Model # 外壳STL文件
Base.stl
Cover.stl
实操建议:建议先使用洞洞板搭建原型,验证功能后再设计PCB,可以节省开发时间。