
Интернет-магазин «Неглупый Дом»
В другом проекте на сайте RC522 просто подаёт сигнал на каждое сканирование, не различая карты между собой. Здесь Arduino запоминает UID уже виденных карт и увеличивает счётчик на TM1637 только при появлении НОВОЙ, ранее не встречавшейся карты — повторное сканирование той же самой карты счётчик не увеличивает.
Считывание UID такое же, как и в остальных RFID-проектах — RC522 отдаёт по SPI уникальный идентификатор карты, обычно 4 байта. Разница — в дальнейшей обработке: вместо немедленной реакции на любое сканирование Arduino сравнивает полученный UID со списком всех уже сохранённых UID в небольшом массиве в памяти, и только если совпадений не найдено — добавляет его в список и увеличивает счётчик.
Поскольку UID — это несколько байт, а не одно число, сравнение выполняется побайтно: два UID считаются одинаковыми, только если совпадают все байты по порядку. Размер массива для хранения виденных UID ограничен заранее заданным числом (в примере — 20 карт), что соответствует типичной оперативной памяти Arduino UNO — для хранения сотен карт потребовалась бы внешняя память, например EEPROM.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему. Проверьте, что пины
// RC522 (RST) и TM1637 (CLK/DIO) не пересекаются на вашей распайке.
#include <SPI.h>
#include <MFRC522.h>
#include <TM1637Display.h>
const int SS_PIN = 10;
const int RST_PIN = 7; // перенесён с D9, чтобы не конфликтовать с TM1637
MFRC522 rfid(SS_PIN, RST_PIN);
TM1637Display display(9, 8); // CLK, DIO — свободные пины на вашей схеме
const int MAX_CARDS = 20;
byte knownUids[MAX_CARDS][4];
int knownCount = 0;
bool isKnownUid(byte* uid) {
for (int i = 0; i < knownCount; i++) {
bool match = true;
for (int b = 0; b < 4; b++) {
if (knownUids[i][b] != uid[b]) { match = false; break; }
}
if (match) return true;
}
return false;
}
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
display.setBrightness(5);
display.showNumberDec(0);
}
void loop() {
if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
return;
}
if (!isKnownUid(rfid.uid.uidByte) && knownCount < MAX_CARDS) {
for (int b = 0; b < 4; b++) {
knownUids[knownCount][b] = rfid.uid.uidByte[b];
}
knownCount++;
display.showNumberDec(knownCount);
Serial.print("Новая карта! Всего уникальных: ");
Serial.println(knownCount);
} else {
Serial.println("Карта уже была отсканирована ранее.");
}
rfid.PICC_HaltA();
}
Библиотеки SPI, MFRC522 и TM1637Display ставятся через Менеджер библиотек Arduino IDE. Список известных карт хранится только в оперативной памяти и сбрасывается при перезагрузке Arduino.
Ещё модули для Arduino: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу в корзину: 213 ₽ 192 ₽ (экономия 21 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.