Продвинутая RFID-система учёта рабочего времени v2.0: решение без Ethernet
Компоненты и материалы
| Arduino UNO | 1 шт. |
| Провода перемычки (generic) | 1 комплект |
| Модуль RFID RC522 | 1 шт. |
Приложения и онлайн-сервисы
- addRFIDTagsProg (Windows) — регистрация RFID-меток
- markOnlineAttendance (Windows) — отметка посещаемости
Доступно только для Windows. Версии для других ОС в разработке.
Описание проекта
Вторая версия онлайн-системы учёта посещаемости на базе RFID исключает необходимость программирования. Достаточно собрать схему и выполнить настройку через веб-интерфейс и десктопные приложения. Система включает LCD-дисплей для отображения статуса.
Принцип работы
Схема подключения
Подключение LCD (16×2):
- Pin 3 (Vo) — через резистор 220 Ом на GND
- RS — A0
- Enable — A1
- D4 — D5
- D5 — D4
- D6 — D3
- D7 — D2
- R/W — GND
- VSS — GND
- VCC — 5V
Подключение RFID RC522 (SPI):
- SDA (SS) — D10
- SCK — D13
- MOSI — D11
- MISO — D12
- RST — D9
- 3.3V — 3.3V
- GND — GND
Настройка и запуск
- Создайте группу пользователей и получите ключ валидации на портале. Сохраните ключ.
- Скачайте архивы с десктопными приложениями (ссылки выше). Распакуйте, выберите версию под вашу архитектуру (32/64 бит).
- Подключите Arduino с RFID-модулем к ПК.
- Загрузите скетч в Arduino (код ниже).
- Запустите addRFIDTagsProg. Выберите COM-порт. Введите ключ валидации и нажмите «Validate Key».
- Добавьте пользователей: приложите карту к считывателю, введите имя, нажмите «Enter». Успешная регистрация отобразится на веб-панели: панель управления.
- В веб-панели (вкладка Users → Pending User List) назначьте RFID-метки сотрудникам/студентам.
- Запустите markOnlineAttendance. Статус «Connected» означает готовность. Приложите метку — посещаемость зафиксируется.
- Просмотр отчётов: Attendance Controls → View Attendance → выберите месяц/год → Show.
Код (Arduino)
/* Пример чтения NUID с MFRC522 и вывод на LCD/Serial */
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
const int rs = A0, en = A1, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
#define SS_PIN 10
#define RST_PIN 9
int greenLedPin = A2;
int redLedPin = A3;
int orangeLedPin = 6;
int buzzerPin = A4;
MFRC522 rfid(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;
byte nuidPICC[4];
boolean chkConn = false;
boolean isValidating = false;
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
pinMode(greenLedPin, OUTPUT);
pinMode(redLedPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
lcd.begin(16, 2);
lcd.print("GadgetProgrammer");
delay(100);
lcd.setCursor(0, 1);
lcd.print(" Not Connected! ");
establishConnection();
}
void loop() {
lcd.setCursor(0, 1);
char retOutput;
if (Serial.available() > 0) {
retOutput = Serial.read();
lcd.blink();
if (retOutput == 'A') {
chkConn = true;
analogWrite(orangeLedPin, 0);
lcd.print("Swipe Your Card!");
}
if (retOutput == 'V') {
analogWrite(orangeLedPin, 1000);
lcd.print("Validating Group");
isValidating = true;
delay(1000);
}
if (retOutput == 'S') {
lcd.print("Validation Done!");
glowGreenLed(1000);
isValidating = false;
delay(1000);
}
}
if (chkConn && retOutput) {
if (retOutput == '1') { lcd.print("Attendance Done!"); glowGreenLed(1000); delay(4000); }
else if (retOutput == '0') { lcd.print("Network Error !"); glowRedLed(1000); delay(4000); }
else if (retOutput == '2') { lcd.print("User Not Found!"); glowRedLed(1000); delay(4000); }
else if (retOutput == '5') { lcd.print("Network Error!"); glowRedLed(1000); delay(4000); }
if (!isValidating) {
lcd.setCursor(0, 1);
analogWrite(orangeLedPin, 0);
lcd.print("Swipe Your Card!");
}
}
if (!rfid.PICC_IsNewCardPresent()) return;
if (!rfid.PICC_ReadCardSerial()) return;
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
piccType != MFRC522::PICC_TYPE_MIFARE_4K) return;
for (byte i = 0; i < 4; i++) nuidPICC[i] = rfid.uid.uidByte[i];
printHex(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
lcd.setCursor(0, 1);
lcd.print("Reading Card...!");
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
delay(1000);
}
void printHex(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? "0" : "");
Serial.print(buffer[i], HEX);
}
}
void glowGreenLed(int dt) {
digitalWrite(orangeLedPin, LOW);
digitalWrite(greenLedPin, HIGH);
digitalWrite(redLedPin, LOW);
tone(buzzerPin, 5000, 300);
if (dt > 0) { delay(dt); digitalWrite(greenLedPin, LOW); noTone(buzzerPin); }
}
void glowRedLed(int dt) {
digitalWrite(orangeLedPin, LOW);
digitalWrite(greenLedPin, LOW);
digitalWrite(redLedPin, HIGH);
digitalWrite(buzzerPin, HIGH);
delay(1000);
tone(buzzerPin, 5000);
if (dt > 0) { delay(dt); digitalWrite(redLedPin, LOW); noTone(buzzerPin); }
}
void establishConnection() {
while (Serial.available() <= 0 && !chkConn) {
Serial.println("A");
analogWrite(orangeLedPin, 100);
delay(200);
}
}
Схемы
Файлы схем: pin_connections_of_arduino_and_lcd_yD9G43NUd9.tiff, pin_connections_of_arduion_and_rfid_7DFKgigFOA.tiff
Производственный процесс
- Валёк для теста: от этрусских истоков к современному мастерству
- Эволюция и мастерство современных кеглей для боулинга
- Солнечные отопительные системы: от пассивных к активным решениям для устойчивого отопления домов
- От древних фибул к современному производству: история булавки-английки
- Primal Display: создайте монитор температуры на Raspberry Pi с LCD
- Elkem Silicones представляет LSR Select: низкотемпературное отверждение и кастомная формуляция для на 50% более быстрых ц…
- Двухматериальный термоэлектрический кулер: активный режим в 25 раз эффективнее пассивного
- Надежная система учета рабочего времени на Arduino с RFID и Python
- Конвейерные системы: принцип работы, виды и ключевые преимущества
- Подвеска автомобиля: функции, компоненты, типы, принцип работы и требования