Система учета рабочего времени на Arduino с RFID
В этом проекте вы создадите систему учета рабочего времени с RFID-считывателем MFRC522 и Arduino. При поднесении RFID-метки к считывателю система сохраняет UID пользователя и время на SD-карту. Она также показывает, пришли вы вовремя или опоздали, в соответствии с заданным временем.
Сначала посмотрите видео-введение ниже
Обзор проекта
Прежде чем начать, важно описать основные функции проекта:
Он содержит RFID-считыватель, который считывает RFID-метки;
В нашей сборке есть модуль часов реального времени для отслеживания времени;
Когда RFID-считыватель считывает RFID-метку, он сохраняет текущее время и UID метки на SD-карту;
Arduino взаимодействует с SD-картой через модуль SD-карты;
Вы можете задать время отметки для сравнения, пришли вы вовремя или опоздали;
Если вы вовремя, загорается зеленый светодиод, если опоздали – красный;
Система также имеет зуммер, который пищит при считывании метки.
Необходимые компоненты
Вот список необходимых компонентов для этого проекта:
Arduino UNO – читайте Лучшие стартовые наборы Arduino
Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
RFID-считыватель MFRC522
В этом проекте мы используем RFID-считыватель MFRC522, и именно его мы рекомендуем приобрести (хотя этот проект также может быть совместим с другими RFID-считывателями).
RFID означает radio-frequency identification (радиочастотная идентификация). RFID использует электромагнитные поля для передачи данных на короткие расстояния и полезна для идентификации людей, проведения транзакций и т.д.
Система RFID нуждается в метках и считывателе:
Метки прикрепляются к объекту, который нужно идентифицировать. В нашем примере у нас есть брелок и электромагнитная карта. Некоторые магазины также используют RFID-метки на этикетках своих товаров для их идентификации. Каждая метка имеет свой уникальный идентификатор (UID).
Считыватель – это двусторонний радиопередатчик-приемник, который отправляет сигнал метке и считывает ее ответ.
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 или выполните следующие шаги:
Нажмите здесь, чтобы скачать библиотеку MFRC522. У вас должен появиться .zip файл в папке Загрузки.
Распакуйте .zip файл, и вы получите папку RFID-master
Переименуйте папку из RFID-master в RFID
Переместите папку RFID в папку библиотек вашей Arduino IDE
Наконец, перезапустите 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-картой.
Существуют разные модели от разных поставщиков, но все они работают одинаково, используя протокол связи 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-карте. Выберите Форматировать, как показано на рисунке ниже.
2) Появится новое окно. Выберите FAT32, нажмите Начать, чтобы запустить процесс форматирования, и следуйте инструкциям на экране.
Тестирование модуля SD-карты
(Этот шаг необязательный. Это дополнительный шаг, чтобы убедиться, что модуль SD-карты работает правильно.)
Вставьте отформатированную SD-карту в модуль SD-карты.
Подключите модуль SD-карты к Arduino, как показано на схеме ниже, или проверьте таблицу распиновки.
Примечание: в зависимости от используемого модуля, выводы могут быть расположены в другом месте.
Загрузка скетча CardInfo
Чтобы убедиться, что все подключено правильно и SD-карта работает исправно, в окне Arduino IDE перейдите в File > Examples > SD > CardInfo.
Загрузите код на плату Arduino. Убедитесь, что выбраны правильная плата и COM-порт.
Откройте монитор порта на скорости 9600 бод, и информация о SD-карте будет отображена. Если все работает правильно, вы увидите подобное сообщение в мониторе порта.
Модуль RTC (часы реального времени)
Для отслеживания времени мы используем модуль RTC SD1307. Однако этот проект прекрасно работает и с DS3231, который очень похож. Одно из основных различий между ними – точность. DS3231 гораздо точнее, чем DS1307. На рисунке ниже показана модель SD1307.
Модуль имеет встроенную резервную батарею. Это позволяет модулю сохранять время, даже когда он не запитан.
Этот модуль использует связь 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 или выполните следующие шаги:
Нажмите здесь, чтобы скачать библиотеку RTCLib. У вас должен появиться .zip файл в папке Загрузки.
Распакуйте .zip файл, и вы получите папку RTCLib-master
Переименуйте папку из RTCLib-master в RTCLib
Переместите папку RTCLib в папку библиотек вашей Arduino IDE
Наконец, перезапустите Arduino IDE
Схема подключения
Схема этого проекта показана на электрической схеме ниже.
В этой схеме есть устройства на 3.3В и 5В, убедитесь, что вы подключаете их правильно. Также, если вы используете другие модули, проверьте рекомендуемое напряжение перед подачей питания на схему. Подключайте по одному модулю за раз и при необходимости сверяйтесь с таблицами распиновки.
Вот как должна выглядеть ваша схема после сборки.
Код
Загрузите следующий код на 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.
Откройте файл с помощью текстового редактора. Вы увидите что-то подобное:
Обратите внимание, что каждое значение разделено запятыми. Это упрощает импорт этих данных в Excel, Google Sheets или другое программное обеспечение для обработки данных.
Заключение
В этом проекте вы научились использовать RFID-считыватель и модуль SD-карты с Arduino. Вы можете модифицировать этот проект под свои нужды или использовать созданные здесь функции в других проектах, требующих логирования данных или считывания RFID-меток.
Вы можете развить этот проект дальше и добавить дисплей для дополнительной обратной связи с пользователем. Вы можете связать имя с каждым UID и отображать имя пользователя при считывании метки. Возможно, вам стоит взглянуть на некоторые руководства по использованию дисплеев с Arduino:
Это отрывок из нашего курса «Arduino Step-by-step Projects». Если вам нравится Arduino и вы хотите создавать больше проектов, мы рекомендуем скачать наш курс: Arduino Step-by-step Projects.