AS3992 超高频UHF RFID for arduino 图书馆管理方案与源码

功能说明:选用ElecKits的as3992 UHF RFID模块,arduino控制,标签分为人卡和书卡,单独书卡有报警显示,如果人卡书卡一起通过,则第一次是借书,第二次是还书。

1. 取5张标签,其中2张的EPC填写在代码中Stu student[PERSONS]这个结构体变量初始化中的相应位置,另外的3张的EPC填写在Bk book[BOOKS]结构体变量初始化的相应位置

2. 库的压缩包NewSoftSerial.rar解压到arduino0022安装目录下的 libraries文件夹下

3. 将代码烧写进arduino UNO

4.  RFID的串口的TX,RX,GND分别接UNO的0,3,GND

5.   打开串口调试软件,选择正确的串口号,波特率115200,校验位NONE,数据位8位,停止位1位

3e63b3fbge1653d1aec21amp69

6. 打开串口,从填入Stu student[PERSONS]中的标签(代表一个人)和填入Bk book[BOOKS]中的标签(代表一本书)各取一张,放在RFID天线之上然后移开,此时可以从串口监视器看到此人已经成功借到该书,再次把这第2张标签放在天线之上,串口监视器提示,此人成功归还了该书

3e63b3fbge1653fdf28d3amp69

上代码:

#include <NewSoftSerial.h>
 
#define DEBUG
 
#define LOCAT_EPC 6
 
#define EPC_len 12
 
#define PERSONS 2
 
#define BOOKS 3
 
#define MAXBORROW 2
 
#define NONE 0xff
 
#define TimeInterval 5000
 
NewSoftSerial as3992(2,3);
 
long FinishTime;
 
byte LastPerson;
 
byte CountOfTag=0;
 
byte StudentTags[2];
 
byte BookTags[10];
 
byte COMMAND[30];
 
byte ReceBuffer[50];
 
byte EPC[3][EPC_len];
 
int NumOfRece=0; //rfid返回的数据的个数
 
byte char_in;
 
typedef struct{
 
const char name[10];
 
byte count;
 
const byte epc[EPC_len];
 
byte BorrowedBooks[MAXBORROW];
 
}
 
Stu;
 
Stu student[PERSONS]={
 
{"zhang san",0,{0x22,0x22,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12}}, //自行修改成持有的标签的EPC
 
{"li si",0,{0xE2,0x00,0x10,0x21,0x41,0x18,0x00,0x70,0x21,0x90,0x30,0xEB}},
 
};
 
typedef struct{
 
const char name[20];
 
const byte epc[EPC_len];
 
}
 
Bk;
 
Bk book[BOOKS]={ //自行修改成持有的标签的EPC
 
{"shui hu zhuan", {0xE2,0x00,0x10,0x21,0x41,0x18,0x00,0x75,0x21,0x90,0x30,0xFF}},
 
{"hong long meng",{0xe2,0x00,0x10,0x21,0x41,0x18,0x00,0x83,0x21,0x90,0x31,0x1f}},
 
{"xi you ji",{0xE2,0x00,0x10,0x21,0x41,0x18,0x00,0x74,0x21,0x90,0x30,0xFB}},
 
};
 
void setup()
 
{
 
Serial.begin(115200);
 
as3992.begin(115200);
 
pinMode(3,OUTPUT);
 
pinMode(10,OUTPUT);
 
LastPerson=0xff;
 
}
 
void loop()
 
{
 
byte tag,who_person;
 
if((tag=SearchForTag(EPC,0x01)) == 1)
 
{
 
if((who_person=whois(EPC)) != NONE)
 
{
 
#ifdef DEBUG
 
Serial.print("\n\nName: ");
 
Serial.print(student[who_person].name);
 
Serial.print("\n");
 
Serial.print("sum of borrowed: ");
 
Serial.print(student[who_person].count,DEC);
 
Serial.print("\n");
 
Serial.print("list of borrowed:\n");
 
for(char i=0;i < student[who_person].count ;i++)
 
{
 
Serial.print("<<");
 
Serial.print( book[ student[who_person].BorrowedBooks[i] ].name );
 
Serial.print(">>\n");
 
}
 
Serial.print("\n");
 
delay(500);
 
#endif
 
}
 
else if( whichBook(EPC,StudentTags[0],BookTags) > 0)
 
{
 
Serial.print("You cannt take the book ");
 
Serial.print("<<");
 
Serial.print( book[BookTags[1]].name );
 
Serial.print(">>");
 
Serial.print(" out...\n");
 
delay(500);
 
}
 
}
 
else if(tag > 1)
 
{
 
do{
 
tag=SearchForTag(EPC,0x01);
 
who_person=whois(EPC);
 
}
 
while(LastPerson == who_person && (millis()-FinishTime) < TimeInterval);
 
if(tag > 1)
 
{
 
if( (who_person=whois(EPC)) != NONE)
 
{
 
#ifdef DEBUG
 
Serial.print("\n\nName: ");
 
Serial.print(student[who_person].name);
 
Serial.print("\n");
 
Serial.print("sum of borrowed: ");
 
Serial.print(student[who_person].count,DEC);
 
Serial.print("\n");
 
Serial.print("list of borrowed:\n");
 
for(char i=0;i < student[who_person].count ;i++)
 
{
 
Serial.print("<<");
 
Serial.print( book[ student[who_person].BorrowedBooks[i] ].name );
 
Serial.print(">>\n");
 
}
 
Serial.print("\n");
 
#endif
 
byte FoundOfBookTags;
 
if( (FoundOfBookTags=whichBook(EPC,StudentTags[0],BookTags)) > 0) //BookTags[0]:书标签在EPC中的编号
 
{ //BookTags[1]:此书在书的结构体中的编号......
 
char i,j;
 
for(i=0;i < FoundOfBookTags*2 ;i=i+2)
 
{
 
for(j=0;j<student[who_person].count;j++)
 
{
 
if( student[who_person].BorrowedBooks[j] == BookTags[i+1])
 
break;
 
else
 
continue;
 
}
 
if( j == student[who_person].count) //借书
 
{
 
if(MAXBORROW == student[who_person].count)
 
{
 
#ifdef DEBUG
 
Serial.print("You had borrowed ");
 
Serial.print(MAXBORROW);
 
Serial.print(" books,so you can not borrow any more!\n");
 
#endif
 
continue;
 
}
 
byte num=student[who_person].count;
 
student[who_person].BorrowedBooks[num]=BookTags[i+1];
 
student[who_person].count++;
 
#ifdef DEBUG
 
Serial.print("Success!You have borrowed one book!\n");
 
Serial.print("The book is: ");
 
Serial.print("<<");
 
Serial.print(book[ BookTags[i+1] ].name);
 
Serial.print(">>\n");
 
Serial.print("\n");
 
#endif
 
continue;
 
}
 
else //还书
 
{
 
for(char k=j;k<(student[who_person].count-1);k++)
 
student[who_person].BorrowedBooks[k]=student[who_person].BorrowedBooks[k+1];
 
student[who_person].count--;
 
#ifdef DEBUG
 
Serial.print("Success!You have returned one book!\n");
 
Serial.print("The book is: ");
 
Serial.print("<<");
 
Serial.print(book[ BookTags[i+1] ].name);
 
Serial.print(">>\n");
 
Serial.print("\n");
 
#endif
 
continue;
 
}
 
}
 
LastPerson=who_person;
 
FinishTime=millis();
 
}
 
}
 
else
 
{
 
who_person=NONE;
 
if(whichBook(EPC,who_person,BookTags) > 0)
 
#ifdef DEBUG
 
Serial.print("You can not take any book out...\n");
 
#else
 
;
 
#endif
 
}
 
}
 
}
 
}
 
void ReceData(byte * buffer)
 
{
 
NumOfRece=0;
 
int index=0;
 
while(Serial.available() > 0)
 
{
 
char_in=Serial.read();
 
NumOfRece++;
 
*(buffer+index)=char_in;
 
index++;
 
}
 
}
 
byte whois(const byte epc[][EPC_len])
 
{
 
byte p,per,j;
 
for(p=0;p<CountOfTag;p++) //查询到第几张标签
 
{
 
for(per=0;per<PERSONS;per++) // 查询到第几个人
 
{
 
for(j=0;j<EPC_len;j++) //循环12次比较EPC
 
{
 
if( student[per].epc[j]==EPC[p][j] )
 
;
 
else
 
break;
 
}
 
if(j==EPC_len){
 
StudentTags[0]=p; //此人在EPC[][]中的编号
 
StudentTags[1]=per; //此人在Student结构体数组中的编号
 
return StudentTags[1];
 
}
 
}
 
}
 
StudentTags[0]=NONE;
 
StudentTags[1]=NONE; //NONE==0xff
 
return NONE; //没有找到人
 
}
 
byte whichBook(const byte EpcBook[][EPC_len],byte PersonInEPC,byte *StoreBookTag) //person=whois(epc[][EPC_len])
 
{
 
byte e,b,j;
 
byte num=0,k=0;
 
for(e=0;e<CountOfTag;e++) //查询到第几张标签
 
{
 
if(e == PersonInEPC)
 
continue;
 
for(b=0;b<BOOKS;b++) // 查询到第几本书
 
{
 
for(j=0;j<EPC_len;j++) //循环12次比较EPC
 
{
 
if( book[b].epc[j]==EpcBook[e][j] )
 
continue;
 
else
 
break;
 
}
 
if(j==EPC_len)
 
{
 
*(StoreBookTag+num)=e; //StoreBookTag[],前一位保存搜索到的书的标签在EPC[][]里的编号
 
*(StoreBookTag+num+1)=b; //后一位保存此书标签所对应的书在book结构体中的编号
 
num+=2;
 
k++;
 
break;
 
}
 
}
 
}
 
return k; //找到几本书的标签
 
}
 
byte SearchForTag(byte epc[][EPC_len],byte start)
 
{
 
COMMAND[0]=0x31;
 
COMMAND[1]=0x03;
 
COMMAND[2]=start;
 
char i;
 
for(i=0;i<COMMAND[1];i++)
 
as3992.print(COMMAND[i]);
 
delay(100); //延迟很重要
 
ReceData(ReceBuffer);
 
byte count;
 
if(ReceBuffer[0] == 0x32 && (count=ReceBuffer[2]) > 0)
 
{
 
char index=0;
 
byte StartPoint=LOCAT_EPC;
 
while(count--)
 
{
 
for(byte j=StartPoint,k=0;k<EPC_len;j++,k++) //保存EPC
 
epc[index][k]=ReceBuffer[j];
 
StartPoint+=18;
 
index++;
 
}
 
return CountOfTag=ReceBuffer[2];
 
}
 
else
 
return CountOfTag=0;
 
}

完全兼容AMS官方价值RMB 4000元的Roger开发板。适合客户做RFID的二次开发。我们是模块产品,可以通过普通Uart接口把模块集成到您的项目中。我们的价格只是原厂的四分之一!!!!!

Uart串口UHF RFID读写器 915M 无源GEN2超高频读写模块 AS3992

http://item.taobao.com/item.htm?spm=a1z10.1.w4004-3535073336.7.rTV2tL&id=15138367983

RFID 读写器系统包括如下部分:

电源适配器+3.0~3.3V/2A       一个      赠送

RFID 读写模块 一块

RFID 读写天线 (单独选配)

1、3dBi PCB MMCX口 UHF 天线:尺寸 4.5cm*4.1cm

http://item.taobao.com/item.htm?spm=a1z10.5.w4002-3535073328.12.Dejdh5&id=13640879646

2、5dBi PCB MMCX口 UHF 天线:尺寸 10cm * 10cm

http://item.taobao.com/item.htm?spm=a1z10.5.w4002-3535073328.18.Dejdh5&id=23426460127

3、【推荐!!】8dBi 板状定向圆极化 MMCX口 UHF 天线:尺寸 22.5cm*22.5cm

http://item.taobao.com/item.htm?spm=a1z10.5.w4002-3535073328.15.Dejdh5&id=22075632296

与PC 机连接的通信电缆 一条     赠送

EPC UHF GEN2 电子标签 一个    赠送

RFID 读写器开发资料SDK及应用程序    赠送

更多资料、手册,在 http://arm.eleckits.com    下载频道 UHF RFID页面可以直接下载。

您还可以登陆 http://rfid.eleckits.com 下载更多相关资料。

Print Friendly, PDF & Email
标签: , , , , , , ,

发表评论