STM32智能垃圾桶DIY实战:从零构建到Proteus仿真的完整指南
在智能家居和环保意识日益增强的今天,一个能自动感应开盖、检测垃圾容量的智能垃圾桶成为了许多创客和嵌入式爱好者的理想项目。本文将带你从零开始,使用STM32单片机打造一个功能完善的智能垃圾桶系统,并通过Proteus仿真验证设计。
1. 项目规划与硬件选型
1.1 核心功能设计
一个基础的智能垃圾桶系统通常需要实现以下功能:
- 人体感应:当有人靠近时自动打开桶盖
- 满溢检测:当垃圾达到一定高度时发出警报
- 自动关闭:在人离开后延迟关闭桶盖
- 手动控制:通过按钮实现手动开关
- 状态显示:通过LCD或LED显示当前状态
1.2 硬件组件清单
根据上述功能需求,我们需要以下硬件组件:
| 组件类别 | 具体型号 | 功能说明 |
|---|---|---|
| 主控芯片 | STM32F103C8T6 | 系统核心控制器,处理传感器数据和控制执行机构 |
| 人体感应 | HC-SR501红外传感器 | 检测人体接近,触发开盖动作 |
| 距离检测 | HC-SR04超声波模块 | 测量垃圾高度,实现满溢检测 |
| 执行机构 | SG90舵机 | 控制垃圾桶盖的开合动作 |
| 显示模块 | LCD1602 | 显示垃圾桶状态信息 |
| 报警模块 | 有源蜂鸣器 | 当垃圾桶满时发出声音警报 |
| 输入设备 | 轻触开关 | 提供手动控制功能 |
为什么选择STM32F103C8T6?
这款芯片基于ARM Cortex-M3内核,具有:
- 72MHz主频,足够处理传感器数据和控制逻辑
- 丰富的外设接口(GPIO、ADC、PWM等)
- 充足的Flash(64KB)和RAM(20KB)
- 性价比高,开发资源丰富
2. 硬件电路设计与搭建
2.1 系统框图设计
在开始具体电路设计前,先规划系统整体架构:
[人体传感器] → [STM32] → [舵机]
[超声波模块] → → [LCD显示屏]
[按钮] → → [蜂鸣器]
2.2 关键电路设计要点
2.2.1 传感器接口电路
红外传感器连接:
HC-SR501 OUT → PA0 (STM32)
VCC → 5V
GND → GND
超声波模块连接:
HC-SR04 Trig → PA1
Echo → PA2
VCC → 5V
GND → GND
注意:STM32的GPIO电压为3.3V,而HC-SR04输出为5V电平,建议在Echo信号线上添加电平转换电路或使用电阻分压。
2.2.2 舵机驱动电路
SG90舵机控制信号为PWM波,典型参数:
- 周期:20ms
- 脉冲宽度:0.5ms-2.5ms对应0°-180°
连接方式:
舵机信号线 → PA6 (TIM3_CH1)
VCC → 5V (需确保电源足够)
GND → GND
2.2.3 LCD1602接口
推荐使用4位数据模式节省IO:
RS → PB0
RW → GND (只写模式)
E → PB1
D4-D7 → PB12-PB15
VCC → 5V
GND → GND
VO → 10K电位器中间脚 (对比度调节)
2.3 电源设计
系统需要3.3V和5V两种电压:
- STM32核心:3.3V
- 传感器和执行机构:5V
可以使用AMS1117-3.3从5V降压得到3.3V。如果使用USB供电,需确保电流足够(建议500mA以上)。
3. 软件开发与编程
3.1 开发环境搭建
- 安装STM32CubeIDE(免费)
- 创建新工程,选择STM32F103C8T6芯片
- 配置时钟树(72MHz系统时钟)
- 通过STM32CubeMX配置外设:
- GPIO:传感器输入、按钮输入
- TIM3:PWM输出控制舵机
- USART1:调试输出(可选)
3.2 关键代码实现
3.2.1 舵机控制代码
// 初始化PWM
void PWM_Init(void)
{
TIM_OC_InitTypeDef sConfigOC = {0};
htim3.Instance = TIM3;
htim3.Init.Prescaler = 71; // 72MHz/72 = 1MHz
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 19999; // 20ms周期
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&htim3);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 1500; // 初始位置1.5ms (90°)
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
}
// 设置舵机角度 (0-180°)
void Set_Servo_Angle(uint8_t angle)
{
uint16_t pulse = 500 + angle * 11.11; // 0.5ms + angle*(2ms/180)
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pulse);
}
3.2.2 超声波测距代码
// 获取超声波测距结果 (cm)
float Get_Distance(void)
{
float distance;
// 发送10us高电平触发信号
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
delay_us(10);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
// 等待回波高电平
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) == GPIO_PIN_RESET);
// 开始计时
uint32_t start = HAL_GetTick();
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) == GPIO_PIN_SET);
uint32_t duration = HAL_GetTick() - start;
// 计算距离 (声速340m/s)
distance = duration * 0.034 / 2;
return distance;
}
3.2.3 主控制逻辑
int main(void)
{
HAL_Init();
SystemClock_Config();
PWM_Init();
LCD_Init();
uint8_t lid_state = 0; // 0:关闭, 1:打开
uint32_t last_detect_time = 0;
while (1)
{
// 检测人体
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET)
{
if(lid_state == 0)
{
Set_Servo_Angle(90); // 开盖
lid_state = 1;
}
last_detect_time = HAL_GetTick();
}
// 检测垃圾高度
float distance = Get_Distance();
if(distance < 10.0) // 假设10cm为满
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET); // 蜂鸣器报警
LCD_DisplayString(0, 0, "Full! Please empty");
}
else
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
LCD_DisplayString(0, 0, "Status: Normal ");
}
// 无人后延时关盖
if(lid_state == 1 && (HAL_GetTick() - last_detect_time) > 3000)
{
Set_Servo_Angle(0); // 关盖
lid_state = 0;
}
HAL_Delay(100);
}
}
4. Proteus仿真实现
4.1 仿真电路搭建
在Proteus中搭建仿真电路时,需要注意:
- 添加STM32F103C6(Proteus中可能没有C8T6,C6足够仿真)
- 使用"PIR"元件模拟人体红外传感器
- 使用"ULTRASONIC"元件模拟超声波模块
- 添加"SERVO"元件作为垃圾桶盖执行机构
- 添加"LCD16X2"作为显示屏
4.2 仿真调试技巧
-
传感器模拟:
- 右键点击PIR传感器,可手动触发"检测到人"状态
- 超声波传感器可设置固定距离或使用图表动态变化
-
调试输出:
- 添加"Virtual Terminal"连接到USART,用于输出调试信息
- 使用"Digital Oscilloscope"观察PWM波形
-
常见问题解决:
- 如果舵机不动作,检查PWM配置是否正确
- 如果LCD无显示,检查初始化时序和对比度设置
- 如果传感器无反应,检查GPIO配置和电源
4.3 仿真效果验证
完成仿真搭建后,可以测试以下场景:
-
正常使用流程:
- 触发PIR传感器 → 舵机转动开盖 → 3秒后自动关闭
-
满溢报警:
- 设置超声波检测距离小于阈值 → LCD显示满溢信息,蜂鸣器报警
-
手动控制:
- 按下按钮 → 强制开盖/关盖
5. 实际制作与优化建议
5.1 机械结构设计
垃圾桶的机械部分需要注意:
- 舵机安装位置应便于传递力矩
- 盖子转轴要顺畅,减少舵机负载
- 超声波传感器安装高度要合理
- 整体结构要稳固,避免倾倒
5.2 电源管理优化
为延长电池寿命(如果使用电池供电),可以考虑:
-
添加低功耗模式:
- 无人时进入Sleep模式
- 定时唤醒检测
-
代码优化:
void Enter_Low_Power_Mode(void)
{
// 关闭不必要的外设
__HAL_TIM_DISABLE(&htim3);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET); // 关闭蜂鸣器
// 配置唤醒源 (外部中断)
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
// 进入Stop模式
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 唤醒后重新初始化系统时钟
SystemClock_Config();
PWM_Init();
}
5.3 功能扩展思路
基础功能实现后,可以考虑:
-
垃圾分类功能:
- 添加多个垃圾桶体
- 通过颜色识别或RFID实现自动分类
-
无线连接:
- 添加ESP8266实现WiFi连接
- 手机APP查看状态和远程控制
-
数据统计:
- 记录开盖次数、清空时间
- 分析使用习惯,优化服务
-
太阳能供电:
- 添加太阳能板和充电电路
- 实现完全无线化
6. 常见问题与解决方案
在实际制作过程中,可能会遇到以下问题:
-
舵机抖动或不动作:
- 检查电源是否足够(建议单独5V供电)
- 确认PWM信号参数正确
- 检查机械结构是否卡顿
-
超声波测距不准:
- 确保传感器安装稳固,正对测量方向
- 添加多次测量取平均的算法
- 避免测量表面过于柔软或倾斜
-
红外传感器误触发:
- 调整传感器灵敏度电位器
- 添加软件去抖逻辑
- 避开直接阳光或热源干扰
-
系统不稳定:
- 检查所有接地是否良好
- 在电源端添加滤波电容
- 优化代码结构,避免阻塞延时
通过本指南,你应该已经掌握了使用STM32开发智能垃圾桶的核心技术。从硬件选型到软件编程,再到Proteus仿真验证,这个项目涵盖了嵌入式开发的多个关键环节。实际制作时,可以根据具体需求调整功能设计和外观结构,打造出独一无二的智能垃圾桶产品。
3544



被折叠的 条评论
为什么被折叠?



