完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
在学校生活中偶尔会遇到忘带钥匙的情况出现,如果室友碰巧也不在寝室的话,自己只能站在寝室外等待。同时不知道是否宿舍门锁老旧的原因,开门比较纠结花时间,时常有制作自动门锁的想法。后来入手了RFID读卡器,可以正常读取市面上的Mifare S50,S70非接触智能卡(学校的饭卡就可以读取),于是就构想了这个基于RFID的寝室门禁系统。
本系统原理是基于非接触式卡的序列号是唯一的,制造厂家在产品出厂前已将此序列号固化,不可再更改。这样不同的卡都是唯一的存在,可以利用读卡器读取卡的序列号,来判断卡的拥有者(像我的室友)。基本原理可以参考下图: 门禁系统1.0 |
|
|
相关推荐
|
|
|
制作材料:
Arduino UNO NOKIA 5110液晶屏 RFID-RC522读卡器 MG-996R舵机 移动电源 首先,是将RFID-RC522和UNO连接起来,这个读卡器是基于SPI通讯。但这里有一个封装比较好的库文件支持RC522,可以自定义SPI针脚位。NOKIA 5110液晶屏也有库文件——支持画图,中文显示,可以自定义针脚位。因为开启门锁需要较强拉力,这样MG-996R所需电量比较大,实际使用时,需要给舵机单独供电。 |
|
|
|
|
|
|
|
|
软件部分
主控部分用的的是Arduino Uno,使用了arduino IDE 1.04,部分代码如下: //端口定义 #include #include #include #define servopin 7 #define sensor 0 #define BL 9 LCD5110 myGLCD(2,3,4,5,6);//CLk-SCK,Din-MOSI,DC,RST-IO,CS-CE extern uint8_t SmallFont[]; RFID rfid(10,8); //D10–读卡器MOSI引脚、D5–读卡器RST引脚 //4字节卡序列号,第5字节为校验字节 unsigned char serNum[5]; //写卡数据 unsigned char writeDate[16]; String comdata = “”; …… //舵机驱动定义 void servopulse(int angle)//定义一个脉冲函数 { int pulsewidth=(angle*11)+500; //将角度转化为500-2480的脉宽值 digitalWrite(servopin,HIGH); //将舵机接口电平至高 delayMicroseconds(pulsewidth); //延时脉宽值的微秒数 digitalWrite(servopin,LOW); //将舵机接口电平至低 delayMicroseconds(20000-pulsewidth); } //工作使能 long randNumber = random(0, 20); unsigned char i,tmp; unsigned char status; unsigned char str[MAX_LEN]; unsigned char RC_size; while (Serial.available() > 0) { comdata += char(Serial.read()); delay(2); } for(int i=0;i<16;i++) { writeDate=comdata; } //找卡 rfid.isCard(); //读取卡序列号 if (rfid.readCardSerial()) { Serial.print(“The card’s number is : “); Serial.print(rfid.serNum[0]); Serial.print(” , “); Serial.print(rfid.serNum[1],BIN); Serial.print(” , “); Serial.print(rfid.serNum[2],BIN); Serial.print(” , “); Serial.print(rfid.serNum[2],BIN); Serial.print(” , “); Serial.print(rfid.serNum[4],BIN); Serial.println(” “); if(rfid.serNum[0]==205||rfid.serNum[0]==21||rfid.serNum[0]==85||rfid.serNum[0]==117){ for(int i=0;i<100;i++) { servopulse(45); if(rfid.serNum[0]==205||rfid.serNum[0]==117) { myGLCD.clrScr(); Serial.println(“Welcome Mr.Xiao”); myGLCD.print(“Welcome”,int(randNumber)+20,int(randNumber)); myGLCD.print(“Mr.Xiao”,int(randNumber)+20,int(randNumber)+20); analogWrite(BL,HIGH); } if(rfid.serNum[0]==85) { myGLCD.clrScr(); Serial.println(“Welcome Mr.Yang”); myGLCD.print(“Welcome”,int(randNumber)+20,int(randNumber)); myGLCD.print(“Mr.Yang”,int(randNumber)+20,int(randNumber)+20); digitalWrite(BL,HIGH); } if(rfid.serNum[0]==21) { myGLCD.clrScr(); Serial.println(“Welcome Mr.Huang”); myGLCD.print(“Welcome”,int(randNumber)+20,int(randNumber)); myGLCD.print(“Mr.Huang”,int(randNumber)+20,int(randNumber)+20); digitalWrite(BL,HIGH); } } //引用脉冲函数 delay(3000); for(int i=0;i<100;i++) { servopulse(0); } } } if (!rfid.readCardSerial()){ digitalWrite(servopin,LOW); digitalWrite(BL,LOW); } rfid.halt(); //指挥卡进入睡眠模式 } 这里有两个库文件。(RFID.h, LCD5110_CN.h) |
|
|
|
|
|
|
|
|
总装实验
电路连接的部分结束后,我使用了比较简陋的纸壳将整个装置包装起来。电路部分固定在了里面,再将整个包装粘合在门后,其中读卡器是在门缝走线(幸亏是木门)。 |
|
|
|
|
|
|
|
|
后记
以上只是我想法的最基础版本,可以说是系统1.0版吧,但这样已经完成了最初的预想。我想这个基础版还是有很大的发展空间,完全可以基于此,进一步使整个寝室智能化。下一步我想加强系统的稳定性,以及增加密码键功能,开发出后续版本。也希望有兴趣的朋友那个给出宝贵的建议,大家一起分享快乐。 |
|
|
|
|
|
|
|
470 浏览 0 评论
532 浏览 0 评论
660 浏览 0 评论
822 浏览 0 评论
RT-Thread与英飞凌(infineon)合作得板子PSOC 6 板子学习
758 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
17034 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-13 18:49 , Processed in 1.444976 second(s), Total 71, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖