作者太菜,只能给你们🐟。
小白的RFID宿舍智能锁
感谢https://blog.csdn.net/ling3ye/article/details/71036479作者。
背景故事
由于作者患有十级懒癌
经常忘带钥匙,故在各大论坛上搜寻攻略以盼早日实现回寝自由
想起了那些个坐在楼梯口被冷风吹的日子
为你我受冷风吹,忘带钥匙流眼泪
终于终于在某一天小菜鸡下了这个蛋,为寝室建设了一个民生工程
(听说有小黑盒能暴力破解RFID,故我的这个项目只能防君子,但话说人家买小黑盒还不如对着我这82年的老门踹一脚见效快。)
成品展示
(项目核心就是下面那个充电宝)
(用电工胶带封装后的RFID模块)
开锁过程,忽略随便的封面
粗略流程
1.RFID读卡模块读入UID
2.验证成功
3.驱动舵机旋转
4.舵机把门栓拉开
5.舵机复位
材料准备
1.RFID读卡模块
某宝搜索MFRC-522,几块钱搞定,像我一样不会焊板子的记得让小二帮焊针脚!
2.Arduino开发板
某宝直接搜索,UNO R3 15-25块搞定
3.舵机
某宝搜索,作者用的是MG996R,十来块钱搞定
4.热熔胶枪
用于固定舵机,某宝直接搜索,十来块搞定
5.杜邦线-公对母
用于延长数据线,某宝直接搜索,长短自取
6.绳子,胶带
到处找找,或某宝随意
核心:充电宝
也可以直接插上充电器,但充电宝自带电源保护芯片更安全。(会焊电源保护芯片的大佬应该也不会看我这篇文章吧,哈哈哈)
制作过程
一.连接线路
1.舵机
舵机一共有3根线
红色-电压 接5v端口
棕色-地线 接GND
橙色-信号线 接8号口(可在代码中修改)
如果线的颜色不同百度其功能后正常接线
2.RFID模块
Arduino Uno <------> RFID-RC522
10 <------> SDA
13 <------> SCK
11 <------> MOSI
12 <------> MISO
NULL不接 <------> IRQ
GND <------> GND
9 <------> RST
3.3V <------> 3.3V
二.上传代码
1.安装arduino IDE
官方论坛下载地址
不会安装可百度、csdn、哔哩哔哩
2.新建项目
导入MFRC522.h库 见文首链接程序部分,推荐第二种方法
a.打开Arduino编译器,上方导航栏 - 文件 - 新建。
b.将下列代码复制进去
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#define SS_PIN 10 //定义RC522的SDA引脚的接线位置。
#define RST_PIN 9 //定义RC522的RST引脚的接线位置。
#define PIN_SERVO 8 //定义舵机信号线的接线位置,这里定义的是8号口。
String refid1="";//先声明一个空的字符串全局变量。以便后面存储nuidPICC里面的数据。
Servo myservo; //实例化类-舵机
MFRC522 rfid(SS_PIN, RST_PIN); //实例化类-RFID读卡模块
// 初始化数组用于存储读取到的NUID
byte nuidPICC[4];
void setup() {
Serial.begin(9600);
SPI.begin(); // 初始化SPI总线
rfid.PCD_Init(); // 初始化 MFRC522
myservo.attach(PIN_SERVO);
myservo.write(0);
}
void loop() {
// 找卡
if ( ! rfid.PICC_IsNewCardPresent())
return;
// 验证NUID是否可读
if ( ! rfid.PICC_ReadCardSerial())
return;
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
// 检查是否MIFARE卡类型
/*if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println("不支持读取此卡类型");
return;
}*/
// 将NUID保存到nuidPICC数组
for (byte i = 0; i < 4; i++) {
nuidPICC[i] = rfid.uid.uidByte[i];
}
Serial.print("十进制UID:");
printHex(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
//对读取的卡号“xxx”进行比较,注意数据类型。
check();
// 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
rfid.PICC_HaltA();
// 停止读卡模块编码
rfid.PCD_StopCrypto1();
refid1="";
}
void unlock()
{
myservo.write(180);//旋转角度
delay(2200);//舵机复位延时,单位ms
myservo.write(0); //复位
}//这是驱动舵机的函数
void check()
{
if(refid1=="这里填刷卡后控制台输出的UID"||refid1=="以此类推"||refid1=="有几张卡写几个"||refid1=="例如"||refid1=="123456789"||refid1=="987654")
{
//判断为真,执行需要的程序。
Serial.println("已验证");
unlock();
}
else
{
//判断为假,执行需要的程序。
Serial.println("验证失败");
Serial.println(refid1);//打印不匹配的UID
}
}//验证函数
void printHex(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : "");
//这里对nuidPICC进行存储
refid1+=nuidPICC[i];
}
//这里对nuidPICC打印,看是是自己需要的数据。
Serial.print(refid1);
}
c.点击上方导航栏下面的那个 Nike (√) 进行编译。
d.编译完成后将Arduino开发板连接线插上电脑usb接口
e.连接成功后点击导航栏下面的那个右箭头 → 上传代码到开发板
f.按下图提示绑定端口(USB接口不同对应端口号不同)
g.打开上图工具列表中的串口显示器
h.将你需要添加的卡放在RFID模块上,串口监视器输出如下图
i.check()函数的位置,下图
j.数据修改完毕后,重复一次c、e步骤即可完成
三.上门!
用热熔胶将舵机和开发板固定门上即可。
RFID模块推荐使用双面胶+巨型大胶带+电工胶固定。我刚好都有,haha
核心模块充电宝推荐使用双面胶+大胶带+塑料袋 制作收纳袋固定