Интернет-магазин «Неглупый Дом»
В другом проекте RC522 подаёт сигнал на каждое сканирование, не различая карты. Здесь Arduino запоминает UID уже виденных карт и увеличивает счётчик на TM1637 только для НОВОЙ карты — повторное сканирование той же карты счётчик не увеличивает.
Считывание UID такое же — RC522 отдаёт по SPI идентификатор карты (обычно 4 байта). Разница — Arduino сравнивает UID со списком уже сохранённых в массиве и добавляет новый только если совпадений не найдено.
Сравнение побайтное — UID совпадают, только если все байты совпадают по порядку. Размер массива ограничен (20 карт в примере) под память UNO — для сотен карт нужна внешняя EEPROM.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, я языковая
// модель, а не специализированный кодер, могу что-то упустить.
// Проверьте, что пины RC522 и TM1637 не пересекаются на вашей распайке.
#include <SPI.h>
#include <MFRC522.h>
#include <TM1637Display.h>
const int SS_PIN = 10;
const int RST_PIN = 7;
MFRC522 rfid(SS_PIN, RST_PIN);
TM1637Display display(9, 8);
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);
}
rfid.PICC_HaltA();
}
Библиотеки SPI, MFRC522 и TM1637Display ставятся через Менеджер библиотек. Список известных карт хранится только в ОЗУ и сбрасывается при перезагрузке.
Ещё модули для Arduino: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу: 213 ₽ 192 ₽ (экономия 21 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.