Arduino Mejora la Parte 21: diseño del control de acceso del módulo RFID

Inserte la descripción de la imagen aquí

La RFID se puede aplicar al sistema de control de acceso. Podemos escribir datos en la etiqueta y luego grabar la etiqueta autorizada. Cuando se escanea la etiqueta de un usuario, se lee y compara la información de identidad, y luego se realiza la operación correspondiente de acuerdo con la autoridad.

Este artículo coopera con la pantalla OLED para simular el sistema de control de acceso. Solo se realiza una comparación simple del UID de la etiqueta. Por supuesto, también puede configurar su propia clave y luego escribir los datos en la etiqueta para una identificación más rigurosa.

1. Materiales experimentales

  • Placa de desarrollo Uno R3
  • Cable de datos USB compatible
  • Tablero de pruebas y cable de soporte
  • Pantalla OLED
  • Módulo RFID-RC522 y tarjeta blanca S50 compatible y tarjeta de forma especial

2. Procedimiento experimental

1. Construya el diagrama del circuito de acuerdo con el diagrama esquemático.

Los 3.3V y GND del módulo RC522 corresponden respectivamente a los 3.3V y GND de la placa de desarrollo El MOSI, MISO y SCK del módulo están conectados respectivamente a las interfaces SPI 11, 12, 13 de la placa de desarrollo, y el SDA y RST del módulo están conectados a los pines digitales de la placa de desarrollo 10, 9. El VCC y GND de la pantalla OLED están conectados respectivamente a 3.3V y GND de la placa de desarrollo, y el SDA y SCL de la pantalla OLED están conectados respectivamente a las placas de desarrollo A4 y A5.

El diagrama esquemático experimental se muestra a continuación:

Esquema experimental

El diagrama de conexión física se muestra a continuación:

Diagrama de conexión física

2. Cree un nuevo boceto, copie el siguiente código para reemplazar el código generado automáticamente y guárdelo.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#include <SPI.h>
#include <MFRC522.h>


#define SS_PIN 10
#define RST_PIN 9

MFRC522 rfid(SS_PIN, RST_PIN);

#define OLED_RESET     4
Adafruit_SSD1306 oled(128, 64, &Wire, OLED_RESET);

byte nuidPICC[4]; //存储读取的UID
byte cardID[4] = {0x6D, 0xC5, 0x4D, 0x96};//存储有权限的卡ID

void setup() {

  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
  Serial.println("RC522初始化完成...");


  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.setTextColor(WHITE);//开像素点发光
  oled.clearDisplay();//清屏
  oled.setTextSize(2); //设置字体大小
}


void loop() {
  oled.clearDisplay();//清屏
  oled.setCursor(15, 2);//设置显示位置
  oled.println("--RFID--");
  oled.setCursor(25, 40);//设置显示位置
  oled.println("SCAN...");
  oled.display(); // 开显示

  //搜索新卡
  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;
  }

  // 保存读取到的UID
  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();

  if (nuidPICC[0] == cardID[0] && nuidPICC[1] == cardID[1]
      && nuidPICC[2] == cardID[2] && nuidPICC[3] == cardID[3])
  {
    oled.clearDisplay();//清屏
    oled.setCursor(15, 2);//设置显示位置
    oled.println("--RFID--");
    oled.setCursor(25, 40);//设置显示位置
    oled.println("CHECK OK");
    oled.display(); // 开显示

    delay(1000);
    oled.clearDisplay();//清屏
    oled.setCursor(15, 2);//设置显示位置
    oled.println("--RFID--");
    oled.setCursor(25, 40);//设置显示位置
    oled.println("OPEN...");
    oled.display(); // 开显示
  } else {
    oled.clearDisplay();//清屏
    oled.setCursor(15, 2);//设置显示位置
    oled.println("--RFID--");
    oled.setCursor(15, 40);//设置显示位置
    oled.println("CHECK ERR");
    oled.display(); // 开显示
  }

  // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
  rfid.PICC_HaltA();

  // 停止读卡模块编码
  rfid.PCD_StopCrypto1();
  delay(3000);
}

// 十六进制输出
void printHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}

3. Conecte la placa de desarrollo, configure el número de puerto correspondiente y el tipo de placa de desarrollo y descargue el programa.

Descarga del programa

3. Fenómenos experimentales.

La tarjeta de etiqueta autorizada guarda y registra el UID por adelantado, y puede abrir la puerta después de leer la tarjeta, pero la otra tarjeta no puede abrir la puerta.

Fenómeno experimental


Siga la cuenta pública "TonyCode" para compartir contenido más emocionante.
Responda "1024" para obtener materiales de aprendizaje de 1000G.
Blog personal
Inserte la descripción de la imagen aquí

Publicado 73 artículos originales · elogiados 275 · 270,000 vistas +

Supongo que te gusta

Origin blog.csdn.net/TonyIOT/article/details/105642083
Recomendado
Clasificación