====== RFID mit MF-RC522 ====== [[uebung:itt11:beispielcode_esp8266|zurück zur Übersicht]] /* * Bibliothek RFID_MFRC522v2 von GithubCommunity * * Anschlussbelegung: * ================== * NodeMCU | MF-RC522 * D4 | SDA (SS) * D5 | SCK * D7 | MOSI * D6 | MISO (SCL) * D3 | RST * 3V | 3V * GND | GND * */ //#include // für SPI-Schnittstelle #include // für den Kartenleser #include #include #include #define DEBUG false // auf true setzen für Debug-Ausgaben // Einstellungen für Kartenleser MFRC522DriverPinSimple ss_pin(D4); SPIClass &spiClass = SPI; const SPISettings spiSettings = SPISettings(SPI_CLOCK_DIV4, MSBFIRST, SPI_MODE0); MFRC522DriverSPI driver {ss_pin, spiClass, spiSettings}; MFRC522 mfrc522 {driver}; //byte cardUid[4]; // zum Einlesen der Karten-UID //bool readSuccessful = false; //int idleCount = 0; const char validCards[2][4] = { // Datenstruktur mit gültigen Karten-IDs {0xE6, 0xE8, 0x3A, 0xF8}, {0x39, 0x6E, 0xAF, 0x47} }; const char nrOfValidCards = sizeof(validCards) / sizeof(validCards[0]); // Anzahl gültiger Karten const unsigned long sameCardInterval = 5000; // Intervall in dem die gleiche Karte nicht nochmal behandelt werden soll char lastCard[4]; // Variable für die zuletzt gelesene Karten-ID unsigned long lastCardMillis = 0; // Variable zur Speicherung des Zeitstempels für das sameCardInterval /** * setup */ void setup() { // Kartenleser initialisieren mfrc522.PCD_Init(); delay(100); // Serielle Konsole aktivieren und Versionsinfo ausgeben Serial.begin(9600); Serial.println(); Serial.println("Version 1.1"); MFRC522Debug::PCD_DumpVersionToSerial(mfrc522, Serial); Serial.println("Setup abgeschlossen."); } /** * loop */ void loop() { // falls keine Karte erkannt wird oder gelesen werden kann, dann von vorne if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) { return; } else // weiter falls Karte gelesen { char thisCard[4]; // Variable für die Karten-UID bool sameAsLastCard = true; // Variable um zu speichern, ob das eine neue Karte ist // Karten-UID in lokale Variable übertragen und erkennen, ob es eine neue ist for (int i = 0; i < 4; i++) { thisCard[i] = mfrc522.uid.uidByte[i]; // je ein einzelnes Byte kopieren if (thisCard[i] != lastCard[i]) // und auf Unterschied zur letzten Karte prüfen { sameAsLastCard = false; } } // ausführen bei einer neuen Karte oder nach Ablauf des Wiederholungsintervalls if (!sameAsLastCard || ((millis() - lastCardMillis) > sameCardInterval) ) { bool matchesSomeValidCard = false; // Variable um zu speichern, ob diese Karte einer gültigen entspricht // UID der neu gelesenen Karte merken, um sie nicht mehrmals hintereinander zu prüfen // und Ausgabe der ID der neu erkannten Karte for (int i = 0; i < 4; i++) { lastCard[i] = thisCard[i]; Serial.print(thisCard[i], HEX); Serial.print(" "); } lastCardMillis = millis(); // Zeitstempel für das Widerholungsintervall merken Serial.println(); // alle gültigen Karten durchgehen for (int i = 0; i < nrOfValidCards; i++) { bool matchesThisValidCard = true; // Variable um zu speichern, ob dieser gültigen entspricht // Karten byteweise vergleichen for (int j = 0; j < 4; j++) { if (thisCard[j] != validCards[i][j]) { matchesThisValidCard = false; // merken, wenn ein Unterschied erkannt wurde } } if (matchesThisValidCard) { matchesSomeValidCard = true; // merken, dass diese Karte einer gültigen Karte entspricht } } // Erkennen einer gültigen oder ungültigen Karte ausgeben if (matchesSomeValidCard) { Serial.println("Card is valid"); } else { Serial.println("Card is NOT valid"); } } // Ende neue Karte } // Ende Karte gelesen if (DEBUG) { MFRC522Debug::PICC_DumpToSerial(mfrc522, Serial, &(mfrc522.uid)); } delay(100); } [[uebung:itt11:beispielcode_esp8266|zurück zur Übersicht]]