В данной статье мы рассмотрим как создать систему учета рабочего времени на основе IoT (интернет вещей) и RFID (радиочастотных метках) с использованием плат Arduino и NodeMCU ESP8266, а также платформы Adafruit.io с использованием брокера MQTT. Поэтому в этом проекте мы будем использовать модуль для считывания RFID меток MFRC522, платы Arduino Uno и NodeMCU ESP-12E. Плата Arduino и сканер RFID будут сканировать карты RFID, а затем регистрировать их на облачной платформе Adafruit IO с помощью модуля Wi-Fi ESP8266. Эта информация может отображаться на панели управления Adafruit IO и может быть доступна соответствующим органам для просмотра и анализа посещаемости через Интернет из любого места в любое время.
Ранее на нашем сайте мы рассматривали следующие похожие проекты:
- биометрическая система учета посещаемости c использованием Arduino и датчика отпечатков пальцев;
- бесконтактный настенный термометр на Arduino с логгером данных на SD карту;
- система учета посетителей на NodeMCU ESP8266 и RFID метках.
Необходимые компоненты
- NodeMCU ESP8266 (купить на AliExpress).
- Плата Arduino Uno (купить на AliExpress).
- Модуль RFID RC522 и карты RFID 13,56 МГц (5-10 шт.) (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Схема проекта
Схема системы контроля посещаемости на основе RFID модуля RC522, плат NodeMCU ESP8266 и Arduino Uno представлена на следующем рисунке.
Подключите вывод SDA модуля RFID к цифровому выводу 10 Arduino. Аналогично подключите SCK к D13, MOSI к D11, MISO к D12, GND к GND, вывод RST к D9 и подайте питание 3,3 В с помощью выводов 3,3 В. Контакт IRQ не подключен. Аналогично подключите выводы TX, RX NodeMCU к выводам D2, D3 платы Arduino соответственно. Также подайте питание на Node MCU, подключив его выводы VCC и GND.
Собранная конструкция проекта показана на следующем рисунке.
Все компоненты системы подключены согласно схеме просто на макетной плате. MFRC522 — это модуль SPI, подключенный к Arduino. Nodemcu подключен через контакты UART. Существует несколько карт RFID, мы будем использовать 6 карт для 6 человек. Все эти карты имеют частоту 13,56 МГц.
Ранее RFID модуль RC522 мы использовали в следующих проектах на нашем сайте:
- замок с электромагнитным управлением на основе Arduino и радиочастотной идентификации (RFID);
- вход в Windows с помощью Arduino и радиочастотной идентификации (RFID).
Настройка учетной записи Adafruit.io
Adafruit.io — это открытая платформа данных, которая позволяет вам агрегировать, визуализировать и анализировать данные в реальном времени в облаке. Используя Adafruit.io, вы можете загружать, отображать и контролировать свои данные через Интернет, а также сделать свой проект IoT-совместимым.
Для настройки Adafruit первое, что вам нужно сделать, это зарегистрироваться на Adafruit. Чтобы зарегистрироваться, перейдите на сайт Adafruit IO https://io.adafruit.com/ и нажмите ‘Get started for Free’ («Начать бесплатно») в правом верхнем углу экрана. После этого появится окно, в котором вам нужно будет заполнить свои данные.
Итак, как только учетная запись будет создана, просто вернитесь на https://io.adafruit.com/. С левой стороны нажмите на view AIO Key. Отсюда вам нужно скопировать имя пользователя, а также AIO Key. Так что просто скопируйте эти ключи в блокнот, так как они вам понадобятся позже для использования в программе.
Теперь слева нажмите на панель мониторинга и создайте новую панель мониторинга, используя любое имя, например RFID_Attendance. Вы можете дать или не дать описание. Итак, панель мониторинга создана.
Теперь аналогично зайдите в каналы и создайте новый канал. Дайте ему имя. Также скопируйте это имя (в блокнот), которое вы ему дали, так как оно нам также понадобится позже.
Исходный код программы
Этот проект создан с использованием плат NodeMCU и Arduino. Поэтому у нас будет два кода: один для arduino UNO/Nano, а другой для NodeMCU. Вам нужно загрузить оба этих кода в соответствующие им платы.
Код для платы Arduino
Вам будет нужна библиотека MFRC522. Загрузите библиотеку отсюда: Библиотека MFRC522
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
#include <SPI.h> #include <MFRC522.h> #include "SoftwareSerial.h" #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance. SoftwareSerial ser(2,3); // RX, TX void setup() { Serial.begin(9600); // Initiate a serial communication ser.begin (115200); SPI.begin(); // Initiate SPI bus mfrc522.PCD_Init(); // Initiate MFRC522 Serial.println("Put RFID Card to Scan..."); Serial.println(); } void loop() { // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; } //Show UID on serial monitor String content= ""; byte letter; for (byte i = 0; i < mfrc522.uid.size; i++) { content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); content.concat(String(mfrc522.uid.uidByte[i], HEX)); } Serial.println(); Serial.print("User No./Name: "); content.toUpperCase(); if (content.substring(1) == "E9 9C B0 E3" ) //change here the UID of the card/cards that you want to give access { Serial.println("1-Alex Newton"); ser.write(1); Serial.println(); delay(3000); } if (content.substring(1) == "01 15 C9 1F" ) //change here the UID of the card/cards that you want to give access { Serial.println("2-Tracy Witney"); ser.write(2); Serial.println(); delay(3000); } if (content.substring(1) == "B9 BF 62 1B" ) //change here the UID of the card/cards that you want to give access { Serial.println("3-Lucinda Ambrey"); ser.write(3); Serial.println(); delay(3000); } if (content.substring(1) == "C9 17 AF E3" ) //change here the UID of the card/cards that you want to give access { Serial.println("4-Simon Jones"); ser.write(4); Serial.println(); delay(3000); } if (content.substring(1) == "D9 4D 0C 1B" ) //change here the UID of the card/cards that you want to give access { Serial.println("5-Dimitri Levrock"); ser.write(5); Serial.println(); delay(3000); } if (content.substring(1) == "3B 06 A9 1B" ) //change here the UID of the card/cards that you want to give access { Serial.println("6-Jasmine Joseph"); ser.write(6); Serial.println(); delay(3000); } } |
Код для платы NodeMCU ESP-12E
Вам будет нужна библиотека MQTT. Загрузите библиотеку отсюда: библиотека MQTT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
#include <ESP8266WiFi.h> #include "Adafruit_MQTT.h" #include "Adafruit_MQTT_Client.h" // WiFi parameters #define WLAN_SSID "Your Wifi SSID" #define WLAN_PASS "Your Wifi Password" // Adafruit IO #define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 #define AIO_USERNAME "Your AIO Username" #define AIO_KEY "Your AIO Key" // Obtained from account info on io.adafruit.com // Create an ESP8266 WiFiClient class to connect to the MQTT server. WiFiClient client; // Setup the MQTT client class by passing in the WiFi client and MQTT server and login details. Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); Adafruit_MQTT_Publish Attendance = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/RFID_Attendance"); char ID; /*************************** Sketch Code ************************************/ void setup() { Serial.begin(115200); Serial.println(F("Adafruit IO Example")); // Connect to WiFi access point. Serial.println(); Serial.println(); delay(10); Serial.print(F("Connecting to ")); Serial.println(WLAN_SSID); WiFi.begin(WLAN_SSID, WLAN_PASS); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print(F(".")); } Serial.println(); Serial.println(F("WiFi connected")); Serial.println(F("IP address: ")); Serial.println(WiFi.localIP()); // connect to adafruit io connect(); } // connect to adafruit io via MQTT void connect() { Serial.print(F("Connecting to Adafruit IO... ")); int8_t ret; while ((ret = mqtt.connect()) != 0) { switch (ret) { case 1: Serial.println(F("Wrong protocol")); break; case 2: Serial.println(F("ID rejected")); break; case 3: Serial.println(F("Server unavail")); break; case 4: Serial.println(F("Bad user/pass")); break; case 5: Serial.println(F("Not authed")); break; case 6: Serial.println(F("Failed to subscribe")); break; default: Serial.println(F("Connection failed")); break; } if(ret >= 0) mqtt.disconnect(); Serial.println(F("Retrying connection...")); delay(5000); } Serial.println(F("Adafruit IO Connected!")); } void loop() { // ping adafruit io a few times to make sure we remain connected if(! mqtt.ping(3)) { // reconnect to adafruit io if(! mqtt.connected()) connect(); } if ( Serial.available() ) { // Update and send only after 1 seconds char a = Serial.read(); ID = a; if (! Attendance.publish(ID)) { //Publish to Adafruit Serial.println(F("Failed")); } else { Serial.println(F("Sent!")); } } } |
Объяснение работы кода
1. Код Ардуино
Для RFID-сканера используется библиотека MFRC522. Контакты SDA и RST подключены к контактам 10 и 9 Arduino, как показано на принципиальной схеме.
1 2 3 4 5 6 7 |
#include <SPI.h> #include <MFRC522.h> #include "SoftwareSerial.h" #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance. SoftwareSerial ser(2,3); // RX, TX |
Внутри функции setup() мы инициализируем последовательную связь на скорости 9600 бод и программную последовательную связь на скорости 115200 бод. Мы также открыли связь с MFRC522.
1 2 3 4 5 6 7 8 9 |
void setup() { Serial.begin(9600); // Initiate a serial communication ser.begin (115200); SPI.begin(); // Initiate SPI bus mfrc522.PCD_Init(); // Initiate MFRC522 Serial.println("Put RFID Cards to Scan ......."); Serial.println(); } |
Внутри функции void loop() мы проверим, присутствует ли новая карта, и если присутствует новая карта, то она проверит UID карты. Для действительной карты она выведет UID карты с именем пользователя. В противном случае она выведет «неавторизированная карта».
Шестнадцатеричное число — это номер метки RFID. В примерах есть простая программа для определения этих номеров RFID. Вы можете найти эти номера RFID и заменить их в программе. Аналогично, функция ser.write имеет номера 1, 2, 3, 4, 5, 6. Эти номера — серийный номер карты, который будет загружен в панель управления Adafruit. Вы можете назначить этим номерам несколько имен, как вы можете видеть выше. Эти имена будут отображаться на последовательном мониторе во время сканирования.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
void loop() { // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; } //Show UID on serial monitor String content= ""; byte letter; for (byte i = 0; i < mfrc522.uid.size; i++) { content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); content.concat(String(mfrc522.uid.uidByte[i], HEX)); } Serial.println(); Serial.print("User No./Name: "); content.toUpperCase(); if (content.substring(1) == "E9 9C B0 E3" ) //change here the UID of the card/cards that you want to give access { Serial.println("1-Alex Newton"); ser.write(1); Serial.println(); delay(3000); |
2. Код NodeMCU ESP8266-12E
Запустите программу, добавив необходимые библиотеки. После этого введите учетные данные Wifi и пароль с именем пользователя Adafruit IO и ключом AIO, полученными ранее.
1 2 3 4 5 6 7 8 9 |
#include <ESP8266WiFi.h> #include "Adafruit_MQTT.h" #include "Adafruit_MQTT_Client.h" #define WLAN_SSID "" #define WLAN_PASS "" #define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 #define AIO_USERNAME "Username" #define AIO_KEY "AIO Key" |
Используя функцию setup(), мы начнем последовательную связь на скорости 11500 бод. Затем мы подключим наш Wi-Fi-клиент к серверу Adafruit IO.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void setup() { Serial.begin(115200); Serial.println(F("Adafruit IO Example")); Serial.println(); delay(10); Serial.print(F("Connecting to ")); Serial.println(WLAN_SSID); WiFi.begin(WLAN_SSID, WLAN_PASS); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print(F(".")); } // connect to adafruit io connect(); } |
Внутри функции void loop() плата ESP считывает данные из последовательного порта, а затем публикует их на сервере Adafruit IO.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void loop() { // ping adafruit io a few times to make sure we remain connected if(! mqtt.ping(3)) { // reconnect to adafruit io if(! mqtt.connected()) connect(); } if ( Serial.available() ) { // Update and send only after 1 seconds char a = Serial.read(); ID = a; if (! Attendance.publish(ID)) { //Publish to Adafruit Serial.println(F("Failed")); } else { Serial.println(F("Sent!")); } } } |
Если вы хотите более подробно разобраться в работе с сервером MQTT, то можете посмотреть следующие проекты:
- подключение NodeMCU ESP8266 к MQTT брокеру с помощью Arduino IDE;
- управление контактами Raspberry Pi с помощью облака MQTT на основе Adafruit IO.
Тестирование работы проекта
После загрузки кода на обе платы вы можете просто открыть последовательный монитор для обоих плат и начать сканирование RFID-карт.
Когда сканируется несколько или много карт, данные загружаются в каналы adafruit io. Вы можете просто войти в систему и проверить детали этих операций.
Нафига тут ардуина если весь функционал можно было на есп8266 сделать, разве что только ног поменьше
Да, можно. Но возможности для масштабирования и дальнейшего наращивания функционала, а также гибкости внесения изменений здесь лучше чем в варианте только с ESP8266