目录
目录 2
1 引言 3
1.1来源 3
1.2 本项目研究目的 3
1.3 本文的内容构成 3
2 研究背景 3
2.1 人工分类现象调查 3
2.2 人工分类的瓶颈 4
2.3 相关垃圾分类回收措施 5
2.4 便利店分布以及垃圾分类情况 5
3 垃圾后期处理方式 5
3.1 垃圾处理方式 5
3.2 例旧灯管回收程度 6
4 装置设计与研究方向 6
4.1 应用运行方案设计 6
4.2 预期达到效果 6
4.3 难点分析 7
4.4 先进性及独特之处 7
5 装置结构介绍及说明 7
5.1 装置外部结构 7
5.2 各部件功能介绍 8
6 运行原理及其逻辑 8
6.1 运行原理 8
    图1
7 总结 9
7.1 装置总结分析 9
7.2 可以分的类别 9
7.3 装置效果分析 9
7.4 相关产品对比 10
8 项目前景 10
8.1 项目前景及项目感悟 10
参考文献 10
附录 11
1 引言
本节介绍此项目由来并简单介绍本项目。
1.1来源
现代化社会中,全家(Family)、好德(AllDay)、快客(Quick)等等连锁便利店广泛分布于社区、街道、地铁口等等地方。而这些便利店绝大部分商品具有条形码标识,而且商品体积不大,产生的垃圾主要有盒装饭包装、零食外包装、饮料瓶和易拉罐小件垃圾。虽然现在的垃圾桶都有可回收、不可回收两个桶,但是由于人们垃圾分类的意识不强,往往随手丢弃,而且便利店垃圾桶分类意识也不强,从而造成垃圾回收难度增大。
考虑到便利店绝大部分商品具有条形码标签,而且垃圾种类容易根据条码信息区分,所以可以利用条码扫描信息开发自动分类垃圾桶,对便利店产生的垃圾进行分类回收。
1.2 本项目研究目的
根据现有的便利店分布广、垃圾区分度高、垃圾体积小等特点,开发自动垃圾分类回收装置,广泛应用于全家、好德等便利店门口,提高便利店产生的垃圾袋分类回收率。
同时该装置通过分类回收垃圾和附近居民用户的记录,实现积分回收垃圾,相应的积分可以换取现金或者便利店优惠券等等,一来可以积极促进居民对垃圾分类的热情,二来也让其对垃圾回收有一定的认识,并在回收的时候告诉丢垃圾的人,该物质类别,是否可回收。
1.3 本文的内容构成
本文第二节将从目前我国分类现状,人工分类的瓶颈,相关的政策进行介绍;第三节将对垃圾处理方式,以及垃圾利用率进行分析;第四节将说明装置所要实现的成果以及装置设计研究方向,以及对难点进行分析。
第五到八节将按照该装置从外部构造到各部件作用,从运行原理到装置逻辑设置,从代码库到实际运用的顺序,介绍该装置。第五节主要介绍了外部构造,以及各个部分功能。第六节主要介绍其运行原理,用绘表的形式体现其逻辑。第七节主要介绍本装置使用的单片机,及相关编写,对库的利用。第八节进行整体分析,介绍其创新点,以及进行总结。
第九节是该装置的未来前景。
2 研究背景
本节将描述其研究背景,相关政策和对人工分类进行介绍。主要将以应用各类文献的形式体现。
2.1 人工分类现象调查
近日,国家统计局上海调查总队在100个小区对生活垃圾分类情况进行了调查。调查显示,26.4%的市民表示“总能做到”,57.6%表示“大多数能做到”,14.4%表示“偶尔能做到”,仅有1.6%表示“完全不能做到”。
调查发现,垃圾分类的标准如收集容器的颜色、形状和标识等尚未统一。其中,9个小区垃圾分为“两类(可回收物、不可回收物)”,28个小区分为“三类(干、湿和有毒有害垃圾)”,60个小区分为“五类(干、湿、玻璃、旧衣物和有毒有害垃圾)”,3个小区分为“九类(干、湿、塑料包装、塑料瓶、旧衣服、纸张、利乐包、金属和过期药品)”。
调查还显示,市民不愿意进行垃圾分类的主要原因是“没有分类装运”。有市民表示,辛辛苦苦进行垃圾分类之后,却发现垃圾车运输时将分开的垃圾全部混在了一起。
2.2 人工分类的瓶颈
纯粹的人工分类无法满足现状,虽然现在很多地方有海报,宣传广告等,但是由于各方面的问题,效果很低,经归纳整理为以下7点:
由于回收和再利用体系过于分散,再生资源利用领域得不到产业化和规模化发展,垃圾分类的深入开展也遇到了瓶颈。另外,不论是居民自发源头分类,保洁员或拾荒人员的二次后续分类,各环节的各个主体都是在经济利益驱动下,对垃圾进行层层挑拣和收集。但整体综合素质相对较低、作业队伍不规范,受经济利益驱动最大。主要表现在强化了以经济利益为本的“拣垃圾”意识,对一些经济利益小但仍可资源化的垃圾,如部分玻璃瓶、废塑料等不进行分拣。
综上所述,人工垃圾分类不见效。
2.3 相关垃圾分类回收措施
广州市于2013年10日召开全市垃圾分类启动大会,公布“按袋计量收垃圾费”试点范围,并宣布试点正式开始。目前,市城管委正在全市范围内选择若干成熟小区做垃圾费的试点,以物业主动报名为主。按照广州市城管委相关官员的介绍,广州此次新政借鉴的乃是台北的经验,其主要精髓是采用“垃圾费随袋征收”这一经济杠杆,居民家庭排放的垃圾越多,付费就越多,反之,付费就少。
2.4 便利店分布以及垃圾分类情况
上海市主要的便利店有全家、好德、快客、良友、易捷、光明、喜士多等,分布广泛,数量众多,如图1所示,为好德便利店在上海市的分布,共1185家,而商品数量约为1300多种。
图 1 好德便利店上海市分布图
但是大多便利店垃圾分类情况不容乐观,其中原因主要是市民垃圾分类意识不强,其次是大多数便利店甚至不设置分类垃圾桶。因此在便利店进行垃圾分类是十分重要。根据前面的叙述,利用零售商品条码信息进行分类具有可行性,这是因为商品数量较少,1300多种类的商品所需的数据存储量约为33Kb,利用廉价单片机可以实现数据存储和算法处理。
3 垃圾后期处理方式
本节将介绍垃圾的回收处理方式[1],以及介绍不分类导致的垃圾处理不便,对环境污染严重。
3.1 垃圾处理方式
填埋处理,将垃圾填入已预备好的坑中盖上压实,使其发生生物、物理、化学变化,分解有机物,达到减量化和无害化的目的。为了防止二次污染,采取如下措施:(1)在底部和周围铺有防渗层;(2)分层铺放,即堆放一层垃圾,而后盖土压实,根据介绍,有些垃圾堆放层还安装导气和导水管道,并利用产生的沼气。
焚烧处理,将垃圾置于高温炉中,使其中可燃成分充分氧化的一种方法,产生的热量用于发电和供暖。焚烧处理的优点是减量效果好(焚烧后的残渣体积减少90%以上,重量减少80%以上),处理彻底。由于垃圾含有某些金属,焚烧具有很高的毒性,产生二次环境危害。焚烧处理要求垃圾的热值大于3.35MJ/kg,否则,必须添加助燃剂,这将使运行费用增高到一般城市难以承受的地步。
堆肥处理,将生活垃圾堆积成堆,保温至70℃储存、发酵,借助垃圾中微生物分解的能力,将有机物分解成无机养分。经过堆肥处理后,生活垃圾变成卫生的、无味的腐殖质。既解决垃圾的出路,又可达到再资源化的目的,但是生活垃圾堆肥量大,养分含量低,长期使用易造成土壤板结和地下水质变坏,所以,堆肥的规模不易太大。
3.2 例旧灯管回收程度
本市产生约1500吨废旧灯管,仅有10吨被回收。本市部分有毒有害垃圾的回收率不足10%。废弃电池、废旧节能灯等内部含有的汞将造成环境污染,一只普通节能灯含汞约0.6至2毫克,1毫克汞渗入地下,即可污染360吨水,造成的环境污染是灾难性的,如不加强回收管理,势必造成更大的显性和非显性的危害。
采取的措施为专业企业进行回收,以及在大型卖场设立网点,实行专项回收,并配套补贴政策。此外,市绿化市容局还将和市房管局、市商务委,在居民区设置废旧灯管专门收集箱,由灯管生产企业或灯管回收企业定期或不定期上门回收。同时,在销售节能灯的商业网点设置专门的废灯管回收箱,通过有偿回收、以旧换新等方式,由节能灯生产企业回收处理。可以说耗财耗力,且成果不够理想。
4 装置设计与研究方向
该装置的设计预想以及重难点分析。
4.1 应用运行方案设计
该装置初步所设计的功能分为2部分。第一部分是主要的,是利用积分和其检测分类结合所形成的一个体系。路人要将垃圾放入回收桶中,将进行两个动作,一:将垃圾在条形码激光扫描器前扫描该垃圾条形码;二:将特制NFC标签在NFC模块上扫描,进行积分。用户的积分将由LCD显示屏显示,而数码管将显示桶中可回收以及不可回收的垃圾数量。
4.2 预期达到效果
该装置所要达到的效果:条形码扫描器感应代码的时间不超过3秒,需调整角度到最佳状态;NFC模块感应NFC标签的时间不超过1.5秒,既整个丢垃圾积分过程只需要5秒左右就可进行完毕。舵机来回转动时间不超过3秒,以确保单个垃圾到相应的垃圾桶舵机来不及到相应位置。
4.3 难点分析
4.4 先进性及独特之处
整体结构设计:去除了很多移动方式,直接由两块木板的转动实现垃圾到对应的桶中。此设计更偏重于单个垃圾的处理效果。
整体运行设计:作为垃圾回收积分装置,将积分和感应装置结合在一起,实现系统一体化,感应装置与积分装置距离近。整个操作时间少。
用数码管显示其分类和LCD屏显示积分,5秒即可完成垃圾回收并对其用户进行积分。
该装置最大的贡献为利用低端单片机实现智能控制垃圾分类,成本极为低廉,便于广泛推广和使用。
5 装置结构介绍及说明
主要对本项目设计的装置进行简要的描述以及各组件的功能介绍。
5.1 装置外部结构
整体外观为长方形,只有一个放垃圾的口子,口子大小约为向上那面的平面大小的四分之一,口子周围的地方呈一定的角度,可有助不用鉴别的垃圾滑进垃圾桶内部。且有一个板上固定条形码扫描器和接近开关,一个NFC单片机的感应区,用来刷NFC标签的。感应区旁边有数码管,用来显示NFC标签中的积分,以及发声装置,垃圾扫描之后可以报出该垃圾类别和是否可回收,时间久了能让人有一个统一的标准去分类垃圾。口子下有一段通道。给舵机足够的时间到达相应的位置[2]。
根据该装置使用对象为连锁便利店,便利店常规垃圾主要为饮料塑料瓶、金属易拉罐等可回收垃圾、食品包装袋、快餐盒等不可回收垃圾以及无条形码的纸杯、木签、餐巾纸等无法处理垃圾,其比例约为3:5:2,但是由于瓶罐等垃圾体积较小,而不可回收垃圾体积相对较小,所以设计方案为管道下方固定2个舵机,舵机与木板相连,形成一个移动通道,下方有3个桶,分别为可回收的垃圾,不可回收垃圾,未经处理的垃圾,大小比例为4:4:2。
每个桶外部将有门可以将其中垃圾袋取出。地下有重量测定,一旦到某个值将发出信号,提醒人来回收。
5.2 各部件功能介绍
arduino单片机:主要用于发出指令,控制各部件进行操作[3]。
使用arduino单片机因此单片机有这一特点。是一款便捷灵活、方便上手的开源电子原型平台, Arduino,是一个基于开放原始码的软硬件平台,构建于开放原始码simple I/O介面版,并且具有使用类似Java,C语言的Processing/Wiring开发环境。能通过各种各样的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、影响环境。对Arduino的编程是利用 Arduino编程语言 (基于 Wiring)和Arduino开发环境(based on Processing)来实现的, 基于Arduino的项目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上运行的软件,他们之间进行通信 (比如 Flash, Processing, MaxMSP)来实现。
NFC模块:在单一芯片上结合感应式读卡器、感应式卡片和点对点的功能,能在短距离内与兼容设备进行识别和数据交换。用配套的NFC标签可以进行积分。
条形码激光扫描器:可读取条形码,并在端口传输相应信息。
(所利用的为PS/2端口的扫描器。PS/2接口是目前最常见的鼠标接口,俗称“小口”。这是一种鼠标和键盘的专用接口,是一种6针的圆型接口。使用其中的4针传输数据和供电,其余2个为空脚。PS/2接口的传输速率比COM接口稍快一些,而且是ATX主板的标准接口,是目前应用最为广泛的接口之一。)
数码管:可显示数字。显示目前可回收以及不可回收的垃圾数量。
舵机:进行转动操作,有扭力大,速度快的特点。
重量传感器:可靠压力知道重量大小,效率高,信号读取简单。
LCD显示屏:显示用户姓名以及积分
6 运行原理及其逻辑
说明其运行原理,并说明其设计逻辑。单片机编写所需逻辑顺序。
6.1 运行原理
条形码扫描器以及接近开关为整个装置的识别部分,而数码管和NFC模块是这个装置的积分部分,舵机为驱动部分,重量传感器和蜂鸣器为称重警报部分[4]。
初始状态为条形码扫描器常开,舵机角度位置指向未经处理的桶。
例1:当监测到瓶子的条形码,判断其信息,辨别是瓶子,为塑料制品,可回收,发出信号,NFC模块接收其信号,当某一用户NFC标签接近,NFC模块感应到,在此用户剩余积分信息中+2分,此用户剩余积分将在LCD上显示,垃圾桶内可回收与不可回收垃圾的数量显示在数码管,同时舵机顺时针转动45度,当垃圾滑入相应的地方,舵机逆时针转动回初始位置。
例2:当条形码监测到的为不可回收垃圾,例如包装袋。NFC板操作如上,记1分。舵机逆时针转动45度,垃圾进入舵机回到初始位置。
例3:当路人直接将垃圾丢进垃圾桶中,则视为未经处理垃圾,无任何操作。
6.2 逻辑图
图2 垃圾桶工作流程图
7 总结
对成果的总结,分析,对比。
7.1 装置总结分析
其优点:整个操作快,正常工作下精准度达100%,只要在传感器上扫描到。金属传感器探测精准度高,而条形码扫描器扫描时间在5秒之内。舵机来回转动只需要3秒,整个流程在10秒钟之内可以完成。可直接运行使用。
其缺点:若是一袋垃圾,无法进行准确识别分类,而且若是某包装袋上有金属成分,会分类到金属制品垃圾桶中,导致类别分错。
7.2 可以分的类别
1桶(可回收垃圾垃圾桶):塑料瓶、易拉罐、香烟盒子、纸质饼干包装盒。
2桶(未经处理垃圾桶):餐巾纸、肉串木条、塑料袋子。
3桶(不可回收垃圾):零食外包装、快餐盒等、玻璃瓶等。
7.3 装置效果分析
此装置相当于一个智能垃圾桶,利用积分的原理,大幅度减少垃圾的浪费,减少垃圾对环境的破坏,此装置可回收电池等有害垃圾,可减少这类垃圾在所有垃圾中出现的频率。并且收集该类垃圾,可更利于特殊处理,防止有害物质外露。
7.4 相关产品对比
目前市场上有一种类似于该装置的机器,目前试用于北京地铁站,只回收瓶子,大小为正常的售货机大小,所用鉴别塑料瓶的原理是利用环形红外线扫描,鉴别瓶子条形码,只有一个口用来放置瓶子,能积分,所采用的的积分系统为一卡通扫描器,成本略高。整个操作流程在6到7秒。
根据上述装置初步描述,我的装置体积小,针对性强,主要用于便利店门口,由于是垃圾桶,不仅仅能起到普通垃圾桶的功能还能起到积分回收可回收垃圾的功能,功能更全,更能对环境保护起到作用。
8 项目前景
该项目的未来前景,或本项目的未来方向。
8.1 项目展望
以项目以环保,减少城市污染为主题。有较大的意义,且此产品对整体的制作上技术无需过于深奥,成本也不会过于昂贵,用到单片机技术,此产品运用的范围也较广。在这个浪费量大的时代,有必要进行高效率的回收利用,并且城市污染不断加剧的情况下,回收再利用的意义非凡,假如垃圾中存有大量有害物质若不完全分离,那么或多或少会造成一些污染,而这些正是这个垃圾桶的意义所在。
垃圾分类是我们不断宣传的内容,这个装置可以帮助那些垃圾回收。以积分促进市民回收垃圾,并用不断报垃圾是否可回收的方式,让市民的可回收和不可回收的分类标准变得统一。整个装置实用性强,分类速度快,精准度高。未来是一个信息化,自动化的时代,垃圾桶会全自动分类,但是我设计的垃圾桶目的并非让其变成完全自动化,这样只会让国人更没这种分类的意识,只知道一味地追求自动化,而忘记了环境的重要性。我设计半自动化垃圾桶,也是在间接地提醒国人去保护环境,保护环境是一个大方向,也是一个较为笼统的概念,只有从身边最小的行为做起才行。
那就从分类垃圾开始,本来应全部完全自己分类的,我让其垃圾桶变成一个积分回收垃圾的装置,用积分奖励的形式,或者每人必须多少分等形式,让整个社会风气转变,让那些宣传真正变为实际操作的东西,让那些政策也可有一个发展的目标。
参考文献
应俊辉.我国和日本垃圾分类及处理比较分析[J].丽水师范专科学校学报,2003,25(5):73-76
周慧,许锦标.新型智能垃圾桶的设计方案[J].广东工业大学学报,2006,23(3).
程晨.Arduino电子设计实战指南[M].北京:机械工业出版社,2013.
梁婷,常国强,邢皓等.一种智能垃圾桶的研究与应用[J].机械工程师,2009(1):155-155.
附录
/*
Barcode Scanner
This code reads the input from a ps/2 barcode scanner, translates the scan-codes into numbers (only numbers from 0 to 9 can be used at the moment) */
//*********************** Definition of Variable *************
#include 
Servo ServoOf4Leaf,ServoOf1Leaf; // create servo object to control a servo
int DelayTime = 1000;
int SCAN_ENTER = 0x5a; // ASCII code of Enter
int SCAN_BREAK = 0xf0; // Breaking Code
int breakActive = 0;
int clockPin = 5; int dataPin = 4;
int triggerPin = 11; int diffPin = 12;
int clockValue = 0; byte dataValue;
byte scanCodes[10] = {0x45,0x16,0x1e,0x26,0x25,0x2e,0x36,0x3d,0x3e,0x46}; char characters[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
int quantityCodes = 10;
char buffer[16] = {}; // This saves the characters (for now only numbers)
int bufferPos = 0; // variable to store the Buffer position
int servoPos = 90; // variable to store the Servo position
int MaxNumber = 9;
char BarCodeRecycle[9][14]={"6921168511280","6901939651247","6901939641569","6901939651605","6932571031241","6934024590466","6921168504015","6922255451427","6921518598035"};
//*********************** Definition of Setup Architecture *************
void setup() {
pinMode(dataPin, INPUT);
pinMode(clockPin, INPUT);
pinMode(triggerPin, OUTPUT);
pinMode(diffPin, OUTPUT);
Serial.begin(9600);
ServoOf4Leaf.attach(9); // attaches the servo on pin 9 to the 4-leaf servo object
ServoOf1Leaf.attach(10); // attaches the servo on pin 10 to the 1-leaf servo object
}
//*********************** Definition of Loop Architecture *************
void loop() {
digitalWrite(triggerPin,LOW);
digitalWrite(diffPin,LOW);
ServoOf4Leaf.write(90);
ServoOf1Leaf.write(90);
dataValue = dataRead();
// If there is a break code, skip the next byte
if (dataValue == SCAN_BREAK) {
breakActive = 1;
}
// Translate the scan codes to numbers
// If there is a match, store it to the buffer
for (int i = 0; i < quantityCodes; i++) {
byte temp = scanCodes[i];
if(temp == dataValue){
if(!breakActive == 1){
buffer[bufferPos] = characters[i];
bufferPos++;
}
}
}
//Serial.print('*'); // Output an asterix for every byte
// Print the buffer if SCAN_ENTER is pressed.
if(dataValue == SCAN_ENTER){
bufferPos = 0; //reset bufferPosition
if(SearchCode(buffer)) // the rubbish is recyclable
{
//digitalWrite(triggerPin,HIGH);
//digitalWrite(diffPin,LOW);
clockwiseRotation(ServoOf4Leaf,ServoOf1Leaf,135);
}
else // the rubbish is unrecyclable
{
//digitalWrite(triggerPin,HIGH);
//digitalWrite(diffPin,HIGH);
AnticlockwiseRotation(ServoOf4Leaf,ServoOf1Leaf,45);
}
}
// Reset the SCAN_BREAK state if the byte was a normal one
if(dataValue != SCAN_BREAK){
breakActive = 0;
}
dataValue = 0;
}
//*********************** Definition of External function *************
int dataRead() {
byte val = 0;
// Skip start state and start bit
while (digitalRead(clockPin)); // Wait for LOW.
// clock is high when idle
while (!digitalRead(clockPin)); // Wait for HIGH.
while (digitalRead(clockPin)); // Wait for LOW.
for (int offset = 0; offset < 8; offset++) {
while (digitalRead(clockPin)); // Wait for LOW
val |= digitalRead(dataPin) << offset; // Add to byte
while (!digitalRead(clockPin)); // Wait for HIGH
}
// Skipping parity and stop bits down here.
while (digitalRead(clockPin)); // Wait for LOW.
while (!digitalRead(clockPin)); // Wait for HIGH.
while (digitalRead(clockPin)); // Wait for LOW.
while (!digitalRead(clockPin)); // Wait for HIGH.
return val;
}
void clockwiseRotation(Servo servo1,Servo servo2,int degree)
{
for(servoPos = 90; servoPos <= degree; servoPos += 5) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
servo1.write(servoPos); // tell servo to go to position in variable 'pos'
servo2.write(servoPos);
}
digitalWrite(triggerPin,HIGH);
digitalWrite(diffPin,LOW);
delay(DelayTime);
digitalWrite(triggerPin,LOW);
digitalWrite(diffPin,LOW);
for(servoPos = degree; servoPos >= 90; servoPos-=5)
{
servo1.write(servoPos); // tell servo to go to position in variable 'pos'
servo2.write(servoPos);
}
}
void AnticlockwiseRotation(Servo servo1,Servo servo2,int degree)
{
for(servoPos = 90; servoPos >= degree; servoPos -= 5)
{ // in steps of 1 degree
servo1.write(servoPos); // tell servo to go to position in variable 'pos'
servo2.write(servoPos);
delay(10); // waits 10ms for the servo to reach the position
}
digitalWrite(triggerPin,HIGH);
digitalWrite(diffPin,HIGH);
delay(DelayTime);
digitalWrite(triggerPin,LOW);
digitalWrite(diffPin,LOW);
for(servoPos = degree; servoPos <= 90; servoPos+= 5)
{
servo1.write(servoPos); // tell servo to go to position in variable 'pos'
servo2.write(servoPos);
delay(10); // waits 10ms for the servo to reach the position
}
}
int SearchCode(char data[]) //Binary Search
{ int flag=0,i=0;
for(i=0;i < MaxNumber;++i)
{
if(CompareArray(data,BarCodeRecycle[i],13)) {flag=1;break;}
}
return flag;
}
int CompareArray(char array1[],char array2[],int length)
{ int flag=1,i=0;
   for(i=0;i    {       if(array1[i]!=array2[i]) {flag=0;break;}    }    return flag;  } /**************************************************************************/ /*!     This example will wait for any ISO14443A card or tag, and depending on the size of the UID will attempt to read from it.    This is an example sketch for the Adafruit PN532 NFC/RFID breakout boards    This library works with the Adafruit NFC breakout     ----> https://www.adafruit.com/products/364    Check out the links above for our tutorials and wiring diagrams     These chips use I2C to communicate */ /**************************************************************************/ #include  #include  #include "SevSeg.h" #include  #define IRQ   (4) #define RESET (5)  // Not connected by default on the NFC Shield //Create an instance of the object. SevSeg sevseg; //Create global variables int interruptPin = 2; int diffPin = 3; uint8_t success; uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID int userPos=0; uint8_t user1[] = { 2, 193, 14, 190, 0, 0, 0 }; uint8_t user2[] = { 61, 64, 154, 152, 0, 0, 0 }; uint8_t user3[] = { 77, 60, 215, 151, 0, 0, 0 }; String userName[] = {"HuangSenHong","ShenZeHao","GuQiuHui"}; int userPoint[3] = {0,0,0}; int NFCResponse = 0; uint8_t uidLength;  // Length of the UID (4 or 7 bytes depending on ISO14443A card type) int NumRecycle=0,NumUnRecycle=0; LiquidCrystal lcd(50, 51, 9, 8, 7, 6); Adafruit_NFCShield_I2C nfc(IRQ, RESET); void setup(void) {   Serial.begin(9600);   pinMode(interruptPin,INPUT);   pinMode(diffPin,INPUT);   nfc.begin();   // configure board to read RFID tags   nfc.SAMConfig();   attachInterrupt(0,ResponseScanner,RISING);   //attachInterrupt(2,ReadMifare,RISING);   sevseg.Begin(1,22,24,26,28,30,32,34,36,38,40,42,44);   //Set the desired brightness (0 to 100);   sevseg.Brightness(90);   lcd.begin(16, 2); } void loop(void) {   sevseg.PrintOutput();   sevseg.NumOutput(NumRecycle,NumUnRecycle);  /*if(!NFCResponse) {lcd.setCursor(0, 0);  lcd.print("Hello,World!");}   else {      lcd.setCursor(0, 0);  lcd.print(userName[userPos]);      lcd.setCursor(0, 1);  lcd.print("Points:");      lcd.setCursor(7, 1);  lcd.print(userPoint[userPos]);     }*/      lcd.setCursor(0, 0);  lcd.print(userName[userPos]);      lcd.setCursor(0, 1);  lcd.print("Points:");      lcd.setCursor(7, 1);  lcd.print(userPoint[userPos]); } int CompareID(uint8_t array1[],uint8_t array2[],int length) {  int flag=1,i=0;    for(i=0;i    {       if(array1[i]!=array2[i]) {flag=0;break;}    }    return flag;  } void ReadMifare(void){   // Wait for an ISO14443A type cards (Mifare, etc.).  When one is found,   //'uid' will be populated with the UID, and uidLength will indicate   success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);   NFCResponse = 1;   if (success) {     if(CompareID(uid,user1,7)) Serial.println("Success!");     else if(CompareID(uid,user2,7)) Serial.println("Success!");     else if(CompareID(uid,user3,7)) Serial.println("Success!");     else Serial.println("No device found!");   } } void ResponseScanner(void) {    if(!digitalRead(diffPin)) ++NumUnRecycle;   else ++NumRecycle; }