1. 项目概述与设计思路
作为一名嵌入式开发者,我最近完成了一个基于STM32F103C8T6的智能垃圾桶项目。这个项目源于日常生活中对传统垃圾桶使用不便的观察——每次扔垃圾都需要手动开盖,既不卫生也不方便。于是,我决定用嵌入式技术打造一个能自动感知用户需求、具备多种智能功能的垃圾桶系统。
整个系统设计围绕"感知-决策-执行"的闭环控制展开。在感知层,我们使用了红外光电传感器检测人手接近,超声波传感器测量垃圾高度,火焰传感器监测火源;在决策层,STM32主控芯片负责处理传感器数据并做出响应决策;在执行层,通过舵机控制垃圾桶盖开合,继电器控制紫外线消毒灯工作,蜂鸣器和LED提供声光反馈。此外,系统还集成了蓝牙模块和OLED显示屏,实现了与手机的无线交互和状态可视化显示。
这个项目的技术亮点在于:
- 多传感器数据融合处理
- 低功耗设计(待机电流<10mA)
- 模块化软件架构
- 人性化交互设计
2. 硬件系统设计与选型
2.1 主控芯片选择
选择STM32F103C8T6作为主控芯片主要基于以下几点考虑:
- 72MHz主频足够处理多传感器数据
- 丰富的GPIO和外设资源(3个USART、2个SPI、2个I2C)
- 内置定时器支持PWM输出
- 成本低廉(约10元/片)
- 完善的生态系统和开发工具支持
提示:对于初次接触STM32的开发者,建议先使用CubeMX进行外设配置,可以大幅降低开发难度。
2.2 传感器模块选型
2.2.1 红外光电传感器
选用E18-D80NK红外光电开关作为人手检测传感器,主要参数:
- 检测距离:3-80cm可调
- 输出方式:NPN常开
- 响应时间:<2ms
- 工作电压:5-24VDC
这个传感器通过遮挡反射原理工作,当有物体进入检测区域时,输出低电平信号。我们将其安装在垃圾桶盖内侧,检测用户手的接近。
2.2.2 超声波测距模块
HC-SR04超声波模块用于测量垃圾桶内垃圾高度,关键特性:
- 测量范围:2cm-400cm
- 测量精度:3mm
- 工作电压:5V
- 工作电流:15mA
实际使用中发现,当垃圾表面不平整时,超声波测量会出现波动。我们通过软件滤波(移动平均算法)解决了这个问题。
2.2.3 火焰传感器
采用KY-026火焰传感器实现火灾预警功能:
- 检测波长:760nm-1100nm
- 检测角度:约60°
- 探测距离:0.8m(打火机火焰)
- 输出方式:数字量(高低电平)和模拟量
2.3 执行机构设计
2.3.1 舵机选型与驱动
选用SG90舵机控制垃圾桶盖开合,主要参数:
- 工作电压:4.8V-6V
- 堵转扭矩:1.6kg·cm
- 动作速度:0.12秒/60°
- 重量:9g
驱动电路设计要点:
- 使用TIM1的CH1输出PWM信号
- PWM频率设置为50Hz(周期20ms)
- 占空比范围500-2500μs对应0-180°
- 独立5V电源供电,与MCU共地
2.3.2 紫外线消毒模块
采用5V UV紫外线灯珠,通过继电器控制:
- 波长:365nm
- 功率:3W
- 杀菌效率:>99%(照射30分钟)
- 寿命:约8000小时
安全设计:
- 仅在盖子关闭时启动消毒
- 设置最大工作时间限制(30分钟)
- 消毒时OLED显示警告信息
3. 关键功能实现与代码解析
3.1 自动开盖功能实现
自动开盖功能通过红外传感器触发,主要逻辑如下:
c复制// 红外传感器检测线程
void IR_Sensor_Thread(void const *argument)
{
for(;;)
{
if(HAL_GPIO_ReadPin(IR_GPIO_Port, IR_Pin) == GPIO_PIN_RESET)
{
// 检测到手接近
if(cover_state == COVER_CLOSED &&
system_mode != DISINFECTING)
{
Open_Cover();
last_activity_time = HAL_GetTick();
}
}
osDelay(50);
}
}
// 开盖控制函数
void Open_Cover(void)
{
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, OPEN_POSITION);
cover_state = COVER_OPEN;
OLED_ShowString(0, 2, "状态: 开盖中");
osDelay(500); // 等待舵机到位
OLED_ShowString(0, 2, "状态: 已开盖");
}
3.2 超声波测距与垃圾量检测
超声波测距采用输入捕获方式实现,核心代码:
c复制// 超声波测量任务
void US_Measure_Task(void)
{
static uint32_t last_measure = 0;
uint32_t now = HAL_GetTick();
if(now - last_measure > 200) // 每200ms测量一次
{
last_measure = now;
// 触发测量
HAL_GPIO_WritePin(US_TRIG_GPIO_Port, US_TRIG_Pin, GPIO_PIN_SET);
delay_us(15);
HAL_GPIO_WritePin(US_TRIG_GPIO_Port, US_TRIG_Pin, GPIO_PIN_RESET);
// 等待回波
uint32_t timeout = HAL_GetTick() + 50; // 50ms超时
while(!us_new_data && HAL_GetTick() < timeout);
if(us_new_data)
{
us_new_data = 0;
// 计算垃圾填充率
trash_level = 100 - (us_distance * 100 / BIN_HEIGHT_CM);
if(trash_level > 90)
{
Bin_Full_Alert();
}
}
}
}
3.3 蓝牙通信协议设计
蓝牙模块采用HC-05,通信协议设计如下:
| 指令 | 参数 | 说明 |
|---|---|---|
| MODE | 0/1 | 设置工作模式(0:自动,1:手动) |
| COVER | 0/1 | 控制盖子(0:关,1:开) |
| UV | 0/1 | 控制消毒灯(0:关,1:开) |
| REQ | - | 请求状态数据 |
状态数据返回格式:
STATUS,MODE,COVER,UV,DIST,LEVEL%
示例代码:
c复制void Bluetooth_Process(uint8_t *data)
{
if(strncmp((char*)data, "MODE", 4) == 0)
{
uint8_t mode = data[5] - '0';
if(mode <= 1)
{
system_mode = mode;
Send_Response("OK");
}
}
else if(strncmp((char*)data, "REQ", 3) == 0)
{
char status[50];
sprintf(status, "STATUS,%d,%d,%d,%d,%d",
system_mode, cover_state,
uv_state, us_distance, trash_level);
Send_Response(status);
}
}
4. 系统优化与问题解决
4.1 电源管理优化
初期版本存在以下电源问题:
- 舵机工作时导致MCU复位
- 蓝牙模块通信不稳定
- 消毒灯启动时OLED闪屏
解决方案:
- 采用双电源设计:
- 主控部分:AMS1117-3.3稳压
- 执行部分:LM2596降压模块
- 增加大容量滤波电容:
- 主电源端:470μF电解电容
- 每个模块旁路:100nF陶瓷电容
- 软件上错峰启动大电流设备
4.2 抗干扰设计
实际使用中遇到的干扰问题:
- 红外传感器误触发
- 超声波测距数据跳变
- 蓝牙通信丢包
采取的解决措施:
- 硬件方面:
- 传感器信号线加磁珠滤波
- 采用屏蔽线连接蓝牙模块
- 合理布局地平面
- 软件方面:
- 红外信号消抖处理(连续3次检测有效)
- 超声波数据中值滤波
- 蓝牙通信增加CRC校验
4.3 低功耗设计
为延长电池供电时的使用时间,我们做了以下优化:
- 动态时钟调整:
- 无操作时降低主频至24MHz
- 进入STOP模式时关闭外设时钟
- 智能唤醒机制:
- 红外传感器中断唤醒
- 定时唤醒检查状态
- 外设电源管理:
- 不使用时关闭OLED背光
- 消毒灯按需启用
实测功耗:
- 工作模式:约120mA
- 待机模式:<5mA
- 深度睡眠:<1mA
5. 项目扩展与改进方向
5.1 功能扩展建议
- 增加垃圾分类识别:
- 使用摄像头+轻量级CNN模型
- 通过机械臂实现自动分类
- 云端数据统计:
- 通过ESP8266上传使用数据
- 生成垃圾投放习惯报告
- 太阳能供电:
- 加装6V太阳能板
- 搭配18650电池组
5.2 硬件改进方案
- 主控升级:
- 换用STM32H743提升处理能力
- 增加外部SRAM缓存
- 传感器升级:
- TOF替代超声波测距
- 热电堆传感器检测温度
- 结构优化:
- 采用步进电机实现更精准控制
- 增加密封设计防止异味扩散
5.3 软件优化思路
- 引入RTOS:
- 使用FreeRTOS管理多任务
- 提高系统实时性
- 改进算法:
- 卡尔曼滤波处理传感器数据
- 机器学习预测垃圾投放高峰
- 增强安全性:
- 蓝牙配对加密
- 固件签名验证
这个项目从构思到实现历时两个月,期间遇到了各种预料之外的问题,但正是通过解决这些问题,让我对嵌入式系统设计有了更深入的理解。最大的收获是认识到一个完整的产品开发,不仅需要考虑功能实现,还要关注电源管理、抗干扰设计、用户体验等方方面面。