
目录一、项目概述二、实现功能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远程监控和手动/自动模式切换提升了家用垃圾桶的实用性与安全性。系统运行稳定各模块协同良好具备较强的实用性和扩展性适用于智能家居及物联网教学实践七、包含资料本资料免费分享获取全套资料请看主页并将告诉助手需要资料的项目编号助手收到消息后会发送资料。文章若对你有所帮助期待点赞收藏后续会持续分享各类单片机实战案例。内容仅作为学习参考有任何不妥之处欢迎大家一起探讨资料获取查看主页介绍“充哥单片机设计以上归充哥单片机设计工作室所有侵权盗图抄袭必究法律责任