当前位置: 首页 > news >正文

用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模块实现满桶提醒。实际使用三个月后,传感器位置积灰会导致灵敏度下降,建议定期用酒精棉片清洁红外透镜。

http://www.jsqmd.com/news/737014/

相关文章:

  • 如何防止SQL拼接漏洞_使用PDO对象实现安全的SQL交互
  • 从杂乱文献到清晰图谱:用CiteSpace的TimeLine视图讲好你的研究故事
  • 用STM32F407的DMA+PWM驱动WS2812B灯带,实测避坑与性能优化指南
  • 第七史诗自动化助手:5分钟掌握游戏资源自动获取
  • 微信聊天记录数据库逆向初探:手把手教你用Python解析解密后的msg_0.db文件
  • CefFlashBrowser:免费开源Flash浏览器终极解决方案,让经典Flash内容重获新生
  • Silk v3音频解码器完整指南:零基础快速搞定微信QQ语音转换
  • 从ISE到Vitis:Xilinx老用户迁移指南,手把手教你搞定新工具链
  • 手把手教你给CH37X USB主机板加装“防浪涌”电路,告别热插拔死机
  • Go语言实现高性能键值缓存:设计原理与工程实践
  • QMCDecode终极指南:三分钟解锁QQ音乐加密音频,实现全平台自由播放
  • Arm SystemReady认证指南:硬件与OS兼容性解析
  • 精品PPT|电子行业工业4.0智能工程解决方案
  • 论文精读:《Indirect Prompt Injection》—— 当AI助手成为别人的“提线木偶“
  • 3分钟学会Windows任务栏透明美化:TranslucentTB完全指南
  • BetterGI原神AI辅助工具:解放双手,让游戏回归纯粹乐趣
  • PID调参不再玄学:用STM32F4+加热片实战,聊聊我的参数整定心得与曲线优化
  • 你的App UI还不够‘聪明’?试试用Android Palette实现动态主题跟随(以豆瓣电影卡片为例)
  • 别再为高精度电流采样发愁了!手把手教你用INA220搭配STM32G0实现电源监控(附完整代码)
  • 从电赛小白到PFC高手:手把手教你用UCC28019设计一个36V/2A的同步Boost PFC电源
  • VADER Sentiment终极解析:7500+词汇情感分析引擎深度解密
  • 如何在Windows家庭版上实现多用户远程桌面:RDPWrap终极指南
  • 别再复制粘贴了!用Typora+LaTeX高效搞定论文/报告里的数学公式(附常用符号速查表)
  • Spring Boot 3.2升级踩坑记:手把手教你解决MyBatis-Plus的‘factoryBeanObjectType’报错
  • 金融领域大模型可信度评估框架FINTRUST解析
  • 如何5分钟搞定Windows包管理器安装:winget-install终极配置指南
  • 037、集成第三方API:扩展Agent的外部能力
  • 【20年容器底层专家亲授】:不改代码、不换驱动,仅调整6个/proc/sys/fs参数,让Docker 27构建提速68%
  • 【Docker 27低代码容器化实战白皮书】:20年DevOps专家亲授,3步实现零编码应用秒级交付
  • 038、构建领域专属Agent:以客服、教育等场景为例