🛒
0 товаров
0 руб.

Интернет-магазин «Неглупый Дом»


🔢 Проект: счётчик уникальных карт на RC522 с выводом на TM1637

В другом проекте на сайте RC522 просто подаёт сигнал на каждое сканирование, не различая карты между собой. Здесь Arduino запоминает UID уже виденных карт и увеличивает счётчик на TM1637 только при появлении НОВОЙ, ранее не встречавшейся карты — повторное сканирование той же самой карты счётчик не увеличивает.

Как это работает

Считывание UID такое же, как и в остальных RFID-проектах — RC522 отдаёт по SPI уникальный идентификатор карты, обычно 4 байта. Разница — в дальнейшей обработке: вместо немедленной реакции на любое сканирование Arduino сравнивает полученный UID со списком всех уже сохранённых UID в небольшом массиве в памяти, и только если совпадений не найдено — добавляет его в список и увеличивает счётчик.

Поскольку UID — это несколько байт, а не одно число, сравнение выполняется побайтно: два UID считаются одинаковыми, только если совпадают все байты по порядку. Размер массива для хранения виденных UID ограничен заранее заданным числом (в примере — 20 карт), что соответствует типичной оперативной памяти Arduino UNO — для хранения сотен карт потребовалась бы внешняя память, например EEPROM.

Пошаговая сборка

Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.

  1. RC522: SDA (SS) → D10, SCK → D13, MOSI → D11, MISO → D12, RST → D9. Питание — обязательно от 3.3V. GND → GND.
  2. TM1637: CLK → D9... конфликт с RST RC522! Используйте другой пин для RST RC522 (например, D7) или другие пины для TM1637 (например, D6/D5) — выберите свободную комбинацию под свою плату.

Скетч

// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему. Проверьте, что пины
// 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: Электронные модули.

← 🔌 автономный сетевой узел управления DC-мото…📡 удалённый монитор оборотов на датчике Холл… →

🎁 Купить весь комплект со скидкой 10%

Все 2 товара сразу в корзину: 213 ₽ 192 ₽ (экономия 21 ₽)

Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.

Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.

Корзина


Поиск



Пример: понижающий или DC-DC или mini360 или aw-023 или арт. OZ/WB/YA