先上个视频看效果:
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
具体的还建议去看“太极创客”,里面有视频教学和文章,上面三个一起上,保你熟系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.总之很有成就感,以后宿舍出行很方便了