1. 项目概述
作为一名嵌入式开发工程师,我最近完成了一个基于STC89C51单片机的智能分类垃圾桶项目。这个设计源于一个很实际的需求:每次扔垃圾时,我都要盯着分类标识犹豫半天,还得用手掀开脏兮兮的垃圾桶盖。这不仅效率低下,还存在卫生隐患。
这个智能垃圾桶系统实现了四大核心功能:
- 双模式垃圾类别识别(按键+语音)
- 对应类别桶盖自动开合
- 投放错误实时告警
- 10秒无动作自动闭合
硬件成本控制在150元以内,特别适合家庭、小型办公室等场景。相比传统垃圾桶,它最大的优势是"非接触式"操作——你不需要用手触碰任何部位,完全避免了交叉感染的风险。
2. 硬件架构设计
2.1 核心控制器选型
选择STC89C51RC单片机主要基于三点考虑:
- 成本优势:零售价仅6-8元,远低于STM32系列
- 开发便捷:支持ISP在线编程,调试方便
- 性能足够:4个8位I/O口正好满足四分类控制需求
实际使用中,我为其配置了:
- 11.0592MHz晶振(串口通信无误差)
- 10kΩ复位电路(经典阻容复位)
- AMS1117-5.0稳压芯片(输入12V输出5V)
注意:STC89C51的P0口需要外接上拉电阻,我选用的是4.7kΩ排阻,这个细节很多初学者容易忽略。
2.2 识别模块实现方案
按键模式(基础版)
- 4个轻触按键直接连接P1.0-P1.3
- 硬件消抖:0.1μF电容并联在按键两端
- 软件消抖:检测到按键按下后延时20ms再次检测
电路图如下:
c复制P1.0 ──┬───[按键]───GND
│
P1.1 ──┼───[按键]───GND
│
P1.2 ──┼───[按键]───GND
│
P1.3 ──┴───[按键]───GND
语音识别(进阶版)
采用LD3320语音识别模块,关键配置参数:
- 识别词条:"可回收"、"厨余"、"有害"、"其他"
- 波特率:9600bps(与单片机串口通信)
- 供电电压:3.3V(需AMS1117-3.3稳压)
实测识别率:
| 环境噪音 | 识别准确率 |
|---|---|
| 安静环境 | 98% |
| 50dB背景 | 92% |
| 70dB背景 | 85% |
2.3 执行机构设计
四路舵机控制方案:
- 选用SG90微型舵机(4.8V/0.12A)
- PWM信号由定时器0产生(22.1184MHz/12/256≈720Hz)
- 角度控制:
- 0°(闭合):0.5ms高电平
- 90°(开启):2.5ms高电平
电路连接特别注意:
- 每个舵机单独供电(共地不共正极)
- 加装100μF电解电容滤波
- 信号线串联100Ω电阻防干扰
3. 软件系统实现
3.1 主程序流程图
c复制void main() {
硬件初始化();
while(1) {
if(按键触发 || 语音识别成功) {
开启对应舵机();
启动10秒计时();
if(红外检测到投放) {
判断投放是否正确();
}
if(计时结束) {
关闭舵机();
}
}
}
}
3.2 关键代码解析
PWM舵机控制
c复制void Timer0_Init() {
TMOD &= 0xF0; // 定时器0模式1
TL0 = 0x9C; // 初值计算:65536-10000=55536→0xD8F0
TH0 = 0xD8;
ET0 = 1; // 使能定时器0中断
TR0 = 1; // 启动定时器0
}
void Timer0_ISR() interrupt 1 {
static unsigned char count = 0;
TL0 = 0x9C; // 重装初值
TH0 = 0xD8;
if(count < angle) P2 = 0x0F; // 输出高电平
else P2 = 0x00; // 输出低电平
if(++count == 40) count = 0; // 20ms周期
}
语音识别处理
c复制void UART_ISR() interrupt 4 {
if(RI) {
RI = 0;
switch(SBUF) {
case 0x01: current_cmd = RECYCLABLE; break;
case 0x02: current_cmd = KITCHEN; break;
case 0x03: current_cmd = HARMFUL; break;
case 0x04: current_cmd = OTHER; break;
default: error_flag = 1;
}
}
}
4. 实测问题与优化方案
4.1 常见故障排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 舵机抖动不转 | 供电不足 | 检查电源电流是否≥2A |
| 语音识别率低 | 麦克风灵敏度 | 调节LD3320上的蓝色电位器 |
| 桶盖无法闭合 | 机械卡阻 | 调整舵机摆臂安装角度 |
| 误报警 | 红外灵敏度 | 调节电位器至30cm检测距离 |
4.2 深度优化建议
-
防夹手设计:
- 在桶盖边缘加装红外对管
- 检测到障碍物时立即停止闭合
- 代码实现:
c复制if(IR_SENSOR == 0) { // 检测到障碍物 stop_servo(); delay_ms(3000); continue_close(); }
-
数据统计功能:
- 加装HX711称重模块
- 记录各类垃圾重量
- 通过ESP-01S上传云端
-
低功耗优化:
- 加入HC-SR501人体感应
- 无人时进入休眠模式
- 电流可从120mA降至15mA
5. 项目进阶方向
这个基础版本完成后,我又尝试了几个增强方案:
-
图像识别版:
- 使用K210开发板
- 训练YOLOv3-tiny模型
- 识别准确率达到88%
-
太阳能供电版:
- 6V/10W太阳能板
- TP4056充电管理
- 18650电池组
- 阴雨天可持续工作7天
-
公共场合版:
- 钣金外壳防水设计
- 增加RFID刷卡开盖
- 集成烟雾报警功能
在实际部署中,我发现语音模式在厨房场景特别实用——当你双手沾满油污时,喊一声"厨余垃圾"就能自动开盖,这个细节体验远超预期。而按键模式在办公室环境下更稳定可靠,两种方案的组合确实能覆盖大多数使用场景。