news 2026/5/2 8:46:49

用STM32F103C8T6+红外传感器DIY一个自动开盖垃圾桶(附完整代码与接线图)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用STM32F103C8T6+红外传感器DIY一个自动开盖垃圾桶(附完整代码与接线图)

用STM32F103C8T6+红外传感器DIY自动开盖垃圾桶实战指南

周末整理工作室时,被角落里散发着异味的传统垃圾桶惹恼了——每次扔垃圾都得手动掀盖,手上沾满颜料时尤其不便。这让我萌生了改造一个智能垃圾桶的念头:当手靠近时自动开盖,离开后延时关闭。经过多次迭代,最终用最经济的STM32方案实现了这个功能,整套成本不到百元。下面将完整分享这个项目的实现细节,从元器件选型到代码调试的每个环节。

1. 硬件选型与成本控制

1.1 核心控制器选择

在创客圈里,STM32F103C8T6(俗称"蓝 pill")堪称性价比之王。这款Cortex-M3内核的MCU具有:

  • 72MHz主频处理传感器数据绰绰有余
  • 64KB Flash + 20KB RAM 的存储配置
  • 丰富的GPIO和外设接口
  • 市面上单价仅10元左右

相比Arduino Uno动辄七八十元的价格,STM32方案在性能翻倍的情况下成本反而更低。需要注意的是购买时要认准"ST"原厂标志,市面上存在国产仿制芯片,虽然便宜但稳定性较差。

1.2 传感器方案对比

测试了三种常见的人体检测方案:

传感器类型单价检测距离功耗适用场景
HC-SR501红外5元3-7米65μA通用型
VL53L0X激光35元2米20mA精准测距
RCWL-0516微波8元5-7米3mA穿透非金属

最终选择HC-SR501的原因在于:

  • 价格低廉且满足基础需求
  • 自带延时调节电位器(可设置2-5秒保持)
  • 3.3V/5V兼容,与STM32直连无需电平转换

1.3 执行机构选型

垃圾桶盖开合需要扭矩足够的舵机,测试数据如下:

# 常见舵机参数对比 servos = { 'SG90': {'price':12, 'torque':1.8kg/cm', 'angle':180}, 'MG996R':{'price':25, 'torque':13kg/cm', 'angle':120}, 'DS3218':{'price':35, 'torque':18kg/cm', 'angle':270} }

普通塑料垃圾桶盖重量约200-300g,SG90在力臂10cm时理论可承受1.8kg重量,实测完全够用。若使用金属桶盖,则需要选择MG996R等高扭矩型号。

2. 电路连接与供电设计

2.1 整体接线方案

系统连接关系如下图所示(实际接线时建议使用杜邦线+面包板过渡测试):

[红外传感器] --GPIO--> [STM32] --PWM--> [舵机] | | +--5V电源------------+

具体引脚分配:

  • HC-SR501 OUT → PA0(外部中断引脚)
  • 舵机信号线 → PA6(TIM3_CH1 PWM输出)
  • OLED显示屏 → I2C1(PB6/PB7)

注意:舵机供电需单独处理,当多个舵机同时动作时,USB供电可能不足导致STM32复位。建议使用5V/2A以上的外接电源,通过7805稳压芯片为系统供电。

2.2 防干扰设计

在工作室测试时发现,当附近有手机充电器工作时,红外传感器会出现误触发。通过以下措施解决:

  1. 在传感器输出端添加0.1μF去耦电容
  2. 使用带屏蔽层的双绞线连接传感器
  3. 在代码中增加软件去抖逻辑:
// 去抖检测代码示例 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET){ HAL_Delay(50); // 延时50ms再次检测 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET){ // 确认有效触发 open_lid(); } }

3. 固件开发关键实现

3.1 PWM舵机控制

SG90舵机控制需要50Hz的PWM信号,脉宽0.5ms-2.5ms对应0-180度。使用STM32的硬件PWM实现:

// TIM3初始化代码 TIM_HandleTypeDef htim3; TIM_OC_InitTypeDef sConfigOC = {0}; htim3.Instance = TIM3; htim3.Init.Prescaler = 72-1; // 72MHz/72 = 1MHz htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 20000-1; // 1MHz/20000 = 50Hz HAL_TIM_PWM_Init(&htim3); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 1500; // 初始位置(1.5ms) sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);

角度转换函数:

void set_servo_angle(uint16_t angle){ // 将角度转换为Pulse值 (500-2500) uint16_t pulse = 500 + angle * (2000 / 180); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pulse); }

3.2 状态机设计

为避免快速连续触发导致舵机抖动,采用状态机管理垃圾桶盖状态:

stateDiagram [*] --> CLOSED CLOSED --> OPENING: 检测到人体 OPENING --> OPEN: 舵机到达位置 OPEN --> CLOSING: 持续5秒无人 CLOSING --> CLOSED: 舵机复位完成

对应代码实现:

typedef enum { LID_CLOSED, LID_OPENING, LID_OPEN, LID_CLOSING } LidState; LidState lid_state = LID_CLOSED; void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == GPIO_PIN_0 && lid_state == LID_CLOSED){ lid_state = LID_OPENING; set_servo_angle(90); // 开盖角度 } } // 在main循环中处理状态转换 while(1){ switch(lid_state){ case LID_OPENING: if(servo_reached_position()) lid_state = LID_OPEN; break; case LID_OPEN: if(HAL_GetTick() - open_time > 5000){ // 5秒后开始关盖 lid_state = LID_CLOSING; set_servo_angle(0); } break; // 其他状态处理... } }

4. 外壳改造与安装技巧

4.1 垃圾桶结构改造

普通塑料垃圾桶改造需要注意:

  1. 在桶盖转轴处钻孔安装舵机支架
  2. 使用3M VHB双面胶固定红外传感器(避免打孔破坏外观)
  3. 线路走线可用热熔胶固定在桶壁内侧

实测发现,将传感器安装在距桶口15-20cm高度时检测效果最佳。角度略微向下倾斜(约15度),可以避免远处经过误触发。

4.2 功耗优化技巧

为提升电池供电时的续航能力:

  • 设置STM32进入Stop模式,通过外部中断唤醒
  • 调整红外传感器检测间隔为500ms
  • 关闭未使用的LED指示灯
// 进入低功耗模式 void enter_low_power(){ HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后需要重新初始化时钟 SystemClock_Config(); }

经过优化后,使用2000mAh锂电池可连续工作约3周时间。若想进一步延长续航,可换用RCWL-0516微波传感器(持续工作电流仅3mA)。

5. 常见问题排查指南

5.1 舵机抖动问题

现象:上电后舵机不停抖动但不转动 解决方法:

  1. 检查供电是否充足(建议单独5V供电)
  2. 确认PWM信号接地与电源共地
  3. 更换优质舵机线(劣质线内阻会导致电压下降)

5.2 红外传感器灵敏度调节

HC-SR501有两个调节电位器:

  • 灵敏度:顺时针旋转增加检测距离(建议设置在3米内)
  • 延时时间:控制输出信号保持时长(通常调至3秒左右)

调试技巧:用手机摄像头观察传感器(红外LED会显示为白光),测试不同距离的触发情况。

5.3 OLED显示异常

当I2C显示屏出现乱码时:

  1. 检查上拉电阻(4.7KΩ到3.3V)
  2. 降低I2C时钟频率(STM32默认100kHz可能过高)
  3. 确认初始化序列正确,特别是对于SSD1306驱动:
// 正确的初始化命令序列 const uint8_t oled_init_cmds[] = { 0xAE, // 关闭显示 0xD5, 0x80, // 设置时钟分频 0xA8, 0x3F, // 设置多路复用比例 0x20, 0x00, // 设置内存地址模式 // 更多命令... };

这个项目最让我惊喜的是其扩展性——后续可以轻松添加超声波测距模块实现防夹手功能,或者增加WiFi模块实现满桶提醒。实际使用三个月后,传感器位置积灰会导致灵敏度下降,建议定期用酒精棉片清洁红外透镜。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 8:44:26

第七史诗自动化助手:5分钟掌握游戏资源自动获取

第七史诗自动化助手:5分钟掌握游戏资源自动获取 【免费下载链接】e7Helper 【Epic Seven Auto Bot】第七史诗多功能覆盖脚本(刷书签🍃,挂讨伐、后记、祭坛✌️,挂JJC等📛,多服务器支持📺&#x…

作者头像 李华
网站建设 2026/5/2 8:42:46

AI智能体技能化开发:模块化、复用与工程实践指南

1. 项目概述:从“技能”视角重构智能体开发 最近在折腾AI智能体(Agent)项目时,我遇到了一个几乎所有开发者都会碰到的瓶颈:随着智能体功能越来越复杂,代码库变得臃肿不堪,不同功能的逻辑相互耦合…

作者头像 李华
网站建设 2026/5/2 8:41:32

从ISE到Vitis:Xilinx老用户迁移指南,手把手教你搞定新工具链

从ISE到Vitis:Xilinx老用户迁移实战手册 十年前还在用ISE画原理图的老张,最近被公司要求将一套Altera Cyclone III的老项目移植到Xilinx Versal平台上。当他打开崭新的Vitis 2023.1界面时,熟悉的Project Navigator图标消失了,取而…

作者头像 李华
网站建设 2026/5/2 8:40:28

网易云音乐人自动任务全攻略:用青龙面板+Docker实现每日签到与云贝获取

网易云音乐人自动化任务进阶指南:青龙面板与Docker实战解析 在数字音乐平台竞争日益激烈的今天,网易云音乐人通过日常任务积累云贝和提升等级已成为许多用户的刚性需求。传统手动操作不仅耗时耗力,还容易因疏忽错过关键任务。本文将深入探讨…

作者头像 李华