LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
SoM / SBC

[PROJEKT] Odczyt tagów RFID – Arduino i modRFID RC-522

Kod przykładu

Teraz przedstawię kod przykładu ReadNUID. Program będzie działał tak, że gdy przyłożymy niebieski brelok dioda zielona zapali się. Jeżeli przełożymy jakąkolwiek inną kartę, zapali się czerwona dioda. Będzie to symulowało otwieranie zamka. Kod programu znajduje się również w sekcji Do pobrania.

/*
 * Program do elektronicznego zamka
 * Na podstawie przykładu "READNUID" znajdującego się w bibliotece MFRC522 library dostępnej pod adresem https://github.com/miguelbalboa/rfid 
 * Modyfikacja: Patryk Mądry 
 * Mikrokontroler.pl 
 * 2017
 * 
*/

#define LED_Zielona  6 // Pin do którego będzie podłączona Zielona dioda
#define LED_Czerwona 7  //Pin do którego będzie podłączona czerwona dioda

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

#define SS_PIN 10
#define RST_PIN 9
 
MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class

const byte poprawna_karta[] = {0x10,0x55,0x60,0x89};

void setup() { 
  Serial.begin(9600);
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522 
  pinMode(LED_Zielona,OUTPUT); // Ustawienie pinu LED_Zielona  jako wyjscie
  pinMode(LED_Czerwona,OUTPUT); // Ustawienie pinu LED_Czerwona jako wyjscie
}
 
void loop() {
  // Look for new cards
  if ( ! rfid.PICC_IsNewCardPresent()) 
    return;

  // Verify if the NUID has been readed
  if ( ! rfid.PICC_ReadCardSerial())
    return;
 
  if (rfid.uid.uidByte[0] == poprawna_karta[0] || 
      rfid.uid.uidByte[1] == poprawna_karta[1] || 
      rfid.uid.uidByte[2] == poprawna_karta[2] || 
      rfid.uid.uidByte[3] == poprawna_karta[3] ) 
     {
          Serial.println("Poprawna karta");  
          digitalWrite(LED_Zielona,HIGH);
          delay(1500);
          digitalWrite(LED_Zielona,LOW);
  }
  else 
  {
          Serial.println("Niepoprawna karta!!!");
          digitalWrite(LED_Czerwona,HIGH);
          delay(2000);
          digitalWrite(LED_Czerwona,LOW);
  }
  
  // Halt PICC
  rfid.PICC_HaltA();

  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();
}

Omówienie

Pierwszym krokiem jest stworzenie tablicy, która będzie zawierać identyfikator karty pozwalającej na dostęp. W moim przypadku brelok posiada identyfikator składający się z 4 bajów o wartościach: 0x10, 0x55, 0x60, 0x89. Kod do zapisania tego identyfikatora w tablicy prezentuje się następująco:

const byte poprawna_karta[] = {0x10, 0x55, 0x60, 0x89};

Następnym krokiem jest zadeklarowanie pinów, do których będą podłączone diody LED (czerwona i zielona). Ja zdecydowałem się na pin 6 dla diody zielonej oraz pin 7 dla diody czerwonej.

#define LED_Zielona  6 // Pin do którego jest podłączona Zielona dioda
#define LED_Czerwona 7 // Pin do którego jest podłączona czerwona dioda

Ustawiamy te piny jako wyjścia:

  pinMode(LED_Zielona,OUTPUT);  // Ustawienie pinu LED_Zielona jako wyjscie
  pinMode(LED_Czerwona,OUTPUT); // Ustawienie pinu LED_Czerwona jako wyjscie

Pętla główna sprawdza czy przy module znajduje się tag RFID. Jeśli tak, zostaje on odczytany a jego identyfikator zapisany do zmiennej.

void loop() {
  // Look for new cards
  if ( ! rfid.PICC_IsNewCardPresent()) 
    return;

  // Verify if the NUID has been read
  if ( ! rfid.PICC_ReadCardSerial())
    return;
(...)

W następnych liniach kodu odczytany identyfikator tagu porównywany jest z wartościami zapisanymi w tablicy poprawna_karta[]. Jeżeli poszczególne bity identyfikatora są zgodne z zapisaną kartą, to na ok. 1,5 sekundy zostaje zapalona dioda zielona. Dodatkowo w monitorze portu szeregowego zostanie wyświetlony komunikat Poprawna karta. Gdy do modułu zostanie przyłożona karta o innym identyfikatorze niż znajdująca się w tablicy poprawna_karta[], to na ok. 2 sekundy zostanie zapalona dioda czerwona. Dodatkowo w monitorze portu szeregowego pojawi się komunikat Nieprawidłowa karta!!!. Realizuje to następujący kod:

 if (rfid.uid.uidByte[0] == poprawna_karta[0] || 
      rfid.uid.uidByte[1] == poprawna_karta[1] || 
      rfid.uid.uidByte[2] == poprawna_karta[2] || 
      rfid.uid.uidByte[3] == poprawna_karta[3] ) 
     {
        Serial.println("Poprawna karta");  
        digitalWrite(LED_Zielona,HIGH);
        delay(1500);
        digitalWrite(LED_Zielona,LOW);
     }
  else 
     {
        Serial.println("Niepoprawna karta!!!");
        digitalWrite(LED_Czerwona,HIGH);
        delay(2000);
        digitalWrite(LED_Czerwona,LOW);
    }

Działanie zostało pokazane na filmie:

 

Autor: Patryk Mądry