0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

带RFID的ESP32访问控制

454398 来源:网络整理 作者:佚名 2019-11-04 17:26 次阅读

步骤1:操作

RFID系统基本上由带有解码器的收发器天线和应答器组成。以及它如何运作?这些卡中有一个卷轴。当您从阅读器接近它们时,它们会通过连接到阅读器的天线发出无线电信号。带电标签(即卡)对存储在其内存中的信息进行调制,然后将该数据发送到读取器。然后,该卡进入读取区域并从读取器接收电源以执行操作。 RFID阅读器接收标签发送的信息,将数据解码并将其发送到服务器应用程序。

步骤2:内存

《如前所述,这种芯片内部有1k的内存。并且,EEPROM存储器的组织方式如下:4个块的16个扇区。每个块包含16个字节。请记住,在源代码中,您仅引用块号。

步骤3:电路

在此图中,带有RFID芯片的钥匙扣,除了组装件,我们还有传统的卡。以及该电路如何工作?嗯,在互联网上,您会发现RFID-RC522模块非常适合Arduino使用,但问题是该Arduino(无论是Mega,Nano),无论型号如何,都无法通信,例如WiFi网络以太网,彼此之间。所以我们在这里使用ESP32。它已经具有蓝牙,RF,即易于通信。那么我在这里指出,几乎所有与Arduino兼容的东西都可以在ESP32上使用。

返回电路,当在对卡或芯片进行分析时,绿色LED亮起时,这意味着标识已完成,访问被释放。红色LED点亮时,表明数据尚未通过验证。

步骤4:WiFi NodeMCU-32S ESP-WROOM-32

步骤5:RFID-RC522

在这里,我们获得了卡和钥匙圈以及RFID天线的图像。一个重要的细节是它的接口是SPI。

第6步:组装

在我们的组装中,我们的ESP32由USB,并以Arduino IDE的串行连接,有两个LED指示读取是否成功,还有RFID读取器RC522。我们有带芯片和卡的钥匙圈。

将钥匙圈放在播放器上会显示0表示读取数据,1表示记录数据。我们以一个示例为例,该示例显示读取芯片或卡后,如果绿色指示灯点亮,则读取器会识别出该数字。如果指示灯为红色,则表示发生了某种类型的错误,并且未执行身份验证。

在示例中,我仍然展示了如何将数据写入标签,下面将对此进行说明。

第7步:库

添加以下库“ MFRC522”。

只需访问“草图” 》》包括库》》管理库。..”

步骤8:源代码

我们的程序将按以下方式工作:启动后,程序将等待卡或标签被识别。之后,将出现一个菜单,供用户在阅读或记录内容之间进行选择。然后将执行该操作。

步骤9:设置

在这一部分中,我们处理库的包含并定义缓冲区和块数据大小。我们创建对象并初始化引脚,以及串行,SPI通信,LED和天线服务。我已经开始在串行监视器上包含消息了。

#include //library responsible for communicating with the module RFID-RC522

#include //library responsible for communicating of SPI bus

#define SS_PIN 21

#define RST_PIN 22

#define SIZE_BUFFER 18

#define MAX_SIZE_BLOCK 16

#define greenPin 12

#define redPin 32

//used in authentication

MFRC522::MIFARE_Key key;

//authentication return status code

MFRC522::StatusCode status;

// Defined pins to module RC522

MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup()

{

Serial.begin(9600);

SPI.begin(); // Init SPI bus

pinMode(greenPin, OUTPUT);

pinMode(redPin, OUTPUT);

// Init MFRC522

mfrc522.PCD_Init();

Serial.println(“Approach your reader card.。.”);

Serial.println();

步骤10:循环

在循环中,我们等待卡方法并选择相同的方法。在菜单中,我们提供了读取或写入数据的选项。当设备应从活动状态变为停止状态时,我们对此部分进行了指示。我们必须使用这种方法来启用新的读数。

void loop()

{

// Aguarda a aproximacao do cartao

//waiting the card approach

if ( ! mfrc522.PICC_IsNewCardPresent())

{

return;

}

// Select a card

if ( ! mfrc522.PICC_ReadCardSerial())

{

return;

}

// Dump debug info about the card; PICC_HaltA() is automatically called

// mfrc522.PICC_DumpToSerial(&(mfrc522.uid));

//call menu function and retrieve the desired option

int op = menu();

if(op == 0)

readingData();

else if(op == 1)

writingData();

else {

Serial.println(F(“Incorrect Option!”));

return;

}

//instructs the PICC when in the ACTIVE state to go to a “STOP” state

mfrc522.PICC_HaltA();

// “stop” the encryption of the PCD, it must be called after communication with authentication, otherwise new communications can not be initiated

mfrc522.PCD_StopCrypto1();

}

步骤11:阅读

在这一部分中,我们将阅读卡/标签的数据。我们必须准备所有键,处理缓冲区的大小,并对要操作的块进行身份验证。最后,我们设置读取数据的打印方式。

//reads data from card/tag

void readingData()

{

//prints the technical details of the card/tag

mfrc522.PICC_DumpDetailsToSerial(&(mfrc522.uid));

//prepare the key - all keys are set to FFFFFFFFFFFFh

for (byte i = 0; i 《 6; i++) key.keyByte[i] = 0xFF;

//buffer for read data

byte buffer[SIZE_BUFFER] = {0};

//the block to operate

byte block = 1;

byte size = SIZE_BUFFER;

//authenticates the block to operate

status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid)); //line 834 of MFRC522.cpp file

if (status != MFRC522::STATUS_OK) {

Serial.print(F(“Authentication failed: ”));

Serial.println(mfrc522.GetStatusCodeName(status));

digitalWrite(redPin, HIGH);

delay(1000);

digitalWrite(redPin, LOW);

return;

}

//read data from block

status = mfrc522.MIFARE_Read(block, buffer, &size);

if (status != MFRC522::STATUS_OK) {

Serial.print(F(“Reading failed: ”));

Serial.println(mfrc522.GetStatusCodeName(status));

digitalWrite(redPin, HIGH);

delay(1000);

digitalWrite(redPin, LOW);

return;

}

else{

digitalWrite(greenPin, HIGH);

delay(1000);

digitalWrite(greenPin, LOW);

}

Serial.print(F(“ Data from block [”));

Serial.print(block);Serial.print(F(“]: ”));

//prints read data

for (uint8_t i = 0; i 《 MAX_SIZE_BLOCK; i++)

{

Serial.write(buffer[i]);

}

Serial.println(“ ”);

}

步骤12:记录

要将数据写入卡/标签,我们必须遵循一些步骤。从选择记录选项的那一刻起,我们有30秒的时间通过串行进行数据输入。用“#”字符输入要写入的数据并准备密钥。您将需要清除缓冲区并写入块1,因为在块0中,我们已经保存了卡号,该卡号已经在工厂中了。因此,我们不会触摸块0。

我们处理数据的大小,并插入一个用于身份验证的命令并启用安全通信。如果未认证的数据,我们还会将错误消息与读数的一部分相等,以进行显示。我们将数据记录在适当的块中。

//prints thecnical details from of the card/tag

mfrc522.PICC_DumpDetailsToSerial(&(mfrc522.uid));

// waits 30 seconds dor data entry via Serial

Serial.setTimeout(30000L) ;

Serial.println(F(“Enter the data to be written with the ‘#’ character at the end [maximum of 16 characters]:”));

//prepare the key - all keys are set to FFFFFFFFFFFFh

for (byte i = 0; i 《 6; i++) key.keyByte[i] = 0xFF;

//buffer para armazenamento dos dados que iremos gravar

//buffer for storing data to write

byte buffer[MAX_SIZE_BLOCK] = “”;

byte block; //the block to operate

byte dataSize; //size of data (bytes)

//recover on buffer the data from Serial

//all characters before chacactere ‘#’

dataSize = Serial.readBytesUntil(‘#’, (char*)buffer, MAX_SIZE_BLOCK);

//void positions that are left in the buffer will be filled with whitespace

for(byte i=dataSize; i 《 MAX_SIZE_BLOCK; i++)

{

buffer[i] = ‘ ’;

}

block = 1; //the block to operate

String str = (char*)buffer; //transforms the buffer data in String

Serial.println(str);

//authenticates the block to operate

//Authenticate is a command to hability a secure communication

status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A,

block, &key, &(mfrc522.uid));

if (status != MFRC522::STATUS_OK) {

Serial.print(F(“PCD_Authenticate() failed: ”));

Serial.println(mfrc522.GetStatusCodeName(status));

digitalWrite(redPin, HIGH);

delay(1000);

digitalWrite(redPin, LOW);

return;

}

//else Serial.println(F(“PCD_Authenticate() success: ”));

//Writes in the block

status = mfrc522.MIFARE_Write(block, buffer, MAX_SIZE_BLOCK);

if (status != MFRC522::STATUS_OK) {

Serial.print(F(“MIFARE_Write() failed: ”));

Serial.println(mfrc522.GetStatusCodeName(status));

digitalWrite(redPin, HIGH);

delay(1000);

digitalWrite(redPin, LOW);

return;

}

else{

Serial.println(F(“MIFARE_Write() success: ”));

digitalWrite(greenPin, HIGH);

delay(1000);

digitalWrite(greenPin, LOW);

}

}

步骤13:菜单

在这里编写菜单。监视器显示所有选项,并等待发送数据。选择一个选项后,它将从读取的值中删除48,该值在Ascii表中为0。该表是旧的,不在PC上使用,但是在Arduino和微控制器上,您将不得不处理它。如果您不知道,请在互联网上搜索一下它是什么。

//menu to operation choice

int menu()

{

Serial.println(F(“ Choose an option:”));

Serial.println(F(“0 - Reading data”));

Serial.println(F(“1 - Writing data ”));

//waits while the user does not start data

while(!Serial.available()){};

//retrieves the chosen option

int op = (int)Serial.read();

//remove all characters after option (as per example)

while(Serial.available()) {

if(Serial.read() == ‘ ’) break;

Serial.read();

}

return (op-48);//subtract 48 from read value, 48 is the zero from ascii table

}
责任编辑:wv

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RFID
    +关注

    关注

    383

    文章

    5779

    浏览量

    234514
  • ESP32
    +关注

    关注

    13

    文章

    895

    浏览量

    15795
收藏 人收藏

    评论

    相关推荐

    ESP32-C2在小魔方遥控器的应用

    我们经常提起的ESP32-C3和ESP32-S3,ESP32-C2感觉话题度没有那么多,但其应用上不可小觑。今天小启就跟大家讲讲ESP32-C2在小魔方遥控器的应用。1射频性能拉满,成
    的头像 发表于 01-13 08:03 246次阅读
    <b class='flag-5'>ESP32</b>-C2在小魔方遥控器的应用

    esp32外置flash的大小

    ESP32是一款功能强大的微控制器,广泛应用于物联网和嵌入式设备领域。虽然ESP32内置了一定的闪存空间,但有时候我们可能需要更大的储存空间来存储更多的数据或者程序。因此,一些厂商推出了外置
    的头像 发表于 01-09 11:24 1133次阅读

    ESP32-PICO系列技术规格书

    ESP32-PICO 系列是基于 ESP32 芯片 的系统级封装 (SiP) 产品。ESP32-PICO 系列产品包括 ESP32-PICO-D4、
    发表于 12-12 16:56 0次下载
    <b class='flag-5'>ESP32</b>-PICO系列技术规格书

    用了ESP32后,我的Arduino都积灰了,专为零基础新手准备的ESP32入门指南,为什么我不再使用Arduino

      认识ESP32 "ESP32,由Espressif打造,是一系列低成本、低功耗的SoC(System on a Chip)微控制器,拥有Wi-Fi和蓝牙无线功能,以及强大的双核处理器。 无论
    的头像 发表于 12-12 15:48 1669次阅读
    用了<b class='flag-5'>ESP32</b>后,我的Arduino都积灰了,专为零基础新手准备的<b class='flag-5'>ESP32</b>入门指南,为什么我不再使用Arduino

    esp32s3使用多串口

    ESP32-S3 有三个 UART(通用异步收发器)控制器,即 UART0、UART1、UART2,支持异步通信(RS232 和 RS485)和 IrDA,通信速率可达到 5 Mbps。UART 控制
    的头像 发表于 11-06 11:29 1338次阅读
    <b class='flag-5'>esp32</b>s3使用多串口

    ESP32学习笔记:双核

    今天我们来说说ESP32 for Arduino 的双核。
    的头像 发表于 07-15 16:16 2948次阅读
    <b class='flag-5'>ESP32</b>学习笔记:双核

    使用XOD访问ESP32非易失性存储

    电子发烧友网站提供《使用XOD访问ESP32非易失性存储.zip》资料免费下载
    发表于 06-15 14:35 0次下载
    使用XOD<b class='flag-5'>访问</b><b class='flag-5'>ESP32</b>非易失性存储

    ESP32ESP32通过Internet进行通信

    电子发烧友网站提供《ESP32ESP32通过Internet进行通信.zip》资料免费下载
    发表于 06-15 09:58 2次下载
    <b class='flag-5'>ESP32</b>到<b class='flag-5'>ESP32</b>通过Internet进行通信

    [esp32教程] 5、UART使用

    基于Ubuntu下,利用esp-idf进行esp32开发的教程
    的头像 发表于 06-13 09:04 4263次阅读
    [<b class='flag-5'>esp32</b>教程] 5、UART使用

    如何使用Alexa和ESP32控制

    电子发烧友网站提供《如何使用Alexa和ESP32控制.zip》资料免费下载
    发表于 06-07 11:02 0次下载
    如何使用Alexa和<b class='flag-5'>ESP32</b><b class='flag-5'>控制</b>

    [esp32教程] 4、LEDC使用

    基于Ubuntu下,利用esp-idf进行esp32开发的教程
    的头像 发表于 06-03 09:39 3078次阅读
    [<b class='flag-5'>esp32</b>教程] 4、LEDC使用

    如何使用ESP32的LEDC进行PWM控制

    LEDC(LED控制器)是ESP32中的一个功能强大的PWM(脉冲宽度调制)控制器。
    发表于 05-19 11:14 1912次阅读
    如何使用<b class='flag-5'>ESP32</b>的LEDC进行PWM<b class='flag-5'>控制</b>?

    [esp32教程]2、按键中断

    基于Ubuntu,利用esp-idf进行esp32的教学
    的头像 发表于 05-05 09:04 2158次阅读
    [<b class='flag-5'>esp32</b>教程]2、按键中断

    [esp32教程]1、点灯之术

    基于Ubuntu下,利用esp-idf进行esp32开发的教程
    的头像 发表于 04-30 18:11 2337次阅读
    [<b class='flag-5'>esp32</b>教程]1、点灯之术

    esp32教程】0、环境搭建

    基于Ubuntu下,利用esp-idf进行esp32开发的教程
    的头像 发表于 04-21 16:54 3697次阅读