Я могу подсказать только как сделать с покнижным считыванием, но не очень быстро. Поеду в субботу в Москву наберу карточек метро, через недельку- другую попробую. мой мыл ydom@mail.ru - отпишите чтобы напрямую.
Карточек метро не набрал, ну вернее набрал но потерял, сделал с теми что были. На схеме - светодиоды -один красный, один зеленый, биппер EP1 любой на 5 В, возможно нужно будет резистор поставить для ограничения тока, S1 - любой тумблер (режим запись - работа). Код (C++): #include <SPI.h> #include <MFRC522.h> // библиотека "RFID". #include <EEPROM.h> #define SS_PIN 10 #define RST_PIN 9 #define WRITECARDZ 1 #define READCARDZ 0 MFRC522 mfrc522(SS_PIN, RST_PIN); unsigned long uidDec, uidDecTemp; // для храниения номера метки в десятичном формате unsigned long Cardz[32]; byte QofCardz, OldMode, FlagOfNew, Done; byte Taken[32]; void setup() { pinMode(4, INPUT_PULLUP); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); Serial.begin(9600); Serial.println(" MFR522 Textbook Reminder MFR522_TB Waiting for card..."); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. EEPROM.get(0, QofCardz ); if (QofCardz > 0 && QofCardz < 33) { for (byte j = 0; j < QofCardz; j++) EEPROM.get(1 + sizeof(long)*j, Cardz[j]); Serial.print("Textbooks in List : "); Serial.println(QofCardz); } else { QofCardz = 0; Serial.println("No Cardz in Memory"); } } void loop() { if (digitalRead(4) == LOW) { if (OldMode == READCARDZ) { OldMode = WRITECARDZ; QofCardz = 0; Serial.println("Erase All the Cardz from Memory"); } // Поиск новой метки if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор метки if ( ! mfrc522.PICC_ReadCardSerial()) { return; } { uidDec = 0; // Выдача серийного номера метки. for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } FlagOfNew = 1; for (byte i = 0; i < QofCardz; i++) { if (uidDec == Cardz[i]) FlagOfNew = 0; } if (FlagOfNew == 1) { Serial.print("New Card in Memory UID Card No "); Serial.print(QofCardz); Serial.print(" UID "); Serial.println(uidDec); // Выводим UID метки в консоль. Serial.print(" Cards in Portfolio: "); Serial.println(QofCardz + 1); Cardz[QofCardz] = uidDec; QofCardz++; digitalWrite(5, HIGH); digitalWrite(6, LOW); digitalWrite(7, HIGH); delay (500); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); } } } else { if (OldMode == WRITECARDZ) { OldMode = READCARDZ; Serial.print("Config is done. Cards in Portfolio if Memory : "); Serial.println(QofCardz); EEPROM.put(0, QofCardz ); for (byte j = 0; j < QofCardz; j++) EEPROM.put(1 + sizeof(long)*j, Cardz[j]); } // Поиск новой метки if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор метки if ( ! mfrc522.PICC_ReadCardSerial()) { return; } { uidDec = 0; // Выдача серийного номера метки. for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } for (byte i = 0; i < QofCardz; i++) { if (uidDec == Cardz[i]) { Taken[i] = 1; Done = 0; for (byte j = 0; j < QofCardz; j++) { if (Taken[j] == 1) Done = Done + 1; } Serial.print("Added to Portfolio Card No "); Serial.println(uidDec); // Выводим UID метки в консоль. Serial.print("Need more textbooks: "); Serial.println(QofCardz - Done ); // Выводим UID метки в консоль. digitalWrite(6, HIGH); digitalWrite(5, LOW); digitalWrite(7, HIGH); delay (500); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); Done = 0; for (byte j = 0; j < QofCardz; j++) { if (Taken[j] == 1) Done = Done + 1; } if (Done == QofCardz) { Serial.println("All Done "); digitalWrite(6, HIGH); digitalWrite(5, LOW); digitalWrite(7, HIGH); delay (500); digitalWrite(7, LOW); } } } delay(100); } } }