Система учета рабочего времени на Arduino с RFID

В этом проекте вы создадите систему учета рабочего времени с RFID-считывателем MFRC522 и Arduino. При поднесении RFID-метки к считывателю система сохраняет UID пользователя и время на SD-карту. Она также показывает, пришли вы вовремя или опоздали, в соответствии с заданным временем.

Сначала посмотрите видео-введение ниже

Обзор проекта

Прежде чем начать, важно описать основные функции проекта:

  • Он содержит RFID-считыватель, который считывает RFID-метки;

  • В нашей сборке есть модуль часов реального времени для отслеживания времени;

  • Когда RFID-считыватель считывает RFID-метку, он сохраняет текущее время и UID метки на SD-карту;

  • Arduino взаимодействует с SD-картой через модуль SD-карты;

  • Вы можете задать время отметки для сравнения, пришли вы вовремя или опоздали;

  • Если вы вовремя, загорается зеленый светодиод, если опоздали – красный;

  • Система также имеет зуммер, который пищит при считывании метки.

Необходимые компоненты

Необходимые компоненты для проекта системы учета рабочего времени с RFID

Вот список необходимых компонентов для этого проекта:

Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

RFID-считыватель MFRC522

В этом проекте мы используем RFID-считыватель MFRC522, и именно его мы рекомендуем приобрести (хотя этот проект также может быть совместим с другими RFID-считывателями).

RFID означает radio-frequency identification (радиочастотная идентификация). RFID использует электромагнитные поля для передачи данных на короткие расстояния и полезна для идентификации людей, проведения транзакций и т.д.

Система RFID нуждается в метках и считывателе:

  • Метки прикрепляются к объекту, который нужно идентифицировать. В нашем примере у нас есть брелок и электромагнитная карта. Некоторые магазины также используют RFID-метки на этикетках своих товаров для их идентификации. Каждая метка имеет свой уникальный идентификатор (UID).

RFID-метки - брелок и карта
  • Считыватель – это двусторонний радиопередатчик-приемник, который отправляет сигнал метке и считывает ее ответ.

RFID-считыватель MFRC522

RFID-считыватель MFRC522 работает от 3.3В и может использовать SPI или I2C для связи. Библиотека, которую мы будем использовать для управления RFID-считывателем, поддерживает только SPI, поэтому именно этот протокол связи мы и будем использовать.

Чтобы узнать больше о RFID-считывателе с Arduino, читайте: :doc:`Security Access using MFRC522 RFID Reader with Arduino </arduino/rnt/security-access-using-mfrc522-rfid-reader-with-arduino/index>`_

Установка библиотеки MFRC522

Этот проект использует библиотеку MFRC522.h для управления RFID-считывателем. Эта библиотека не установлена в Arduino IDE по умолчанию, поэтому вам нужно ее установить. Перейдите в Sketch > Include library > Manage libraries и найдите MFRC522 или выполните следующие шаги:

  1. Нажмите здесь, чтобы скачать библиотеку MFRC522. У вас должен появиться .zip файл в папке Загрузки.

  2. Распакуйте .zip файл, и вы получите папку RFID-master

  3. Переименуйте папку из RFID-master в RFID

  4. Переместите папку RFID в папку библиотек вашей Arduino IDE

  5. Наконец, перезапустите Arduino IDE

Распиновка RFID-считывателя MFRC522

В следующей таблице показана распиновка считывателя для справки:

PIN

ПОДКЛЮЧЕНИЕ К ARDUINO UNO

SDA

Digital 10

SCK

Digital 13

MOSI

Digital 11

MISO

Digital 12

IRQ

Не подключайте

GND

GND

RST

Digital 9

3.3V

3.3V

Примечание: у разных плат Arduino разные выводы SPI. Если вы используете другую плату Arduino, проверьте документацию Arduino.

Модуль SD-карты

При считывании метки ее UID и время сохраняются на SD-карту, чтобы вы могли отслеживать отметки. Существуют различные способы использования SD-карты с Arduino. В этом проекте мы используем модуль SD-карты, показанный на рисунке ниже – он работает с micro SD-картой.

Модуль SD-карты для Arduino

Существуют разные модели от разных поставщиков, но все они работают одинаково, используя протокол связи SPI. Для связи с SD-картой мы будем использовать библиотеку SD.h, которая уже установлена в Arduino IDE по умолчанию.

Чтобы узнать больше о модуле SD-карты с Arduino, читайте: :doc:`Guide to SD Card Module with Arduino </arduino/rnt/guide-to-sd-card-module-with-arduino/index>`_

Распиновка модуля SD-карты

В следующей таблице показана распиновка модуля SD-карты для справки:

PIN

ПОДКЛЮЧЕНИЕ К ARDUINO UNO

VCC

3.3V

CS

Digital 4

MOSI

Digital 11

CLK

Digital 13

MISO

Digital 12

GND

GND

Примечание: у разных плат Arduino разные выводы SPI. Если вы используете другую плату Arduino, проверьте документацию Arduino.

Подготовка SD-карты

Первый шаг при использовании модуля SD-карты с Arduino – форматирование SD-карты в FAT16 или FAT32. Следуйте инструкциям ниже.

1) Чтобы отформатировать SD-карту, вставьте ее в компьютер. Перейдите в Мой компьютер и щелкните правой кнопкой мыши по SD-карте. Выберите Форматировать, как показано на рисунке ниже.

Форматирование SD-карты - шаг 1

2) Появится новое окно. Выберите FAT32, нажмите Начать, чтобы запустить процесс форматирования, и следуйте инструкциям на экране.

Форматирование SD-карты - шаг 2

Тестирование модуля SD-карты

(Этот шаг необязательный. Это дополнительный шаг, чтобы убедиться, что модуль SD-карты работает правильно.)

Вставьте отформатированную SD-карту в модуль SD-карты.

Подключите модуль SD-карты к Arduino, как показано на схеме ниже, или проверьте таблицу распиновки.

Схема подключения модуля SD-карты к Arduino

Примечание: в зависимости от используемого модуля, выводы могут быть расположены в другом месте.

Загрузка скетча CardInfo

Чтобы убедиться, что все подключено правильно и SD-карта работает исправно, в окне Arduino IDE перейдите в File > Examples > SD > CardInfo.

Загрузите код на плату Arduino. Убедитесь, что выбраны правильная плата и COM-порт.

Откройте монитор порта на скорости 9600 бод, и информация о SD-карте будет отображена. Если все работает правильно, вы увидите подобное сообщение в мониторе порта.

Информация о SD-карте в мониторе порта

Модуль RTC (часы реального времени)

Для отслеживания времени мы используем модуль RTC SD1307. Однако этот проект прекрасно работает и с DS3231, который очень похож. Одно из основных различий между ними – точность. DS3231 гораздо точнее, чем DS1307. На рисунке ниже показана модель SD1307.

Модуль RTC DS1307 - вид спереди и сзади

Модуль имеет встроенную резервную батарею. Это позволяет модулю сохранять время, даже когда он не запитан.

Этот модуль использует связь I2C, и мы будем использовать библиотеку RTCLib.h для считывания времени с RTC.

Чтобы узнать больше о часах реального времени DS1307 с Arduino, читайте: :doc:`Guide for Real Time Clock (RTC) Module with Arduino (DS1307 and DS3231) </arduino/rnt/guide-for-real-time-clock-rtc-module-with-arduino-ds1307-and-ds3231/index>`_

Распиновка модуля RTC

В следующей таблице показана распиновка модуля RTC для справки:

PIN

ПОДКЛЮЧЕНИЕ К ARDUINO UNO

SCL

A5

SDA

A4

VCC

5V (проверьте даташит вашего модуля)

GND

GND

Примечание: у разных плат Arduino разные выводы I2C. Если вы используете другую плату Arduino, проверьте документацию Arduino.

Установка библиотеки RTCLib

Чтобы установить RTCLib.h, перейдите в Sketch > Include library > Manage libraries и найдите RTCLib или выполните следующие шаги:

  1. Нажмите здесь, чтобы скачать библиотеку RTCLib. У вас должен появиться .zip файл в папке Загрузки.

  2. Распакуйте .zip файл, и вы получите папку RTCLib-master

  3. Переименуйте папку из RTCLib-master в RTCLib

  4. Переместите папку RTCLib в папку библиотек вашей Arduino IDE

  5. Наконец, перезапустите Arduino IDE

Схема подключения

Схема этого проекта показана на электрической схеме ниже.

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

Схема подключения системы учета рабочего времени с RFID на Arduino

Вот как должна выглядеть ваша схема после сборки.

Собранная схема системы учета рабочего времени с RFID

Код

Загрузите следующий код на Arduino. Убедитесь, что выбраны правильная плата и COM-порт.

/*
 * Rui Santos
 * Complete Project Details https://randomnerdtutorials.com
 */

#include <MFRC522.h> // for the RFID
#include <SPI.h> // for the RFID and SD card module
#include <SD.h> // for the SD card
#include <RTClib.h> // for the RTC

// define pins for RFID
#define CS_RFID 10
#define RST_RFID 9
// define select pin for SD card module
#define CS_SD 4

// Create a file to store the data
File myFile;

// Instance of the class for RFID
MFRC522 rfid(CS_RFID, RST_RFID);

// Variable to hold the tag's UID
String uidString;

// Instance of the class for RTC
RTC_DS1307 rtc;

// Define check in time
const int checkInHour = 9;
const int checkInMinute = 5;

//Variable to hold user check in
int userCheckInHour;
int userCheckInMinute;

// Pins for LEDs and buzzer
const int redLED = 6;
const int greenLED = 7;
const int buzzer = 5;

void setup() {

  // Set LEDs and buzzer as outputs
  pinMode(redLED, OUTPUT);
  pinMode(greenLED, OUTPUT);
  pinMode(buzzer, OUTPUT);

  // Init Serial port
  Serial.begin(9600);
  while(!Serial); // for Leonardo/Micro/Zero

  // Init SPI bus
  SPI.begin();
  // Init MFRC522
  rfid.PCD_Init();

  // Setup for the SD card
  Serial.print("Initializing SD card...");
  if(!SD.begin(CS_SD)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  // Setup for the RTC
  if(!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while(1);
  }
  else {
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
  if(!rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
  }
}

void loop() {
  //look for new cards
  if(rfid.PICC_IsNewCardPresent()) {
    readRFID();
    logCard();
    verifyCheckIn();
  }
  delay(10);
}

void readRFID() {
  rfid.PICC_ReadCardSerial();
  Serial.print("Tag UID: ");
  uidString = String(rfid.uid.uidByte[0]) + " " + String(rfid.uid.uidByte[1]) + " " +
    String(rfid.uid.uidByte[2]) + " " + String(rfid.uid.uidByte[3]);
  Serial.println(uidString);

  // Sound the buzzer when a card is read
  tone(buzzer, 2000);
  delay(100);
  noTone(buzzer);

  delay(100);
}

void logCard() {
  // Enables SD card chip select pin
  digitalWrite(CS_SD,LOW);

  // Open file
  myFile=SD.open("DATA.txt", FILE_WRITE);

  // If the file opened ok, write to it
  if (myFile) {
    Serial.println("File opened ok");
    myFile.print(uidString);
    myFile.print(", ");

    // Save time on SD card
    DateTime now = rtc.now();
    myFile.print(now.year(), DEC);
    myFile.print('/');
    myFile.print(now.month(), DEC);
    myFile.print('/');
    myFile.print(now.day(), DEC);
    myFile.print(',');
    myFile.print(now.hour(), DEC);
    myFile.print(':');
    myFile.println(now.minute(), DEC);

    // Print time on Serial monitor
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.println(now.minute(), DEC);
    Serial.println("sucessfully written on SD card");
    myFile.close();

    // Save check in time;
    userCheckInHour = now.hour();
    userCheckInMinute = now.minute();
  }
  else {
    Serial.println("error opening data.txt");
  }
  // Disables SD card chip select pin
  digitalWrite(CS_SD,HIGH);
}

void verifyCheckIn(){
  if((userCheckInHour < checkInHour)||((userCheckInHour==checkInHour) && (userCheckInMinute <= checkInMinute))){
    digitalWrite(greenLED, HIGH);
    delay(2000);
    digitalWrite(greenLED,LOW);
    Serial.println("You're welcome!");
  }
  else{
    digitalWrite(redLED, HIGH);
    delay(2000);
    digitalWrite(redLED,LOW);
    Serial.println("You are late...");
  }
}

Просмотреть исходный код

Примечание: убедитесь, что у вас установлены все необходимые библиотеки.

Импорт библиотек

Код начинается с импорта необходимых библиотек. MFRC522 для RFID-считывателя, SD для модуля SD-карты и RTClib для RTC. Вы также подключаете библиотеку SPI для SPI-связи с RFID и модулем SD-карты.

#include <MFRC522.h> // for the RFID
#include <SPI.h>     // for the RFID and SD card module
#include <SD.h>      // for the SD card
#include <RTClib.h>  // for the RTC

Подготовка RFID-считывателя, SD-карты и RTC

Затем вы определяете выводы для RFID-считывателя и модуля SD-карты. Для RFID вывод SCK (CS_RFID) подключен к выводу 10, а вывод RST (RST_RFID) подключен к выводу 9. Для модуля SD-карты вывод Chip Select (CS_SD) подключен к выводу 4.

// define pins for RFID
#define CS_RFID 10
#define RST_RFID 9
// define chip select pin for SD card module
#define CS_SD 4

Вы создаете файл с именем myFile для хранения данных.

File myFile;

Затем вы создаете экземпляры для RFID и RTC:

// Instance of the class for RFID
MFRC522 rfid(CS_RFID, RST_RFID);

// Instance of the class for RTC
RTC_DS1307 rtc;

Переменные

Вы создаете строковую переменную uidString, которая хранит UID меток.

String uidString;

Следующие строки создают переменные для определения часа и минуты отметки. В данном случае мы задаем время отметки – 9:05 утра. Вы можете изменить время отметки, изменив эти значения:

// Define check in time
const int checkInHour = 9;
const int checkInMinute = 5;

Вам также нужно создать переменные для хранения часа отметки пользователя. Эти переменные будут сохранять час, когда была считана определенная UID-метка. Следующие переменные хранят час и минуту отметки.

//Variable to hold user check in
int userCheckInHour;
int userCheckInMinute;

Наконец, вы назначаете номера выводов для светодиодов и зуммера.

// Pins for LEDs and buzzer
const int redLED = 6;
const int greenLED = 7;
const int buzzer = 5;

setup()

Далее, в setup() вы устанавливаете светодиоды и зуммер как выходы.

// Set LEDs and buzzer as outputs
pinMode(redLED, OUTPUT);
pinMode(greenLED, OUTPUT);
pinMode(buzzer, OUTPUT);

После этого каждый модуль инициализируется.

Функции

В этом коде вы создаете 3 функции: readRFID(), logCard() и verifyCheckIn().

Функция readRFID() считывает UID метки, сохраняет его в переменную uidString и отображает в мониторе порта. Также при считывании метки зуммер издает звуковой сигнал.

Функция logCard() создает файл на SD-карте с именем DATA.txt. Вы можете изменить имя файла, если хотите, в следующей строке.

myFile=SD.open("DATA.txt", FILE_WRITE);

Затем она сохраняет uidString (который содержит UID метки) на SD-карту и текущее время.

myFile.print(uidString);
// Save time on SD card
DateTime now = rtc.now();
myFile.print(now.year(), DEC);
myFile.print('/');
myFile.print(now.month(), DEC);
myFile.print('/');
myFile.print(now.day(), DEC);
myFile.print(',');
myFile.print(now.hour(), DEC);
myFile.print(':');
myFile.print(now.minute(), DEC);

Она также сохраняет час и минуту отметки пользователя в следующих переменных для дальнейшего сравнения с заданным временем отметки.

userCheckInHour = now.hour();
userCheckInMinute = now.minute();

Функция verifyCheckIn() просто сравнивает время отметки пользователя с заданным временем и дает соответствующую обратную связь. Если пользователь опоздал, загорается красный светодиод; если пользователь вовремя, загорается зеленый светодиод.

loop()

Изучив созданные функции, loop() становится довольно простым для понимания.

Сначала код проверяет, была ли поднесена RFID-метка. Если да, он считывает UID RFID, записывает UID и время на SD-карту, а затем дает обратную связь пользователю, зажигая один из светодиодов.

Получение данных с SD-карты

Чтобы проверить данные, сохраненные на SD-карте, извлеките ее из модуля SD-карты и вставьте в компьютер.

Откройте папку SD-карты, и вы увидите файл с именем DATA.txt.

Файл DATA.txt на SD-карте

Откройте файл с помощью текстового редактора. Вы увидите что-то подобное:

Данные, сохраненные в файле DATA.txt

Обратите внимание, что каждое значение разделено запятыми. Это упрощает импорт этих данных в Excel, Google Sheets или другое программное обеспечение для обработки данных.

Заключение

В этом проекте вы научились использовать RFID-считыватель и модуль SD-карты с Arduino. Вы можете модифицировать этот проект под свои нужды или использовать созданные здесь функции в других проектах, требующих логирования данных или считывания RFID-меток.

Вы можете развить этот проект дальше и добавить дисплей для дополнительной обратной связи с пользователем. Вы можете связать имя с каждым UID и отображать имя пользователя при считывании метки. Возможно, вам стоит взглянуть на некоторые руководства по использованию дисплеев с Arduino:

Это отрывок из нашего курса «Arduino Step-by-step Projects». Если вам нравится Arduino и вы хотите создавать больше проектов, мы рекомендуем скачать наш курс: Arduino Step-by-step Projects.