===== Эксперимент 37. RFID =====
RFID (англ. Radio Frequency IDentification, радиочастотная идентификация) — способ автоматической идентификации объектов, в котором посредством радиосигналов считываются или записываются данные, хранящиеся в так называемых транспондерах, или RFID-метках.
RFID метки широко применяются в качестве проездных билетов для общественного транспорта и в качестве пропусков. Их часто называют магнитными пропусками, но это категорически не правильно. Большинство RFID-меток состоит из двух частей. Первая — интегральная схема (ИС) для хранения и обработки информации, модулирования и демодулирования радиочастотного (RF) сигнала и некоторых других функций. Вторая — антенна для приёма и передачи сигнала.
{{ :products:esp-iot:1200-133759230-rfid-tag-in-hand.jpg?400 |}}
Пассивные RFID метки не имеют источника питания. Необходимую для работы энергию они получают от считывающего оборудования благодаря электро- магнитной индукции.
В комплект нашего конструктора (в версии MAXI) входит RFID считыватель и две метки — одна в формате карты, вторая в виде брелока.
Проведем эксперимент с RFID. Для работы с модулем приемника нам потребуется специальная библиотека "MFRC522". Ее нужно установить с помощью управления библиотеками, как мы уже делали ранее в
[[products:laboratory_iot_c:exp29|эксперименте 29 ]].
==== Схема эксперимента ====
**НУЖНО ИЗМЕНИТЬ СХЕМУ**
{{ :products:esp-iot:16_mon.png?direct&600 |}}
//Рисунок 1. Монтажная схема эксперимента//
==== Программный код эксперимента ====
#include
#include
#define PIN_SS 15
#define PIN_RST 16
MFRC522 rdr(PIN_SS, PIN_RST);
String bytesToString(byte *bytes, byte size) {
String str;
for (byte i = 0; i < size; i++) {
str += bytes[i] < 0x10 ? "0":"";
str += String(bytes[i], HEX);
}
return str;
}
void setup() {
Serial.begin(9600);
Serial.println();
SPI.begin();
rdr.PCD_Init();
}
void loop() {
if (!rdr.PICC_IsNewCardPresent()) return;
if (!rdr.PICC_ReadCardSerial()) return;
Serial.println("Card detected: " + bytesToString(rdr.uid.uidByte, 4));
rdr.PICC_HaltA();
}
Подключаем библиотеку для работы со считывателем RFID меток
#include
Задаем псевдонимы для пинов, к которым подключен считыватель:
#define PIN_SS 15
#define PIN_RST 16
Создаем объект считывателя, указываем как подключен модуль:
MFRC522 rdr(PIN_SS, PIN_RST);
Далее мы определили функцию ''bytesToString()'', которая принимает массив байт и его длину, и возвращает строку — номер метки. Эта функция позволит нам удобно выводить номер метки. Подробно останавливаться как работает функция не будем.
String bytesToString(byte *bytes, byte size) {
String str;
for (byte i = 0; i < size; i++) {
str += bytes[i] < 0x10 ? "0":"";
str += String(bytes[i], HEX);
}
return str;
}
Инициализируем шину SPI и считыватель меток:
SPI.begin();
rdr.PCD_Init();
В основном цикле мы сначала проверяем приложена ли метка с считывателю, если нет начинаем цикл сначала. Аналогично проверяем удалось ли считать номер метки, если нет начинаем цикл сначала.
if (!rdr.PICC_IsNewCardPresent()) return;
if (!rdr.PICC_ReadCardSerial()) return;
Если считывание метки было успешно, то номер записывается в массив байт ''rdr.uid.uidByte'', который мы передаем в функцию ''bytesToString()'' возвращающую строку.
Serial.println("Card detected: " + bytesToString(rdr.uid.uidByte, 4));
Оператор ''+'' в данном случае выполняет функцию конкатенации (склейки строк) так как находится в контексте строк, а не чисел.
Функция ''rdr.PICC_HaltA()'' блокирует повторное считывание метки.
rdr.PICC_HaltA();
* [[https://arduino.ru/Reference/StringObject|Подробнее о строках в Arduino]]