目录一、项目概述二、实现功能1、功能详解2、项目清单3、演示视频三、硬件介绍PCB硬件设计四、程序设计五、项目成品效果图六、项目总结七、包含资料一、项目概述本项目基于STM32F103C8T6单片机设计了一款智能家用垃圾桶。系统通过HC-SR04超声波传感器检测垃圾桶剩余容量并映射为百分比光电红外传感器检测是否有人靠近火焰传感器检测是否发生火灾。各项数据实时显示在OLED屏幕上用户可通过按键调节距离阈值、控制消毒模式并切换自动/手动模式。自动模式下垃圾桶未满时指示灯1亮已满时指示灯2亮并通过蓝牙App推送“垃圾桶已满”有人且未满时自动开盖已满时不开盖并蜂鸣报警检测到火灾时蜂鸣报警且双指示灯亮起桶盖关闭时自动开启消毒灯。手动模式下可通过按键控制桶盖和消毒灯。系统通过BT04-A蓝牙模块与手机App通信实现数据接收与指令下发。二、实现功能1、功能详解1环境采集通过HC-SR04超声波传感器检测垃圾桶剩余容量并映射为百分比显示光电红外传感器检测是否有人靠近火焰传感器检测是否发生火灾。2数据显示OLED屏幕显示垃圾桶剩余容量、人体靠近状态及火灾检测状态等信息。3阈值设定可通过按键调节垃圾桶的距离阈值并控制消毒模式是否开启。4模式切换可通过按键切换自动模式和手动模式。5自动模式垃圾桶未满时指示灯1点亮已满时指示灯2点亮且蓝牙App接收“垃圾桶已满”信息检测到有人且垃圾桶未满时自动打开桶盖垃圾桶已满时不打开桶盖并蜂鸣器报警火焰传感器检测到火灾时蜂鸣器报警且两个指示灯同时亮起垃圾桶桶盖关闭时自动打开消毒灯进行消毒。6手动模式可通过按键控制垃圾桶桶盖和消毒灯的开关。7蓝牙App通过蓝牙App可接收环境信息数据并下发控制指令。2、项目清单1主控STM32F103C8T6最小系统板2显示模块OLED显示屏4针IIC协议3容量检测HC-SR04超声波传感器4人体检测光电红外传感器5火焰检测火焰传感器6蓝牙模块BT04-A蓝牙模块7执行模块舵机桶盖、继电器、UV紫外线消毒灯8报警模块蜂鸣器9指示模块LED灯10结构件垃圾桶模型11输入模块按键3、演示视频哔哩哔哩视频链接点击观看 https://www.bilibili.com/video/BV15gtZ6fEeM/?share_sourcecopy_webvd_sourcef4437c8e4429101e5bf1054c39d5474f三、硬件介绍PCB硬件设计四、程序设计#include delay.h #include sys.h #include usart.h #include key.h #include stdio.h #include control.h #include oled.h #include IoData.h #include pwm.h #include timer.h #include hc-sr04.h #include timer2.h #define Tong_h 9 //垃圾桶深度 // 0-连接GND-电平为0V // 1-电平为3.3V // 5V - 电阻 - Led正-led负- PC13 - 0V // 条件为真 - True - 1 // 条件为假 - False - 0 //extern //函数声明 void OLED_Show_OnePage(); //第一屏显示内容 void OLED_Show_TwoPage(); //第二屏显示内容 void get_all_sensor_data(); // 传感器采集的函数 void Key_event_handle(void); //按键功能函数 void All_Pin_Init(void); //系统初始化函数 void Sensor_Data_Handle(); //不同模式下控制效果 int wind_status 0; //风扇开关状态 int water_status 0; //水泵开关状态 int led_status 0; //照明开关状态 int Lamp_status 0; int auto_mode 0; //自动模式开关 0关闭 1开启 int Elim_status 0; //消毒灯开关状态 int valve_status 0; //垃圾桶开关状态 uint8_t keu_num 0; //按键 uint8_t page_num 1; //界面 uint8_t option 0; //选项 int main(void) { delay_init(); //系统延时函数初始化 OLED_Init(); //屏幕初始化 uart3_init(9600); //串口3初始化波特率9600 uart1_init(115200); //串口1初始化波特率115200 uart2_init(9600); //串口2初始化波特率9600 KEY_Init(); //按键初始化 IoData_Init(); //火焰传感器、人体传感器 Control_Init(); //声光报警风扇、水泵初始化 PWM_Init(); LED1; Lamp1; HC_SR04_Init(); //超声波测距初始化 Timer2_Init(9,14398); //定时器初始化 PWM_SetCompare2(185); while(1) { Key_event_handle(); //按键监测 if(page_num 1){ //屏幕更新 OLED_Show_OnePage(); }else if(page_num 2){ OLED_Show_TwoPage(); } get_all_sensor_data(); Sensor_Data_Handle(); } } void Key_event_handle(void) //Key按键 event事情、逻辑handle处理 { keu_num KEY_Scan(0); //按键扫描赋值 switch(keu_num) { case 1: //按键1按下 if(page_num1){ //如果在页面1的状态下 page_num2; // 按下按键1会跳转在页面2 OLED_Clear(); // 屏幕清楚 option0; }else if(page_num2){ //如果在页面2的状态下 page_num1;; // 按下按键1会跳转在页面3 OLED_Clear(); // 屏幕清楚 option0; } break; case 2: //按键2按下 if(page_num2) { option; //option选项 继续按、按键2会跳到下一个选项 if(option3){ //如果页面选项是3个、再次按键次数超过3次后 option0; //先会、不会框选每一个选项在按后会再次循环 } } break; case 3: //按键3按下 if(page_num1){ auto_mode1; }else if(page_num2){ if(option1){ Elim1; Elim_status1; }else if(option2){ PWM_SetCompare2(195); valve_status1; } } break; case 4: //按键4按下 if(page_num1){ auto_mode0; }else if(page_num2){ if(option1){ Elim0; Elim_status0; }else if(option2){ PWM_SetCompare2(185); valve_status0; } } break; } } void get_all_sensor_data() //获取所有传感器数据 { Get_Fire_Value(fire_status); //检测火焰状态(Fire(status)状态 Get_Body_Value(body_status); //检测身体状态(body)身体 HC_SR04_Deboanle(distance); //检测距离 if(distanceTong_h)distanceTong_h-distance; else distance 0; distancedistance*100/Tong_h; // if(distance100){ // distance100; // } // if(distance0){ // distance0; // } } void Sensor_Data_Handle() //传感器的采集数据的处理 { if(auto_mode1){ if(distance70||fire_status1){ LED0; }else { LED1; } if(distance70||fire_status1){ Lamp0; }else { Lamp1; } if(valve_status0){ Elim1; }else { Elim0; } if(body_status1distance70){ PWM_SetCompare2(195); valve_status1; delay_ms(3000); }else if(body_status1distance70){ PWM_SetCompare2(185); valve_status0; } if(fire_status1||(body_status1distance70)){ Beep1; }else { Beep0; } } } void OLED_Show_OnePage() { OLED_ShowChinese(16*0,16*0,16,16,1);//火 OLED_ShowChinese(16*1,16*0,17,16,1);//焰 OLED_ShowChar(16*2,16*0,:,16,1);// 字符 if(fire_status1)OLED_ShowChinese(16*28,16*0,20,16,1);//有 else OLED_ShowChinese(16*28,16*0,21,16,1);//无 OLED_ShowChinese(16*0,16*1,43,16,1);//人 OLED_ShowChinese(16*1,16*1,44,16,1);//体 OLED_ShowChar(16*2,16*1,:,16,1);//:字符 if(body_status1)OLED_ShowChinese(16*28,16*1,20,16,1);//有 else OLED_ShowChinese(16*28,16*1,21,16,1); //无 OLED_ShowChinese(16*0,16*2,63,16,1);//桶内容量 OLED_ShowChinese(16*1,16*2,64,16,1); OLED_ShowChinese(16*2,16*2,65,16,1); OLED_ShowChinese(16*3,16*2,66,16,1); OLED_ShowChar(16*4,16*2,:,16,1); OLED_ShowNum(16*48,16*2,distance,3,16,1); //数值 OLED_ShowString(16*6,16*2,%,16,1); if(auto_mode0){ OLED_ShowChinese(16*7,16*0,31,16,1); //手 OLED_ShowChinese(16*7,16*1,32,16,1); //动 }else{ OLED_ShowChinese(16*7,16*0,30,16,1); //自 OLED_ShowChinese(16*7,16*1,32,16,1); //动 } OLED_Refresh(); } void OLED_Show_TwoPage() { uint8_t a,b,c,d; if(option1){a0;b1;c1;d1;} else if(option2){a1;b0;c1;d1;} else if(option3){a1;b1;c0;d1;} else if(option4){a1;b1;c1;d0;} else{a1;b1;c1;d1;} OLED_ShowChinese(16*0,16*0,59,16,1);//消毒 OLED_ShowChinese(16*1,16*0,60,16,1); OLED_ShowChar(16*2,16*0,:,16,1);// 字符 if(Elim_status1){ OLED_ShowChinese(16*28,16*0,24,16,a);// 开 }else{ OLED_ShowChinese(16*28,16*0,25,16,a);//关 } OLED_ShowChinese(16*0,16*1,69,16,1);//垃圾桶 OLED_ShowChinese(16*1,16*1,70,16,1); OLED_ShowChinese(16*2,16*1,67,16,1); OLED_ShowChar(16*3,16*2,:,16,1);// 字符 if(valve_status1){ OLED_ShowChinese(16*38,16*1,24,16,b);// 开 }else{ OLED_ShowChinese(16*38,16*1,25,16,b);//关 } OLED_Refresh(); }五、项目成品效果图六、项目总结本项目成功实现了垃圾桶容量检测、人体感应、火灾报警、自动开盖及消毒功能的智能化管理结合蓝牙App远程监控和手动/自动模式切换提升了家用垃圾桶的实用性与安全性。系统运行稳定各模块协同良好具备较强的实用性和扩展性适用于智能家居及物联网教学实践七、包含资料本资料免费分享获取全套资料请看主页并将告诉助手需要资料的项目编号助手收到消息后会发送资料。文章若对你有所帮助期待点赞收藏后续会持续分享各类单片机实战案例。内容仅作为学习参考有任何不妥之处欢迎大家一起探讨资料获取查看主页介绍“充哥单片机设计以上归充哥单片机设计工作室所有侵权盗图抄袭必究法律责任
企业数字化 ERP 产品动态
相关推荐
DoB(方框差分滤波器)带通频域原理 一、前置基础:Box均值滤波器的真实频域特性DoB由两个不同尺度的Box滤波相减构成,其带通特性完全依赖Box滤波器的非理想低通属性,这是所有原理的基础。1.1 空域定义Box滤波器(方框均值滤波)是矩形均匀权重卷积核&#x… · 2026/9/26 11:10:52
【ARM 裸机开发 (IMX6ULL-mini)】I2C协议详解 文章目录前言一、串口格式化函数移植二、i2c协议的概念与特点三、IIC的时序四、EEPROM4.1 EEPROM概念4.2 AT24C024.3 AT24C02的I2C通信五、IMX6ULL上的I2C5.1 IMX6ULL的I2C原理框图5.2 相关寄存器IADRIFDRI2CRI2SRI2DR六、I2C程序C语言编写6.1 程序流程图6.2 I2C初始化6.3 I2C写… · 2026/9/26 11:10:52
智能汽车车规SoC全家福:座舱与智驾芯片选型指南 智能汽车这几年的热度不用我多说,但凡对行业稍微有点关注的朋友,估计都听过一个说法:电动化的上半场拼的是电池,智能化的下半场拼的是芯片。这话一点不夸张。一台现代智能汽车里,大大小小的芯片加起来动辄上千颗&#… · 2026/9/26 11:42:55
STM32在聊天机器人中的底层框架与实战:从任务分层到稳定性优化 1. 一颗STM32在“会聊天的机器人”里到底扛了什么活很多人第一次看到“会聊天的机器人”这个词,脑子里浮现的画面大概是:一个能听懂你说话、能跟你插科打诨、甚至还能讲个冷笑话的智能体。然后你再一看它的硬件清单,发现里面赫然躺着一颗 STM… · 2026/9/26 11:42:49
从一堆警情记录到开题报告:犯罪学论文的 AI 搭子怎么选?[特殊字符] 犯罪学属于法学门类下的公安学类,写毕业论文时常常会遇到一种“夹缝感”:既要有法学和社会学理论支撑,又可能接触案件、问卷、访谈或统计数据;既要讲学术规范,又不能把研究写成案情故事。
假设这次的具体任务是&#x… · 2026/9/26 11:42:49
Claude Code /loop全解析:Agent自动循环打工的落地实践 1. 从“一次对话”到“自动打工”:/loop到底解决了什么问题
1.1 Agent折腾了这么久,瓶颈到底卡在哪 说实话,这几年AI Agent的说法喊得震天响,从AutoGPT火起来那阵子,到各家Agent框架铺天盖地的文档,再到Cl… · 2026/9/26 11:42:49
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46