Arduino-宿舍智能门锁

先上个视频看效果:

0.25 复制打开抖音,看看【许明锋同学的作品】来自大一新生对大学宿舍智能化改造# 大学生 # 发... https://v.douyin.com/iNndYUe4/ Jic:/ N@j.cA 07/04

材料清单:

esp8266开发板一个---18RMB

SG90舵机一个---9RMB

RC-522 ID (NFC)模块一个---8RMB

有源蜂鸣器一个---3RMB

18650电池2800mah两个---18RMB

18650电池盒一个---4RMB

一些杜邦线,面包板,一把热熔胶枪,电工胶布,双面胶

步骤:

先把上面装备买齐了,注意不要买错型号什么的,然后自己去简单了解了解ardunio IDE开放环境的使用,学会简单的编译和上传即可,不会可以自己在csdn上搜索 学习,推荐个博主文章,能迅速带你入门:https://blog.csdn.net/as480133937/article/details/105322822

 还有这个:https://blog.csdn.net/as480133937/article/details/105331315?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169770155316777224423372%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=169770155316777224423372&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-105331315-null-null.142^v96^pc_search_result_base5&utm_term=ardunio%20IDE&spm=1018.2226.3001.4187

具体的还建议去看“太极创客”,里面有视频教学和文章,上面三个一起上,保你熟系ardunio,完美操作我下面的步骤 (下面步骤保姆级教程):

RC-522 ID (NFC)模块接线图:

esp8266引脚定义图:

2.注意上面接线引脚我稍微做了修改,以适应我的代码运行,具体更改如下:

esp8266与蜂鸣器链接:VCC--3.3V,GND--GND,I/O--D2

esp8266与舵机链接:中间红色线--3.3V,棕色--GND,黄色线--D1

 esp8266与RC522链接:3.3V--3.3V,,GND--GND,RST--D3,MISO--D6,MOSI--D7

SCK--D5,SDA--D4

你也可以自己修改引脚,这个简单,不用我多说

整体代码如下(已全部注释):

#include <SPI.h>         // 用于与RC522模块进行通信
#include <MFRC522.h>    // 用于操作RFID模块
#include <Servo.h>      // 用于控制舵机 

// RC522模块引脚定义
#define RST_PIN   0   // RC522 复位引脚
#define SS_PIN    2    // RC522 片选引脚(即SDA引脚)

MFRC522 mfrc522(SS_PIN, RST_PIN);   // 创建MFRC522对象

// 舵机引脚定义
#define SERVO_PIN  5           // SG90舵机控制引脚
const int buzzerPin = 4;    //设置蜂鸣器引脚
Servo servo;                 // 创建舵机对象

void setup() 
{
  Serial.begin(115200);            // 打开串口通信,波特率为115200
  pinMode(buzzerPin, OUTPUT);   // 设置数字引脚9为输出模式
 
  // 初始化SPI总线
  SPI.begin();
  
  // RC522初始化
  mfrc522.PCD_Init();
  mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
  Serial.println("Ready to read card ID...");
  // 连接舵机
  servo.attach(SERVO_PIN);
}

void loop() 
{
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial())
  {
    byte cardId[4];   // 存储卡片ID的数组
// 将卡片ID读取到cardId数组中
    for (byte i = 0; i < mfrc522.uid.size; i++) 
    {
      cardId[i] = mfrc522.uid.uidByte[i];
    }
    // 检查卡片ID是否有效
    if (checkCardId(cardId)) 
    {
      Serial.println("主人,门锁已开,欢迎回家!");
                                    // 识别蜂鸣器鸣叫滴一声表示识别成功
  digitalWrite(buzzerPin, HIGH);   // 将数字引脚15设置为高电平,蜂鸣器鸣叫
  delay(500);                      // 延迟500毫秒
  digitalWrite(buzzerPin, LOW);    // 将数字引脚9设置为低电平,蜂鸣器停止鸣叫
  delay(500);                      // 延迟500毫秒
  unlockDoor();   // 开锁操作
    } 
    else 
    {
  Serial.println("你个死鬼,门卡不对,再来!");
  digitalWrite(buzzerPin, HIGH);   // 将数字引脚15设置为高电平,蜂鸣器开始鸣叫
  delay(500);                      // 持续0.5秒钟
  digitalWrite(buzzerPin, LOW);    // 将数字引脚9设置为低电平,蜂鸣器停止鸣叫
  delay(200);                      // 停顿0.2秒钟
  digitalWrite(buzzerPin, HIGH);   // 持续鸣叫
  delay(500);                      // 持续0.5秒钟
  digitalWrite(buzzerPin, LOW);    // 停止鸣叫
  delay(200);                      // 停顿0.2秒钟
  digitalWrite(buzzerPin, HIGH);   // 持续鸣叫
  delay(500);                      // 持续0.5秒钟
  digitalWrite(buzzerPin, LOW);    // 停止鸣叫
  delay(2000);                     // 停顿2秒钟,实现鸣叫间隔,连续滴三声表示不通过,识别失败
    }
    // 暂停卡片操作
    mfrc522.PICC_HaltA();
    mfrc522.PCD_StopCrypto1();
  }  
}
bool checkCardId(byte* cardId)
{
  // 验证卡片ID是否与预设的有效卡片匹配
  byte validCard1[4] = {0xE3, 0x44, 0xD2, 0xFD};    // 有效卡片ID

  for (byte i = 0; i < 4; i++) 
  {
    if (cardId[i] != validCard1[i]) 
    {
      return false;
    }
  }
  return true;
}
void unlockDoor() 
{
  // 执行开锁操作
  servo.write(90);  // SG90舵机转动到90度
  delay(2000);     // 停留2秒钟
  servo.write(0);   // SG90舵机转动到0度,恢复初始位置
}

注意:因为每个ID卡都有属于自己的ID号,NFC能识别卡片身份靠的是每个不同卡片的ID然后与代码里面的ID进行匹配从而确认身份是否开门,所以要读出卡片的ID才行

读取NFC卡片的ID代码如下:

#include <Wire.h>
#include <Adafruit_MFRC522.h>
#define RST_PIN        0        // 指定RST引脚 D3
#define SS_PIN         2       // 指定SDA(SS)引脚 D4

Adafruit_MFRC522 mfrc522(SS_PIN, RST_PIN); // 创建MFRC522实例

void setup()
 {
  Serial.begin(9600); // 初始化串口通信
  while (!Serial);
  Wire.begin();
  mfrc522.PCD_Init(); // 初始化MFRC522模块
  Serial.println("正在读卡中...");
  Serial.println();
}

void loop()
 {
  if ( ! mfrc522.PICC_IsNewCardPresent())
 {
    return;
  }
  if ( ! mfrc522.PICC_ReadCardSerial())
 {
    return;
  }
  Serial.print("Card UID:");
  for (byte i = 0; i < mfrc522.uid.size; i++)
 {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  }
  Serial.println();
  mfrc522.PICC_HaltA();
}

复制编译上传后打开串口监视器即可看到ID显示出来了,是一个十六进制的数字,复制下来到第一个代码里(已经在第一个代码里注释粘贴在哪里了)ID填写格式为:0x+ID,类推过去,如图所示:

下面就是简单的接线安装了,本项目最核心的是代码,我现在分享出来了,代码是我自己花了五六天累积修改出来了,简单易懂,没有多余的杂质,

至于安装方面可以多看几遍我的成果视频就可以大概知道如何安装了,我前前后后用了一个多星期主要难点的不太熟系ardunio,还有舵机烧坏,排除开发板故障,接线出错,所以一定要熟系了再上手做项目,还有不懂的可以一起交流咯! 

如果后期想加入更多的卡片的话可以使用下面这一个代码进行卡片ID号的添加:

#include <SPI.h>                // 用于与RC522模块进行通信
#include <MFRC522.h>    // 用于操作RFID模块
#include <Servo.h>             // 用于控制舵机 

// RC522模块引脚定义
#define RST_PIN   0   // RC522 复位引脚
#define SS_PIN    2    // RC522 片选引脚(即SDA引脚)

MFRC522 mfrc522(SS_PIN, RST_PIN);   // 创建MFRC522对象

// 舵机引脚定义
#define SERVO_PIN  5           // SG90舵机控制引脚
int ledPin = 2;               //设置LED灯引脚
const int buzzerPin = 4;    //设置蜂鸣器引脚
Servo servo;                 // 创建舵机对象

void setup() 
{
  Serial.begin(9600);               // 打开串口通信,波特率为9600
  pinMode(ledPin, OUTPUT); // 将LED引脚设置为输出
  pinMode(buzzerPin, OUTPUT);   // 设置数字引脚9为输出模式
 
  // 初始化SPI总线
  SPI.begin();
  
  // RC522初始化
  mfrc522.PCD_Init();
  mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
  Serial.println("Ready to read card ID...");
  
  // 连接舵机
  servo.attach(SERVO_PIN);
}

void loop() 
{
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial())
  {
    byte cardId[4];   // 存储卡片ID的数组
                      // 将卡片ID读取到cardId数组中
    for (byte i = 0; i < mfrc522.uid.size; i++) 
    {
      cardId[i] = mfrc522.uid.uidByte[i];
    }

    // 检查卡片ID是否有效
    if (checkCardId(cardId)) 
    {
      Serial.println("主人,门锁已开,欢迎回家!");
    // 识别蜂鸣器鸣叫滴一声表示识别成功
  digitalWrite(buzzerPin, HIGH);   // 将数字引脚15设置为高电平,蜂鸣器鸣叫
  delay(500);                      // 延迟500毫秒
  digitalWrite(buzzerPin, LOW);    // 将数字引脚9设置为低电平,蜂鸣器停止鸣叫
  delay(500);                      // 延迟500毫秒
  unlockDoor();   // 开锁操作
    } 
    else 
    {
  Serial.println("你个死鬼,门卡不对,再来!");
  digitalWrite(buzzerPin, HIGH);   // 将数字引脚15设置为高电平,蜂鸣器开始鸣叫
  delay(500);                      // 持续0.5秒钟
  digitalWrite(buzzerPin, LOW);    // 将数字引脚9设置为低电平,蜂鸣器停止鸣叫
  delay(200);                      // 停顿0.2秒钟
  digitalWrite(buzzerPin, HIGH);   // 持续鸣叫
  delay(500);                      // 持续0.5秒钟
  digitalWrite(buzzerPin, LOW);    // 停止鸣叫
  delay(200);                      // 停顿0.2秒钟
  digitalWrite(buzzerPin, HIGH);   // 持续鸣叫
  delay(500);                      // 持续0.5秒钟
  digitalWrite(buzzerPin, LOW);    // 停止鸣叫
  delay(2000);                     // 停顿2秒钟,实现鸣叫间隔,连续滴三声表示不通过,识别失败
    }
    // 暂停卡片操作
    mfrc522.PICC_HaltA();
    mfrc522.PCD_StopCrypto1();
  }  
}
bool checkCardId(byte* cardId)
{
  byte validCard1[4] = {0xE3, 0x44, 0xD2, 0xFD}; // 有效卡片ID1
  byte validCard2[4] = {0x73, 0x2D, 0xCD, 0x0D}; // 有效卡片ID2
  byte validCard3[4] = {0x83, 0x60, 0xDC, 0xEC}; // 有效卡片ID2

  for (byte i = 0; i < 4; i++) 
  {
    if (cardId[i] != validCard1[i] && cardId[i] != validCard2[i]&& cardId[i] != validCard3[i])
    {
      return false;
    }
  }
  return true;
}
void unlockDoor() 
{
  // 执行开锁操作
  servo.write(90);  // SG90舵机转动到90度
  delay(2000);     // 停留2秒钟
  servo.write(0);   // SG90舵机转动到0度,恢复初始位置
}

PS:

1.可以使用自己学校的校园卡做NFC卡给舍友每个人一份开门卡片,具体如何操作我懒得写了,可以自己学或者问我

2.我还制作了一个智能温湿度显示器,ardunio是个很好玩的东西,主要你坚持的兴趣在里面,不断动手实践它,一定要动手,Ardunio一定要学会看懂它的代码,不然你会炸脑的

3.这个项目可以上一个18650(1500mah--买倍量的这个牌子好像六七块一个,贼便宜啦)的电池独立供电,经过测试充满电可以支持半个月左右供电,简单方便,不用拉线那麻烦

4.还有舵机链接上要与锁拉绑定好,如果拉的力度太小了,就去弄一个给它独立供电比较好

5.至于外面的NFC感应模块建议自己找个东西用胶布防护一下,好看一点,怕有些人给你拆了

6.NFC模块要买那种焊接好针脚的比较好,万一你做的过程不行就回怀疑它是不是坏了,又得买一个捣了半天费心(别问我怎么知道的),实在不行可以和我视频里一样直接用一个小小的面包板再用杜邦线插进去就行了,不用针脚,免得接触不良(我研究半天才发现还可以这样,呜呜呜)

7.总之很有成就感,以后宿舍出行很方便了

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RFID-RC522是一种射频识别(RFID)模块,专门用于读取和写入RFID标签的信息。它使用13.56MHz的射频信号进行通信,并可以与Arduino单片机进行连接和控制。 RFID-RC522例程是一段可以在Arduino开发环境中运行的程序,用于演示如何使用RFID-RC522模块进行读取和写入RFID标签的信息。这个例程提供了一系列的函数和指令,可用于初始化模块、设置通信参数、读写标签数据等操作。 例程通常包含以下几个重要的部分: 1. 引入库文件:需要引入RFID-RC522相关的库文件,以便在程序中使用封装好的函数和指令。 2. 配置引脚:需要设置与RFID-RC522模块相连接的引脚,包括SDA、SCK、MOSI、MISO和RST等。 3. 初始化模块:调用相应的函数进行模块的初始化,包括设置通信速率、启用SPI接口等。 4. 寻卡:使用寻卡命令向附近的RFID标签发送信号,并等待标签的响应。 5. 读取标签信息:一旦找到附近的标签,可以使用读取指令来获取标签中储存的数据,例如标签的序列号、数据区域等。 6. 写入标签信息:可以使用写入指令将特定数据写入到RFID标签的指定区域。 7. 关闭模块:在程序结束或需要关闭模块时,可以调用关闭函数以释放资源。 通过使用RFID-RC522例程,我们可以轻松地实现对RFID标签的读写操作,从而在各种应用场景中实现身份验证、物品追踪、门禁控制等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级酷蜜蜂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值