Categories
ESP8266 NodeMCU

Контрол на достъпа с RC522

RC522 е лесен за употреба, нискобюджетен, подходящ за разработване на проекти свързани с употребата на безконтактни RF карти и тагове на 13.56MHz. Той използва захранване 3.3V, а комуникацията се извършва чрез Serial Peripheral Interface (SPI) интерфейс.

Свързваме:

  • 3.3v на RC522 с 3v3 на NodeMCU
  • RST на RC522 с D3 на NodeMCU
  • GND на RC522 с GND на NodeMCU
  • MISO на RC522 с D6 на NodeMCU
  • MOSI на RC522 с D7 на NodeMCU
  • SCK на RC522 с D5 на NodeMCU
  • SDA на RC522 с D8 на NodeMCU

На D1 свързваме светодиод (с резистор), който да ни послужи за индикатор при успешен достъп.

Ще се наложи да инсталираме една библиотека MFRC522.

Хайде да напишем малко код:

#include "SPI.h"
#include "MFRC522.h"

#define RST_PIN         D3         // Пин за ресет на MFRC522
#define SS_PIN          D8         // Пин за конфигуриране
#define UNLLOCK_PIN     D1         // Пин за светодиод / осигуряване на достъп

// създаваме обект MFRC522
MFRC522 mfrc522(SS_PIN, RST_PIN);

String allowed = "";

void setup() {
  // инициализираме UART
  Serial.begin(115200);

  // инициализираме Serial Peripheral Interface
  SPI.begin();
  // инициализираме MFRC522
  mfrc522.PCD_Init();
  // извеждаме празен ред
  Serial.println();
  // извеждаме съобщение
  Serial.println("Моля сканирайте карта за да видите нейното UID");

  // задаваме режим на пин D1 като изход
  pinMode(UNLLOCK_PIN, OUTPUT);
}

void loop() {
  // проверяваме има ли карта
  if (mfrc522.PICC_IsNewCardPresent()) {
    // четем данни от картата
    if (mfrc522.PICC_ReadCardSerial()) {
      // извеждаме текст
      Serial.print("Card UID:");
      // конвертираме UID на картата в четим текст
      String uid = uid_to_str(mfrc522.uid.uidByte, mfrc522.uid.size);
      // извеждаме UID
      Serial.println(uid);
      // проверяваме дали UID е в разрешените
      if (allowed.indexOf(uid)>-1) {
        // извеждаме OK
        Serial.println("OK");
        // подаваме ток към светодиода на пин D1
        digitalWrite(UNLLOCK_PIN, HIGH);
        // изчакваме една секунда
        delay(1000);
        // спираме подаването на ток към светодиода на пин D1
        digitalWrite(UNLLOCK_PIN, LOW);
      }
      delay(250);
    }
  }
}

// конвертира UID в четим низ
String uid_to_str(byte *buffer, byte bufferSize) {
  String result = "*";
  for (byte i = 0; i < bufferSize; i++) {
    result+=String(buffer[i] < 0x10 ? " 0" : " ");
    result+=String(buffer[i], HEX);
  }
  result+="*";
  return result;
}

След като го качим на нашето NodeMCU трябва да отворим Serial MonitorArduino лупичката горе-дясно) и да изберем 115200 baud.

Сега остава да натиснем RST на нашето NodeMCU и серийният монитор ще ни подкани да сканираме карта.

Задържаме за секунда съвместима карта върху RC522 и виждаме резултата:

Аз ще сканирам още една карта и ще редактирам:

String allowed = "";

на:

String allowed = "* 13 0b f4 1b*,* db 98 74 0d*";

Сега остава да качим нашият редактиран код и нека видим какво ще стане.

Разбира се, не е правилно използването на низове (String) с променливи дължини, но го правим за прегледност.

Също така, записването на UID-тата в кода е голяма грешка, понеже при всяка промяна ще се налага да свързваме устройството с компютър. За целта може да използваме вградената флаш памет чрез SPIFFS или да съхраняваме информацията на отдалечен сървър и да достигаме до нея чрез протокола MQTT, но за това в някоя друга тема.

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *