用RC522与arduino做一个简单的门禁系统
插本成功要去新学校了,结果发现新学校宿舍没有电梯没有电子门(虽然海景房很香)。这对于住惯养老院的我属实难受所所以打算自己也整一个IC卡的门禁系统。然后想着有没有前人的参考让我好借鉴一下(其实是偷懒)。然后在知乎看到了个高度契合的文章。
大家也可以参考下
https://zhuanlan.zhihu.com/p/66467989
然后按照大概思路我也买了些材料
一个UNO3 带线 16.8
一个MFRC-522 3.28
再来一个MFRC-522自带引脚版本(第一块参考了知乎的代码跑不动以为是芯片自己没焊好,重新焊坏了后含泪买了新板子,其实买个带引脚的会好点,方便自己焊还要烙铁焊锡啥的)
一个MG90S金属舵机 9.8
一包LED 3.9
杜邦线啥的 3.55
一个高中不好好学习玩手机留下来的旧电宝 四舍五入不要钱
材料图大概这个样子,去淘宝都能买到。成品大概这个样子
顺便贴下我焊接失败的522,其实没坏就是太丑了一点有点嫌弃
好了让我们开始捋一下设计思路
当门外的芯片识别到了正确的卡就会通过UNO驱动舵机开门同时亮绿灯,如果是非法卡就不开门,同时亮红灯。
这里我们需要几个arduino的库。
#include <Servo.h> 控制舵机,直接在arduino安装库里面搜索就可以了
#include<RC522.h> RC522通信的库,可以直接在上面知乎的文章里引用他的库,百度什么都可以,反正库都一样的
话不多说直接看代码
/*
Name: 门禁初稿.ino
Created: 2021/8/24 21:06:23
Author: Evanglong
*/
//#include <Adafruit_Circuit_Playground.h>
//#include <Adafruit_CircuitPlayground.h>
#include <SPI.h>
#include "E:/Arduino/data/opendoor/src/RC522-1 .h"
#include <Servo.h>
#define servo 8//舵机控制
#define LED_1 7 //绿指示灯控制
#define LED_2 6 //红指示灯控制
#define Inductive 5 //感应开关判断
Servo myservo; // 创建一个伺服电机对象
int angle = 0;//舵机初始角
unsigned char serNum[5]; //无符号数组
void setup()
{
Serial.begin(57600); //设置串口的波特率
SPI.begin(); //总线初始化
pinMode(chipSelectPin, OUTPUT);//设置引脚为输出
digitalWrite(chipSelectPin, LOW); //设为低电平
pinMode(NRSTPD, OUTPUT); //设置引脚为输出
MFRC522_Init(); //串口通信初始化
AntennaOff(); //关闭天线
delay(20); //延时2毫秒
AntennaOn(); //开启天线
Serial.println("Checkpoint 01");
pinMode(servo, OUTPUT); //设置电机引脚为输出
pinMode(LED_1, OUTPUT); //LED
pinMode(LED_2, OUTPUT);
pinMode(Inductive, INPUT); //设置感应开关
myservo.attach(servo); // 8号引脚输出电机控制信号
Serial.println("checkpoint 02");
}
void loop()
{
uchar status;
uchar str[MAX_LEN];
status = MFRC522_Request(PICC_REQIDL, str);
if (status != MI_OK)
{
return;
}
Serial.println("checkpoint 03");
ShowCardType(str); //查看卡的类型
status = MFRC522_Anticoll(str); //防止冲突返回网卡的4字节序列号
if (status == MI_OK)
{
Serial.print("The card's number is: ");
memcpy(serNum, str, 5);
ShowCardID(serNum);
//ID卡的相关身份验证
uchar * id = serNum;
//把**替换成自己NFC的识别号就可以了,手机随便下个APP就能读取(手机自己有NFC功能),或者买RC522的时候送的白卡,在写入测试的时候可以在串口数据里面读取到卡的密码
if (id[0] == 0x** && id[1] == 0x** && id[2] == 0x** && id[3] == 0x**) {
Serial.println("The Host 1!");
digitalWrite(LED_1, HIGH); //指示灯闪烁
delay(200);
digitalWrite(LED_1, LOW);
for (angle = 0; angle