| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
| products:laboratory_iot_c:exp37 [2024/12/04 16:50] – [Программный код эксперимента] labuser30 | products:laboratory_iot_c:exp37 [2024/12/04 17:20] (текущий) – [Программный код эксперимента] labuser30 |
|---|
| void setup() { | void setup() { |
| Serial.begin(9600); | Serial.begin(9600); |
| | Serial.println(); |
| SPI.begin(); | SPI.begin(); |
| rdr.PCD_Init(); | rdr.PCD_Init(); |
| </code> | </code> |
| |
| Далее мы определили функцию ''bytesToString()'', которая принимает массив байт и его длину, и возвращает строку | Далее мы определили функцию ''bytesToString()'', которая принимает массив байт и его длину, и возвращает строку — номер метки. Эта функция позволит нам удобно выводить номер метки. Подробно останавливаться как работает функция не будем. |
| <code python[enable_line_numbers="2", start_line_numbers_at="8"]> | <code python[enable_line_numbers="2", start_line_numbers_at="8"]> |
| String bytesToString(byte *bytes, byte size) { | String bytesToString(byte *bytes, byte size) { |
| </code> | </code> |
| |
| В основном цикле запрашиваем данные о состоянии считывателя | Инициализируем шину SPI и считыватель меток: |
| <code python[enable_line_numbers="2", start_line_numbers_at="7"]> | <code arduino[enable_line_numbers="2", start_line_numbers_at="20"]> |
| (stat, tag_type) = rdr.request(rdr.REQIDL) | SPI.begin(); |
| | rdr.PCD_Init(); |
| </code> | </code> |
| |
| Если обнаружена метка, то запрашиваем номер метки | В основном цикле мы сначала проверяем приложена ли метка с считывателю, если нет начинаем цикл сначала. Аналогично проверяем удалось ли считать номер метки, если нет начинаем цикл сначала. |
| <code python[enable_line_numbers="2", start_line_numbers_at="10"]> | <code arduino[enable_line_numbers="2", start_line_numbers_at="25"]> |
| (stat, raw_uid) = rdr.anticoll() | if (!rdr.PICC_IsNewCardPresent()) return; |
| | if (!rdr.PICC_ReadCardSerial()) return; |
| </code> | </code> |
| |
| Формируем строку с номером карты для отображения пользователю | Если считывание метки было успешно, то номер записывается в массив байт ''rdr.uid.uidByte'', который мы передаем в функцию ''bytesToString()'' возвращающую строку. |
| <code python[enable_line_numbers="2", start_line_numbers_at="13"]> | <code arduino[enable_line_numbers="2", start_line_numbers_at="28"]> |
| card_number = '{:x}{:x}{:x}{:x}'.format(raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]) | Serial.println("Card detected: " + bytesToString(rdr.uid.uidByte, 4)); |
| </code> | </code> |
| |
| Метод ''format()'' принимает произвольное количество аргументов и выполняет их подстановку в указанных местах строки, относительно которой он вызван. В строке- шаблоне есть специальные метки в фигурных скобках. На их места подставляются соответствующие аргументы метода. Полученную таким образом строку выводим в терминал | |
| |
| <code python[enable_line_numbers="2", start_line_numbers_at="14"]> | |
| Serial.println("Card detected: " + bytesToString(rdr.uid.uidByte, 27)); | |
| </code> | |
| |
| Оператор ''+'' в данном случае выполняет функцию конкатенации (склейки строк) так как находится в контексте строк, а не чисел. | Оператор ''+'' в данном случае выполняет функцию конкатенации (склейки строк) так как находится в контексте строк, а не чисел. |
| |
| | Функция ''rdr.PICC_HaltA()'' блокирует повторное считывание метки. |
| | <code arduino[enable_line_numbers="2", start_line_numbers_at="29"]> |
| | rdr.PICC_HaltA(); |
| | </code> |
| |
| | <WRAP center round info 60%> |
| | * [[https://arduino.ru/Reference/StringObject|Подробнее о строках в Arduino]] |
| | </WRAP> |