Kontaktloses Steuern per RFID und NFC

Hier die Details zum Video, wie ein kontaktloses Schrankschloss über
RFID (radio-frequency identification)mit Arduino erstellt wird.
Eine direkt einsatzbare Lösung eines RFID Möbelschlosses wird geöffnet und näher betrachtet.
Mit dem RFID Nahfeldkommunikationsleser-Modul PN532 wird gezeigt, wie ein Elektrotürschloss gesteuert werden kann.
Die Datenübertragung und meist auch Energieversorgung bei RFID erfolgen über das magnetische Nahfeld, für die induktive Kopplung oder Nahfeldkopplung (NFC) der Spulen im Lesegerät und im Tag.
Quelle: RFID – Wikipedia

Einige passive RFID-Transponder und Karten werden vorgestellt.

Das Magnetfeld des aktiven Gerätes, induziert hier eine Spannung, die mit einer einfachen Kupferdrahtspule (an der eine LED angebracht wurde), leicht auf Funktion getestet werden konnte.
Details zum NFC Test Tool siehe NFC Test Tool – Prilchen tüftelt

Verdrahtung:

Hardware:

Arduino Uno
PN532 Nahfeldkommunikationsleser-Modul
Relaymodul 5V
Elektronisches Türschloss
Breadboard

PN532 Reader unterstützt laut Hersteller diese Karten/Tags und Normen:


Quellcode:

// Librarys: https://github.com/adafruit/Adafruit-PN532
// https://github.com/elechouse/PN532

  // RFID Reader PN532:
  // GND ----- GND
  // VCC ----- 5V
  // SDA ----- A4
  // SCL ----- A5
  // IRQ ----- 2
  // RST0 ---- 3
  //
  // Buzzer - 11
  // Relay -- 4

#include <Wire.h>
#include <PN532_I2C.h>
#include <PN532.h>
#include <NfcAdapter.h>

PN532_I2C pn532i2c(Wire);
PN532 nfc(pn532i2c);

void setup(void) {
  
  pinMode(4, OUTPUT);     // Relay an Pin 4
  pinMode(11,OUTPUT);      // Piezo an Pin 11 
  digitalWrite(4, HIGH);  // Startzustand Tuerschloss
  
  Serial.begin(115200);
  Serial.println("Hallo!");
  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();

  if (! versiondata) {
    Serial.print("Kein PN53x board gefunden");
    while (10); 
  }

  Serial.print("Gefundener Chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 
  Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); 
  Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);

  // Festlegen der maximalen Anzahl von Wiederholungsversuchen zum Lesen von einer Karte
  // Dies verhindert, dass ewig auf eine Karte gewartet wird
  nfc.setPassiveActivationRetries(0xFF);

  // Konfigurieren der Platine zum Lesen von RFID-Transpondern
  nfc.SAMConfig();
  Serial.println("Warte auf einen ISO14443A Transponder");
}

void loop(void) {

  boolean success;

  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Puffer zum Speichern der zurückgegebenen UID
  uint8_t uidLength;                        // Länge der UID (4 oder 7 Bytes je nach ISO14443A-Kartentyp)
 
  // Warten Sie auf Karten vom Typ ISO14443A (zB. Mifare,...)
  // Wenn eine "UID" gefunden wird, kommt diese in den "uid"-Puffer
  // uidLength zeigt an, wenn die UID 4 Bytes (Mifare Classic) oder 7 Bytes (Mifare Ultralight) ist

  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);

  if (success) {

    Serial.println("Karte gefunden!");
    Serial.print("UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
    Serial.print("UID: ");
    nfc.PrintHex(uid, uidLength);
    
    String hex_wert = "";
    for (uint8_t i=0; i < uidLength; i++) 
    {
      hex_wert += (String)uid[i];
    }
    Serial.println("UID Hex_als_String: "+hex_wert);

// Auswertung:
//hier die UID als String der Karten / Transponder eintragen die berechtigt sind
    if(hex_wert == "54239204161") {
      Serial.println("Gueltige Karte 1");
      Serial.println("");
      
      digitalWrite(4, LOW);   // schloss auf
      delay(3000);                       // wait for a second
      digitalWrite(4, HIGH);    // schloss zu
      delay(1000);
    }

    else if(hex_wert == "50202244239") {
      Serial.println("Gueltige Karte 2");
      Serial.println("");

      //tuhe was anders ...
    }

    else
      Serial.println("Transponder unbekannt");
      Serial.println("");
      tone(11, 500, 1000); // Der Lautsprecher an Pin 11 wird mit der Tonhöhe „500“ aktiviert
      delay(1000);                       // wait for a second
      noTone(11); //   // Warnton aus
      delay(1000);    // Sekunde warten
  }

  else

  {
    // PN532 wahrscheinlich Zeitüberschreitung beim Warten auf eine Karte
    Serial.println("Warte auf Transponder...");
  }
}

,