[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: