基于单片机的智能垃圾分类系统设计

概要

  本文设计了一种基于STC89C52RC的智能化垃圾分类识别垃圾箱控制系统。目前,垃圾桶的样式和结构比较简单,不能很好地起到分类回收的作用,而且蚊蝇孳生、污水外溢、异味等弊端也在使用中暴露出来,对人们的生活和环境造成严重影响。因此设计一个集多功能于一体的智能化垃圾分类识别垃圾箱控制系统很重要。该系统主要由继电器驱动电路、红外感应模块、金属检测和湿度检测模块等功能模块构成。
  以cmos数字集成电路构成的金属检测、RPR220红外传感器、HC-SR04超声波监测和STC89C52单片机为核心,通过传感器采集距离信息,LCD1602显示当前垃圾桶状态,如果红外感应有人投放垃圾,通过LM393湿度传感器、cmos六反相器数字集成电路金属传感器进行检查,本系统解决了人们用手去开沾满许多细菌的盖,继电器模拟进行控制垃圾桶打开关闭,检测到有人靠近自动开盖,离开后自动关闭。如果检测到金属,湿垃圾或者是其他不同的继电器会打开模拟进行分类投放垃圾。此设计具有垃圾分类的功能,对当前环境垃圾污染问题做垃圾分类处理找到了一个可行的解决方法。

关键词:单片机;金属检测;红外传感器;垃圾桶;超声波

一、功能介绍

  本设计选择使用STC89C52单片机为核心元件。主要功能包括:智能开盖、装满报警以及对垃圾的类型进行具体分类等功能。在垃圾分类系统的开发过程中,系统设计的可靠性和成本贯穿了整个开发过程的一环[4]。设计好的系统在满足要求的同时,也需要应用性。系统能够有效运转时,考虑设计系统的实用性、操作的便利性、扩展性。如果实现以上这些功能就可以让使用用户丢垃圾时更加方便,同时垃圾和人也可以做到初步的隔离,能够有效的防止细菌在垃圾桶里滋生。
  系统功能确认后,需要对功能进一步细化,功能与功能之间是否有关联性和特殊连接关系,依据实现的功能进行关键器件选型及方案确定,如本文主要关键器件是MCU及外围电路最小系统、电源转换电路、信号采集与处理电路根据系统功能选择什么样的架构模型以及关键技术。
  功能设计:
1)超声波检测满溢程度,测障碍物低于8厘米的一档,8-16厘米的二档,高达48厘米的为五档。
2)LCD1602液晶显示当前垃圾桶状态和相关参数信息。
3)如果有人在扔垃圾,红外传感器就会探测到当前的掩体。当它检测到有人扔垃圾,传感器开始检测,液晶倒计时6秒。
4)湿度检测模块负责检测垃圾是否为湿垃圾,如果是湿垃圾则2号继电器打开5s后自动关闭。
5)金属检测模块检测是否为金属类型。
6)当物品被检测出为金属垃圾时,系统通过蜂鸣器报警提醒。如果没有检测为湿垃圾或金属垃圾系统判定为干垃圾,同时1号继电器打开5s后自动关闭[5]。
7)当检测出垃圾为金属垃圾时需要使用按键模块打开3号继电器进行强制回收,防止其他无关人员翻动造成垃圾、污染。
8)当检测到不同属性的垃圾时,单个设备给继电器提供低电平。这时会打开继电器,模拟垃圾的投入操作。

二、 系统仿真与调试

5.1 系统调试环境搭建

5.1.1 搭建测试环境注意事项

(1)硬件系统的测试环境的设置,应确保各部件与万用板连接时不会太近或者太远了。滤波器容量尽量接近电源,使电源输出更加稳定。同样的部件可以尽量保持功能的完整性减少资源的消耗量。
(2)焊接时,务必注意温度并且尽量不要反复焊接。
5.1.2 系统调试环境搭建
  在硬件系统软件系统的设计完成后,将基于系统硬件设备设计的对象焊接在万用板上,设计系统满足设计要求后对PCB进行采样和焊接,硬件调试环境主要包括焊接对象和功能对象、电源模块、示波器、万用表。实物焊主包括以下几个方面:
(1)确定本项目设计中对功能模块进行分类所需的元器件,将所使用的元器件安装在设计图上的位置,分别用万用表检测二极管的极性、五色环电阻阻值和电容容值。
(2)确定系统的整体结构布局,并创建模板。根据设计要求单片机的最小系统采用中、纵接近板底的输入信号,板顶是输出信号端横向左侧是信号输入端,中部是信号处理端,右侧是信号输出端。
(3)垃圾分类系统的布局完成后将各功能模块的部件依次插入板中,观察整体配置是否合理不合理的情况下,焊接前重新检查面板是否满足要求。
(4)在使用电烙铁之前首先将零部件固定在板上,用刀将电气原件的过长的部分切断,最后  根据与烙铁的电气关系焊接系统的线路焊接,焊接后进行进一步检查主要检查是否存在焊点不实、漏焊的器件、是否短路、电气关系、功能模块电路等情况。

图5.1无通电显示

图5.2通电显示
  给电路板通电后,各个模块开始工作,超声波测距模块通过LCD液晶显示模块实时监测垃圾满溢状态,显示当前垃圾满溢程度情况。

图5.3垃圾桶满溢显示
当超声波测距模块检测垃圾桶内已满,程序停止工作,并显示为“Trash full”。

图5.4红外感应模块工作
红外感应模块感应到有人靠近扔垃圾时,开始检测当前垃圾种类,计时6s。

图5.5检测垃圾为干垃圾

图5.6检测垃圾为湿垃圾
  检测过程中如果湿度检测模块检测当前垃圾为湿垃圾,则中间的湿垃圾垃圾桶自动开启,开启时间为5s。如果在计时结束前还未检测为湿垃圾或金属垃圾,计时结束时自动开启干垃圾垃圾桶,开启时间同样为5s。

图5.7检测垃圾为金属垃圾
  检测过程中如果检测为金属垃圾,蜂鸣器报警提醒并且需要手动按下回收按钮打开金属垃圾垃圾桶强制回收,防止有拾荒人员或其他无关人员翻动垃圾,造成污染。

三、 PCB图

四、 电路图

核心程序

#include <reg52.h> //调用单片机头文件#include <intrins.h>
#include "lcd1602.h"
#define uchar unsigned char //无符号字符型 宏定义变量范围0~255 #define uint unsigned int //无符号
整型 宏定义变量范围0~65535
//按键引脚定义
sbit KEY1 = P1^3;//金属垃圾按键sbit ShiDu = P1^1;//湿度检测sbit HW = P1^2;//红外探头
sbit TRIG = P2^1;//超声波发射sbit ECHO = P2^0;//超声波接收sbit Relay1 = P3^5;//干垃圾继电器sbit Relay2 = P3^6;//湿垃圾继电器
sbit Relay3 = P3^7;//金属垃圾继电器float distance; //距离
bit openFlag = 0;//开启标志bit handleFlag=0;//处理标志bit shuaxin = 0;//刷新标志bit Man = 0;//垃 圾满了的标志uchar miao = 0;//等待时间
uchar Classification=0;//1为干垃圾,2为湿垃圾,3为金属垃圾
//容量条显示数组
uchar code lcdTable1[]={0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F}; uchar code lcdTable2[]= {0x10,0x18,0x1F,0x1F,0x1F,0x1F,0x18,0x10}; uchar code lcdTable3[]={0x1F,0x00,0x00,0x00,  0x00,0x00,0x00,0x1F};
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围 是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
float Get_S(void)
{
long i = 0;
float S; //距离变量
TRIG=1; //触发信号是高电平脉冲,宽度大于10us DelayUs2x(10);
TRIG=0;
while(!ECHO && i < 300000) i++; //等待高电平
TR0=1; i = 0;
while(ECHO&& i < 300000) i++; //等待低电平TR0=0;
S=TH0*256+TL0;//取出定时器值高8位和低8位合并(单位时间为us)  S=S/58; //读出来是厘米
TH0=0;
TL0=0; //清除定时器0寄存器中的值return S;
}
/*********************定时器0、定时器1初始化******************/ void time_init() {
TMOD |= 0X11; //定时器0、定时器1工作方式1 TH0=0;
TL0=0;
TH1=0x4c;//定时50ms TL1=0x00;
ET0 = 1; //开定时器0中断ET1 = 1;
TR1 = 1;//开启定时EA = 1; //开总中断
}


void keyscan()
{
if(KEY1 == 0 && Classification==0 && handleFlag)//金属垃圾键按下
{
delay_ms(10);
if(KEY1 == 0 && Classification==0 && handleFlag)
{
while(!KEY1); lcd_write_str(0,  1,  " T: s"); Classification=3;
miao = 5;//继电器开启5秒openFlag = 1;
handleFlag = 0;
}
}
}
void displayCapacity(uint temp)//显示容器的状态
{
if(temp < 8)//显示5格
{
Lcd_Custom_Char(0,7,0,lcdTable1); Lcd_Custom_Char(0,8,1,lcdTable1); Lcd_Custom_Char(0,9, 2,lcdTable1); Lcd_Custom_Char(0,10,3,lcdTable1);
Lcd_Custom_Char(0,11,4,lcdTable1); Man = 1;//垃圾满了
}
else if(temp >= 8 && temp <16)//显示4格
{
Lcd_Custom_Char(0,7,0,lcdTable1); Lcd_Custom_Char(0,8,1,lcdTable1); Lcd_Custom_Char(0,9, 2,lcdTable1); Lcd_Custom_Char(0,10,3,lcdTable1); Lcd_Custom_Char(0,11,4,lcdTable3); Man = 0; }
else if(temp >= 16 && temp <24)//显示3格
{
Lcd_Custom_Char(0,7,0,lcdTable1); Lcd_Custom_Char(0,8,1,lcdTable1); Lcd_Custom_Char(0,9, 2,lcdTable1); Lcd_Custom_Char(0,10,3,lcdTable3); Lcd_Custom_Char(0,11,4,lcdTable3); Man = 0; }
else if(temp >= 24 && temp <32)//显示2格
{
Lcd_Custom_Char(0,7,0,lcdTable1); Lcd_Custom_Char(0,8,1,lcdTable1); Lcd_Custom_Char(0,9, 2,lcdTable3); Lcd_Custom_Char(0,10,3,lcdTable3); Lcd_Custom_Char(0,11,4,lcdTable3); Man = 0; }
else if(temp >= 32)//显示1格
{
Lcd_Custom_Char(0,7,0,lcdTable1); Lcd_Custom_Char(0,8,1,lcdTable3); Lcd_Custom_Char(0,9, 2,lcdTable3); Lcd_Custom_Char(0,10,3,lcdTable3); Lcd_Custom_Char(0,11,4,lcdTable3); Man = 0;
}
}
void main()
{
float temp; //距离变量time_init();//定时器初始化lcd_init();//1602初始化lcd_write_str(0,  0,  "STATE:
"); lcd_write_str(0,  1,  " CLOSE ");
Lcd_Custom_Char(0,12,5,lcdTable2); //显示特殊图形while(1)


{
if(Man == 0)//垃圾没满
{
keyscan();//按键扫描
if(HW == 0 && Classification==0)//检测到有人
{
if(handleFlag==0)
{
lcd_write_str(0,  1,  "Testing... T: s"); handleFlag = 1;
miao = 6;//等待时间赋值6秒
}
}
if(handleFlag==0 && openFlag==0)lcd_write_str(0,  1,  " CLOSE ");//显示关闭,没有人来扔垃圾else
//在检测中
{
if(ShiDu == 1 && handleFlag)//检测到湿垃圾
{
Classification=2; handleFlag = 0;
openFlag = 1;
miao = 5;//继电器开启5秒
}
lcd_write_char(14,1,miao+0x30);//显示秒
}
switch(Classification)//显示垃圾信息
{
case(1):
lcd_write_str(0,  1,  "Dry garbage");Relay1=0;break;//干垃圾case(2):
lcd_write_str(0,  1,  "Wet garbage");Relay2=0;break;//湿垃圾case(3):
lcd_write_str(0,1,"Metal waste");Relay3=0;break;//金属垃圾default:Relay1=1;Relay2=1;Relay3=1;
break;
}
}
else
{
lcd_write_str(0,  1,  " Trash full! ");//显示垃圾桶满了Relay1=1;Relay2=1;Relay3=1;//所有继电器关闭
Classification=0;
handleFlag = 0;
openFlag = 0;
miao = 0;
}
if(shuaxin == 1)//大约100ms读取一下数据
{
shuaxin = 0;
temp = Get_S();//获取距离
distance = temp > 400? 400 : temp;//距离最大取400cm displayCapacity(((uint)(distance)));//容量条
根据距离显示
}
}
}
void zd0() interrupt 1 using 0 //T0中断用来计数器溢出,超过测距范围
{
ECHO = 0; //中断溢出标志
}
void zd1() interrupt 3
{
static uchar cnt=0,cnt1=0; TH1=0x4c;
TL1=0x00;
if(cnt++ >= 1)//100ms
{
cnt = 0;
shuaxin = 1;
}
if(cnt1++ >= 20)//1s
{
cnt1 = 0;
if(miao > 0)
{
miao --;
}
else
{
if(openFlag == 1)
{
openFlag = 0;//5秒时间到了,关闭Classification=0;
}
if(handleFlag == 1 && Classification==0)//既不是湿垃圾,也不是金属垃圾,说明是干垃圾
{
Classification=1;
miao = 5;//继电器开启5秒handleFlag = 0;
openFlag = 1;
}
}
}

四、 结论

本设计充分考虑了位于城市中垃圾回收区的环境和回收设施特点,综合考虑了公共设施的设计原则,进一步丰富了城市垃圾桶的功能,与传统垃圾桶相比,其设计也更具智能化与人性化。未来的“智慧城市”拥有一整套“智能垃圾分类系统”的配套设施,到时垃圾处理将不再是一件头疼的事情,而是干净、便捷的举手之劳。
与现在的“垃圾投放设施”相比,实现了依仗技术杜绝产生污染的源头,解决了垃圾回收的一大难题,以前在社区中的“大锅烩”式的收集垃圾现象不再发生。通过识别系统自动将可回收垃圾(干垃圾)、不可回收垃圾(湿垃圾)以及危险废弃物(金属垃圾)加以分类,进一步提高了生活垃圾分类的科学回收。
生活垃圾处理分类考验的从生产商到消费者的环境意识、资源意识,唯有增强各个环节的环保意识,方可顺利实施下去。同发达国家相比,我们有更长的道路要走。但是,我们相信这个“智慧的垃圾处理系统”,虽然在技术的实施上,并采用没有高超的科技手段,但是依仗便于实施和推广的优势,将会在智慧城市、环保城市建设中发挥重大作用。最终“零垃圾”“零污染”。

五、 文章目录

目 录
第一章 绪论 1
1.1 研究背景 1
1.2 国内外现状 1
1.3 研究的目的及意义 3
第二章 系统设计总体设计 4
2.1 系统方案选择 4
2.2 系统功能分析 5
第三章 系统硬件电路设计 7
3.1 STC89C52RC单片机简介 7
3.2 复位电路设计 8
3.3 晶振电路设计 8
3.4 湿度感应模块设计 9
3.5 红外感应模块设计 10
3.6 继电器驱动模块设计 11
3.7 金属检测模块设计 12
3.8 电源模块 14
3.9 液晶显示器芯片 14
3.10 超声波测距模块 15
3.11 按键模块 16
3.12 报警模块 17
第四章 系统的软件设计 19
4.1 系统软件开发环境、工具 19
4.1.1 软件开发环境 19
4.1.2 软件开发工具 19
4.2 软件工作流程 19
4.3 传感器模块程序设计 20
4.3.1 超声波测距软件设计 20
4.3.2 金属检测程序设计 22
4.3.3 按键模块程序设计 23
第五章 系统仿真与调试 25
5.1 系统调试环境搭建 25
5.1.1 搭建测试环境注意事项 25
5.1.2 系统调试环境搭建 25
5.2 垃圾分类系统调试 29
5.2.1 系统软件调试 29
5.2.2 系统硬件调试 29
第六章 结论与展望 31
参考文献 32
致谢 34
附录 35

作者:启初科技

物联沃分享整理
物联沃-IOTWORD物联网 » 基于单片机的智能垃圾分类系统设计

发表评论