基于arduino的宿舍门禁

发布于 2021-03-31  350 次阅读


研究这个东西的背景是因为总是忘记带钥匙出门。

科技嘛就是要用来解决实际问题的,于是就开始研究电子门锁了。

为啥想到电子门锁是因为现在什么东西都可能忘记带,除了手机。

手机上面现在大部分都有nfc功能,也就是所谓近场通讯。那么思路就很清晰了,感应手机的nfc信号然后下达开门的指令。

通过上网了解到基于arduino的电路开发是最简单的。

以下列出所需材料:arduino开发板*1

rc522感应模块*1

sg90舵机*1

充电宝*1

杜邦线若干

鱼线30cm

这些材料在淘宝上可以轻易买到,充电宝最好选择可以进行微电流供电的。

这里不详细讲解arduino的学习(b站很多教程)

这里提供源码和烧录软件

源码

#include "RC522.h" //RC522模块所需头文件
#include <SPI.h>
#include <Servo.h>
#include <string.h>
#include <math.h>

Servo myservo; // 创建一个伺服电机对象
unsigned char serNum[5]; //ic卡的id码
int decid=0;
int i=0;

void setup()
{
Serial.begin(9600);
Serial.println("welcome!");
SPI.begin();
pinMode(NRSTPD,OUTPUT);
pinMode(chipSelectPin,OUTPUT);
digitalWrite(chipSelectPin, LOW);
pinMode(NRSTPD,OUTPUT);
myservo.attach(6); // 8号引脚输出舵机的控制信号
MFRC522_Init();
myservo.write(0); //舵机初始角设为0
pinMode(6,OUTPUT);
}

int time=0;

void loop() //持续检测是否感应到ic卡
{
decid=0;
myservo.write(0);
unsigned char status; //状态变量
unsigned char str[MAX_LEN];
status = MFRC522_Request(PICC_REQIDL, str); //传入卡状态,2为无卡,0为感应到卡

if (status == MI_OK) //读取到ID卡时候,MI_OK=0
{
status = MFRC522_Anticoll(str);
if (status == MI_OK) //下一个时刻仍能读取到ID卡
{
memcpy(serNum, str, 5);
Serial.print("ID:");
ShowCardID(serNum); //输出卡ID,16进制

unsigned char* id = serNum;

for(i=0;i<4;i++){
decid=decid+id[i]*pow(16,i); //16转10进制
}
Serial.print("DECID:");
Serial.println(decid); //输出卡DECID,10进制

switch(decid){
case 31565://lzs card //允许通过的卡ID
case 31997://smk phone
case -27841://ycl phone
//若需要添加新卡,在此处新添加一个case XXXX:

Serial.println("Pass!");
myservo.write(180); //舵机转180度

for(;status == MI_OK;) //若卡一直贴在感应器上,保证门锁始终打开
{
delay(2000); //添加2s的刷卡延迟,方便单手开门

delay(100);
status = MFRC522_Request(PICC_REQIDL, str); //读取记录此时的卡状态
memcpy(serNum, str, 5);
}

myservo.write(0); //舵机转回
break; //跳出case

 

default: //如果不在允许的ID中

Serial.println("Strange Card");
delay(10000); //暂停10秒
break; //跳出default
}
}
}

delay(500); //每0.5s检测一次
}

头文件: Desktop

烧录软件https://www.arduino.cc/en/software

这是各个元件的连接示意图

rc522和开发板的连接

实际接线和机械部分(壳是3d打印的)

连接好就可以使用啦


zero