Arduino Nano - RFID Deurslot

Deze tutorial leert u hoe u een deurslotsysteem bouwt met Arduino Nano, RFID/NFC RC522 module, een relay, spoelslot of elektromagnetisch slot, en optioneel een LCD-scherm. Om het u gemakkelijk te maken, begeleidt deze tutorial u stap voor stap, van eenvoudig naar complex. In detail behandelen we:

Wilt u een deurslot maken dat werkt met een wachtwoord, raadpleeg dan Arduino Nano - Keypad Deurslot

Over RFID/NFC RC522 Module, Spoelslot en Elektromagnetisch Slot

Als u onbekend bent met de RFID/NFC RC522 module, spoelslot of elektromagnetisch slot (inclusief pinout, werking en programmering), kunnen de volgende tutorials u meer informatie bieden:

Deurslot Systeem Componenten

Een eenvoudig deurslotsysteem bestaat uit twee componenten:

  • Deurslot: een Arduino Nano, een RFID/NFC-lezer, een relay, en een spoelslot of elektromagnetisch slot
  • Deursleutel: RFID/NFC tags
Arduino Nano arduino rfid door lock component

Hoe Werkt het RFID/NFC Deurslot

  • De gebruiker houdt een RFID/NFC-tag tegen de RFID/NFC-lezer, die de UID van de tag uitleest.
  • Arduino Nano ontvangt deze UID van de lezer en vergelijkt deze met de UIDs die in de Arduino Nano-code zijn opgeslagen.
  • Deze UIDs fungeren als geautoriseerde sleutels.
  • Als de UID overeenkomt met een van de vooraf ingestelde UIDs, zal Arduino Nano het spoelslot deactiveren om de deur te ontgrendelen.
  • Arduino Nano vergrendelt de deur weer na een time-out door de relay te activeren.

Bedradingsschema

  • RFID RC522 Deurslot met Spoelslot
Arduino Nano RFID RC522 door solenoid lock system wiring diagram

This image is created using Fritzing. Click to enlarge image

  • RFID RC522 Deurslot met Elektromagnetisch Slot
Arduino Nano RFID RC522 door electromagnetic lock system wiring diagram

This image is created using Fritzing. Click to enlarge image

Om het aansluiten eenvoudiger te maken, zijn de pinnen van de RC522-module rechtstreeks verbonden met de Arduino-pinnen. Dit kan echter in sommige gevallen veroorzaken dat de Arduino verkeerd functioneert, omdat de output pinnen van Arduino 5V leveren, terwijl de RC522-module op 3,3V werkt. Daarom wordt aanbevolen om de spanning tussen Arduino en RC522 pinnen te regelen. onderstaand schema toont hoe weerstanden gebruikt kunnen worden om 5V naar 3,3V te verlagen.

Arduino Nano RFID RC522 with voltage regulated wiring diagram

This image is created using Fritzing. Click to enlarge image

※ Notiz:

Fabrikanten kunnen de volgorde van pinnen verschillend rangschikken, dus het is belangrijk om te vertrouwen op de labels die op de module gedrukt staan. De pinout diagram hierboven toont de pinlay-out voor modules geproduceerd door fabrikant DIYables.

Arduino Nano Code - Enkele Sleutel

/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino-nano/arduino-nano-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #define RC522_SS_PIN 10 // The Arduino Nano pin connected to RC522's SS pin #define RC522_RST_PIN 5 // The Arduino Nano pin connected to RC522's RST pin #define RELAY_PIN A5 // The Arduino Nano pin connected to relay MFRC522 rfid(RC522_SS_PIN, RC522_RST_PIN); byte keyTagUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door Serial.println("Tap RFID/NFC Tag on reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // new tag is available if (rfid.PICC_ReadCardSerial()) { // NUID has been readed MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == keyTagUID[0] && rfid.uid.uidByte[1] == keyTagUID[1] && rfid.uid.uidByte[2] == keyTagUID[2] && rfid.uid.uidByte[3] == keyTagUID[3] ) { Serial.println("Access is granted"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else { Serial.print("Access denied for user with UID:"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // halt PICC rfid.PCD_StopCrypto1(); // stop encryption on PCD } } }

Snelle Stappen

Om de UID van een RFID/NFC-tag te achterhalen:

  • Upload bovenstaande code naar Arduino Nano met de Arduino IDE
  • Open de Serial Monitor en houd de tag tegen de RFID-RC522 module. De UID wordt weergegeven in de Serial Monitor.
COM6
Send
Tap RFID/NFC tag on reader Access denied for user with UID: 3A C9 6A CB
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Zodra u de UID heeft:

  • Pas regel 18 van de code aan met de juiste UID, bijvoorbeeld wijzig byte keytagUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; naar byte keytagUID[4] = {0x3A, 0xC9, 0x6A, 0xCB};
  • Upload de gewijzigde code opnieuw naar Arduino Nano
  • Houd een RFID/NFC-tag tegen de RFID-RC522 module
  • Controleer de output in de Serial Monitor
COM6
Send
Tap RFID/NFC tag on reader Access is granted
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Controleer of het spoelslot is gedeactiveerd.
  • Houd een andere RFID/NFC-tag tegen de RFID-RC522 module.
  • Controleer opnieuw de output in de Serial Monitor.
COM6
Send
Tap RFID/NFC tag on reader Access is granted Access denied for user with UID: BD 1E 1D 00
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ Notiz:

  • Voor testdoeleinden is de ontgrendelingstijd op 2 seconden ingesteld; in praktische toepassingen dient deze verlengd te worden.
  • Installatie van de MFRC522 bibliotheek is vereist. Raadpleeg voor meer informatie de Arduino Nano - RFID/NFC RC522 tutorial.

Arduino Nano Code - Meerdere Sleutels

Stel u voor dat alleen de manager en secretaresse de deur mogen openen.

In dat geval heeft u twee RFID/NFC-tags nodig: één voor de manager en één voor de secretaresse. De UIDs van beide tags moeten in de code worden opgenomen.

/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino-nano/arduino-nano-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #define RC522_SS_PIN 10 // The Arduino Nano pin connected to RC522's SS pin #define RC522_RST_PIN 5 // The Arduino Nano pin connected to RC522's RST pin #define RELAY_PIN A5 // The Arduino Nano pin connected to relay MFRC522 rfid(RC522_SS_PIN, RC522_RST_PIN); byte managerKeyUID[4] = {0x3A, 0xC9, 0x6A, 0xCB}; byte secretaryKeyUID[4] = {0x30, 0x01, 0x8B, 0x15}; void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door Serial.println("Tap RFID/NFC Tag on reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // new tag is available if (rfid.PICC_ReadCardSerial()) { // NUID has been readed MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == managerKeyUID[0] && rfid.uid.uidByte[1] == managerKeyUID[1] && rfid.uid.uidByte[2] == managerKeyUID[2] && rfid.uid.uidByte[3] == managerKeyUID[3] ) { Serial.println("Access is granted for manager"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else if (rfid.uid.uidByte[0] == secretaryKeyUID[0] && rfid.uid.uidByte[1] == secretaryKeyUID[1] && rfid.uid.uidByte[2] == secretaryKeyUID[2] && rfid.uid.uidByte[3] == secretaryKeyUID[3] ) { Serial.println("Access is granted for secretary"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else { Serial.print("Access denied for user with UID:"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // halt PICC rfid.PCD_StopCrypto1(); // stop encryption on PCD } } }

Herhaal dezelfde stappen als voorheen en hou elke tag afzonderlijk tegen de RFID-RC522 module. De output in de Serial Monitor zou er als volgt uit moeten zien:

COM6
Send
Tap RFID/NFC tag on reader Access is granted for secretary Access is granted for manager
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

U kunt de bovenstaande code uitbreiden met drie, vier of meer tags.

LCD Display Toevoegen aan het RFID Deurslot

Optioneel kunt u een LCD-display toevoegen om de toegangstatus weer te geven (bijv. TOEGESTAAN/WEIGERING) aan gebruikers. Meer informatie over LCD vindt u in de Arduino Nano - LCD tutorial.

Bedradingsschema - Deurslotsysteem met RFID, spoelslot of elektromagnetisch slot, en LCD-display

Arduino Nano RFID RC522 door lock LCD wiring diagram

This image is created using Fritzing. Click to enlarge image

Let op dat in bovenstaande bedrading 5V voeding is toegevoegd, aangezien de 5V pin van de Arduino niet genoeg stroom kan leveren voor zowel relay als LCD tegelijkertijd.

Arduino Nano Code - Deurslotsysteem met password met RFID RC522 module, spoelslot of elektromagnetisch slot, en LCD display

/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino-nano/arduino-nano-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #include <LiquidCrystal_I2C.h> #define RC522_SS_PIN 10 // The Arduino Nano pin connected to RC522's SS pin #define RC522_RST_PIN 5 // The Arduino Nano pin connected to RC522's RST pin #define RELAY_PIN A5 // The Arduino Nano pin connected to relay MFRC522 rfid(RC522_SS_PIN, RC522_RST_PIN); LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27 (from DIYables LCD), 16 column and 2 rows byte managerKeyUID[4] = {0x3A, 0xC9, 0x6A, 0xCB}; byte secretaryKeyUID[4] = {0x30, 0x01, 0x8B, 0x15}; void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door lcd.init(); // Initialize the LCD I2C display lcd.backlight(); Serial.println("Tap RFID/NFC Tag on reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // new tag is available if (rfid.PICC_ReadCardSerial()) { // NUID has been readed MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == managerKeyUID[0] && rfid.uid.uidByte[1] == managerKeyUID[1] && rfid.uid.uidByte[2] == managerKeyUID[2] && rfid.uid.uidByte[3] == managerKeyUID[3] ) { Serial.println("Access is granted for manager"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds lcd.clear(); lcd.setCursor(0, 0); lcd.print("CORRECT!"); lcd.setCursor(0, 1); lcd.print("DOOR UNLOCKED!"); delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door lcd.clear(); } else if (rfid.uid.uidByte[0] == secretaryKeyUID[0] && rfid.uid.uidByte[1] == secretaryKeyUID[1] && rfid.uid.uidByte[2] == secretaryKeyUID[2] && rfid.uid.uidByte[3] == secretaryKeyUID[3] ) { Serial.println("Access is granted for secretary"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds lcd.clear(); lcd.setCursor(0, 0); lcd.print("CORRECT!"); lcd.setCursor(0, 1); lcd.print("DOOR UNLOCKED!"); delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door lcd.clear(); } else { Serial.print("Access denied for user with UID:"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("INCORRECT!"); lcd.setCursor(0, 1); lcd.print("ACCESS DENIED!"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // halt PICC rfid.PCD_StopCrypto1(); // stop encryption on PCD } } }

※ Notiz:

Het adres van het LCD-display kan verschillen per fabrikant. In onze code is 0x27 gebruikt, zoals gespecificeerd door DIYables.

Deursensor Toevoegen aan het RFID Deurslot

In de vorige code vergrendelde de deur na een time-out na ontgrendeling door Arduino Nano. In de praktijk wordt er vaak een deursensor geïntegreerd. Als de deur gesloten is, zal Arduino Nano direct de deur vergrendelen zonder te wachten op de timeout.

Om u niet te overladen, hebben we geen deursensor opgenomen in het bedrading schema en de code. We laten dit deel open voor uw eigen creativiteit. U kunt de volgende tutorials raadplegen: Arduino Nano - Deursensor en Arduino Nano - Deursensor relaisbeheer.

Beheren en Opslaan van Geldige RFID Sleutels in EEPROM

In het vorige voorbeeld werden de geldige RFID-sleutels (UIDs) hardcoded in de Arduino Nano code. Dit betekent dat u de code moet aanpassen en opnieuw uploaden om sleutels toe te voegen of te verwijderen, wat onpraktisch is.

Voor praktische toepassing is het handiger om RFID-sleutels op te slaan in EEPROM in plaats van hardcoded. Zo kunt u sleutels toevoegen of verwijderen zonder de code aan te passen of te uploaden.

Er zijn twee methoden om RFID sleutels in EEPROM te beheren:

  • RFID-sleutels als master keys
    • Gebruik een RFID key als ADD master key om nieuwe keys toe te voegen. Nadat Arduino de ADD master key herkent, schakelt het tussen ADD-modus en OPERATION-modus.
    • In ADD-modus voegt Arduino een gedetecteerde nieuwe key toe aan EEPROM.
    • Er is ook een DELETE master key en DELETE-modus voor verwijderen.
  • ADD/DELETE commando’s via Serial/Bluetooth/IR
    • Commando’s worden verstuurd via Serial Monitor, Bluetooth app, IR-controller enz.
    • Commando’s bevatten: directive (ADD/DELETE), UID van RFID-key.
    • Voor veiligheid bevat commando ook een wachtwoord. Arduino verifieert het wachtwoord om geldigheid te bepalen.

    Beide methoden vereisen veel Arduino-code. Dit is geen eenvoudige taak voor beginners. Daarom biedt deze tutorial slechts basiskennis om het deurvergrendelsysteem te begrijpen zonder u te overladen met complexe code. Voor praktische implementatie kunt u contact opnemen via onze betaalde programmeerservice.

Toegangsgeschiedenis Opslaan op SD-kaart

U wilt misschien de toegangsgeschiedenis opslaan met informatie zoals UID van de RFID-key, toegangstatus (TOEGESTAAN/GEWEIGERD) en datum/tijd. Hiervoor gebruikt u een SD-kaart, want EEPROM is niet groot genoeg voor deze geschiedenis. Zie daarvoor de tutorial Arduino Nano - Log Data with Timestamp to SD Card.

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

Bekijk onze video-tutorial voor een visuele begeleiding bij dit project! De video biedt extra inzichten en laat u stap voor stap zien hoe u het systeem bouwt en programmeert.

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!