Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Включаем светодиод при совпадении UID RFID-метки

В этом разделе мы возьмём UID, который получили в предыдущей главе, и зашьём его прямо в программу. Светодиод будет включаться только тогда, когда рядом находится подходящая RFID-метка; в остальных случаях он остаётся выключенным. Если поднести RFID-метку, светодиод загорится. Если поднести другую метку, например брелок или любую другую RFID-карту, светодиод погаснет.

Так вы получите базовое ощущение «авторизован — не авторизован». Простой проверки UID недостаточно для настоящей безопасности, и в следующей главе мы подробнее разберём чтение и аутентификацию. А пока это простой и весёлый способ начать. Этот пример можно также расширить, добавив OLED-дисплей и выводя на нём сообщения «Authorized» или «Unauthorized» вместо светодиода.

Получаем UID вашей карты

Прежде чем писать логику управления светодиодом, нужно узнать UID вашей RFID-карты.

Запустите код из предыдущей главы, который выводит UID. Когда вы поднесёте карту к считывателю, вы увидите примерно такой вывод:

UID: 13 37 73 31

Это четыре байта, которые вы зададите в программе как [0x13, 0x37, 0x73, 0x31].

Логика

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

#![allow(unused)]
fn main() {
// Замените байты UID на UID вашей метки
const TAG_UID: [u8; 4] = [0x13, 0x37, 0x73, 0x31];

let mut led = Output::new(p.PIN_25, Level::Low);

loop {
    led.set_low();

    if let Ok(atqa) = rfid.reqa() {
        if let Ok(uid) = rfid.select(&atqa) {
            if *uid.as_bytes() == TAG_UID {
                led.set_high();
                Timer::after_millis(500).await;
            }
        }
    }
    Timer::after_millis(100).await;
}
}

Клонируйте существующий проект

Можно клонировать проект, который я создал, и перейти в папку rfid-led.

git clone https://github.com/ImplFerris/pico2-embassy-projects
cd pico2-embassy-projects/rfid/rfid-led/

Зажигаем светодиод

Прошейте программу на Pico, как обычно:

# если вы используете отладочный зонд
# cargo flash --release
cargo embed --release

# если вы используете подход с BOOTSEL
cargo run --release

Когда программа запущена, поднесите подходящую RFID-метку к считывателю и посмотрите, как включается встроенный светодиод. Уберите метку — светодиод погаснет. Попробуйте другую карту или брелок, и вы увидите, что светодиод не загорается для UID, которые не совпадают.

Версия на rp-hal

Если вас интересует версия этого примера на rp-hal, её можно найти в репозитории ниже. Клонируйте репозиторий и перейдите в проект rfid-led:

git clone https://github.com/ImplFerris/pico2-rp-projects
cd pico2-rp-projects/rfid/rfid-led/