Умная зона безопасности на Arduino: разблокировка Android, iOS и Windows 10 по отпечатку пальца
Компоненты и материалы
| Arduino Nano R3 | ×1 |
| Модуль Bluetooth HC-05 | ×1 |
| Сенсор отпечатков пальцев R301T (UART) | ×1 |
| RGB-светодиод 5 мм (общий анод, 4 пина) | ×1 |
Программное обеспечение
- Arduino IDE
О проекте
Гаджет «Safe Zone» создаёт зону доверия вокруг ваших устройств. После успешной верификации отпечатка пальца включается Bluetooth, устройства автоматически разблокируются (Smart Lock / Dynamic Lock), пока гаджет в радиусе действия.
Проблема и решение
Современные устройства требуют постоянной разблокировки (ПИН, отпечаток, Face ID). В безопасной среде (домашний офис) это раздражает. Решение: носимый/стационарный гаджет, который по вашему отпечатку активирует Bluetooth-маяк, и доверенные устройства снимают блокировку.
Модуль отпечатков R301T
UART-сенсор (TX/RX), хранит до 127 отпечатков. Работает через библиотеку Adafruit_Fingerprint. Подключение: TX → D2, RX → D3 (через SoftwareSerial), VCC → 3.3V/5V, GND → GND.
Bluetooth HC-05
Работает в режиме Slave. Один раз парится с каждым устройством (Windows 10: Dynamic Lock, Android: Smart Lock, iOS: Touch ID & Passcode → автоматическая разблокировка).
Схема подключения
- R301T: TX→D2, RX→D3 (SoftwareSerial)
- HC-05: TX→D0 (RX Arduino), RX→D1 (TX Arduino) — аппаратный Serial, или тоже через SoftwareSerial на других пинах
- RGB LED: R→D9, G→D10, B→D11 (PWM), общий анод → +5V
- Питание: Arduino от USB или 5V стабилизатора
Код Arduino (основной скетч)
#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX для R301T
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
int cc = 0;
void setup() {
Serial.begin(9600);
while (!Serial); delay(100);
Serial.println("\n\nAdafruit finger detect test");
finger.begin(57600);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor :(");
while (1) { pinMode(13, OUTPUT); digitalWrite(13, LOW); pinMode(9, OUTPUT); digitalWrite(9, HIGH); }
}
finger.getTemplateCount();
Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
Serial.println("Waiting for valid finger...");
pinMode(13, OUTPUT); pinMode(9, OUTPUT);
}
void loop() {
getFingerprintIDez();
delay(50);
}
uint8_t getFingerprintID() {
uint8_t p = finger.getImage();
switch (p) {
case FINGERPRINT_OK: Serial.println("Image taken"); break;
case FINGERPRINT_NOFINGER: Serial.println("No finger detected"); return p;
case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return p;
case FINGERPRINT_IMAGEFAIL: Serial.println("Imaging error"); return p;
default: Serial.println("Unknown error"); return p;
}
p = finger.image2Tz();
switch (p) {
case FINGERPRINT_OK: Serial.println("Image converted"); break;
case FINGERPRINT_IMAGEMESS: Serial.println("Image too messy"); return p;
case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return p;
case FINGERPRINT_FEATUREFAIL: Serial.println("Could not find fingerprint features"); return p;
case FINGERPRINT_INVALIDIMAGE: Serial.println("Could not find fingerprint features"); return p;
default: Serial.println("Unknown error"); return p;
}
p = finger.fingerFastSearch();
if (p == FINGERPRINT_OK) Serial.println("Found a print match!");
else if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial.println("Communication error"); return p; }
else if (p == FINGERPRINT_NOTFOUND) { Serial.println("Did not find a match"); return p; }
else { Serial.println("Unknown error"); return p; }
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
for (int i = 255; i > 1; i--) { analogWrite(9, i); delay(10); }
if (cc % 2 == 0) digitalWrite(13, HIGH); else digitalWrite(13, LOW);
cc++;
return finger.fingerID;
}
int getFingerprintIDez() {
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK) return -1;
p = finger.image2Tz();
if (p != FINGERPRINT_OK) return -1;
p = finger.fingerFastSearch();
if (p != FINGERPRINT_OK) return -1;
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
return finger.fingerID;
}
Сборка и настройка устройств
- Загрузить скетч в Arduino Nano.
- Зарегистрировать отпечаток через Serial Monitor (команды библиотеки Adafruit).
- Собрать схему на макетной плате или печатной плате.
- Спарьте HC-05 с устройствами:
- Windows 10: Параметры → Учётные записи → Параметры входа → Dynamic Lock → добавить Bluetooth-устройство.
- Android: Настройки → Экран блокировки → Smart Lock → Доверенные устройства → добавить HC-05.
- iOS: Настройки → Touch ID и код-пароль → разблокировка по Bluetooth (требует настройки).
- Приложить палец → RGB мигает зелёным → HC-05 становится видимым → устройства разблокируются.
Идеи для развития
- Добавить GPS/Geofencing — активация только в определённой зоне.
- Многопользовательский доступ с разными правами.
- Интеграция с умным домом (включение света, снятие охраны).
Производственный процесс
- Панель управления полётным симулятором 2020 на Arduino Nano: LCD и CDI-дисплеи
- Создание потрясающей системы Ambilight для монитора на Arduino
- Умная система мониторинга температуры для школ: точно, в реальном времени, безопасно
- Библиотека 8-битного порта ввода-вывода для Arduino — расширение цифрового управления
- Управление Arduino с iOS/Android по Wi-Fi/Ethernet через Evothings Studio
- Arduino 64-клавишная прототипная клавиатура: матрица на сдвиговых регистрах
- Генерация музыкальных тонов на Arduino: полный спектр 88 клавиш пианино
- Гальванически разделённый аналоговый вход для Arduino на LM331 и оптопаре 4N25
- Набор для создания робота с умной внутренней навигацией на базе Arduino
- Как прямые водяные насосы повышают эффективность водопередачи