Самодельное противоугонное устройство на ардуино и датчике отпечатков пальцев

Урок 28. Контроль доступа по отпечатку пальца

В этом уроке мы создадим устройство открывающее дверь по отпечатку пальца.

Нам понадобится:

Для реализации проекта нам необходимо установить библиотеки:

  • Библиотека LiquidCrystal_I2C_V112 (для работы с дисплеями LCD1602 по шине I2C).
  • Библиотека Adafruit_Fingerprint (для работы с модулем отпечатков пальцев).
  • Библиотеки Wire и SoftwareSerial входят в стандартный набор IDE Arduino.

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki – Установка библиотек в Arduino IDE.

Видео:

Принцип действия:

    Сканер отпечатков пальцев, в данном устройстве, выполняет три действия:
  • Регистрация отпечатков пальцев.При регистрации отпечатков пальцев, пользователь должен приложить палец к оптическому датчику дважды. Модуль обработает оба изображения и на их основе создаст шаблон, который будет сохранён в библиотеке отпечатков пальцев.
  • Сравнение отпечатков пальцев.При сравнении отпечатков пальцев, пользователь прикладывает палец к оптическому датчику, модуль сгенерирует шаблон пальца и сравнит его с сохранёнными шаблонами в библиотеке отпечатков пальцев.
  • Удаление отпечатков пальцев.При удалении отпечатка пальца, модуль удаляет шаблон отпечатка из библиотеки.

Схема подключения:

LCD дисплей подключается к аппаратной шине I2C, все остальные модули, подключаются к любым выводам arduino, каждый из которых можно изменить на любой другой, в начале скетча. Электромеханический замок подключается к напряжению питания 12В, постоянного тока, в разрыв вывода GND подключается клеммник силовой части Trema ключа.

Arduino:Модули:
2 (RX – вход программного UART) T – выход сенсора отпечатков пальцев
3 (TX – выход программного UART) R – вход сенсора отпечатков пальцев
4 Trema светодиод (зелёный)
5 Trema светодиод (красный)
6 Trema зуммер
7 Trema силовой ключ
8 Trema кнопка («A»)
9 Trema кнопка («B»)
I2C LCD дисплей

Алгоритм работы:

При старте (в коде setup), скетч выполняет 3 задачи:

  • Установка режимов работы выводов.
  • Инициализация и вывод информации на дисплей.
  • Инициализация (и проверка) сенсора отпечатков пальцев.

Циклически (в коде loop), скетч выполняет 4 задачи:

  • Опрос состояния кнопок – выполняется функцией Func_buttons_control().
  • Общение с сенсором отпечатков пальцев – выполняется функцией Func_sensor_communication().
  • Вывод данных на LCD дисплей – выполняется функцией Func_display_show().
  • Управление модулями: зуммером, светодиодами, силовым ключом – выполняется в коде loop.

Тип задач выполняемых функциями Func_buttons_control(), Func_sensor_communication() и Func_display_show(), определяется значением переменной VAR_mode_MENU, которая хранит номер режима меню:

  • 0-9 вне меню
  • 10-19 Menu > Set state
  • 20-29 Menu > Show ID
  • 30-39 Menu > New ID
  • 40-49 Menu > Del ID
  • 99 Menu > Exit

Управление модулями осуществляется при установленном флаге FLG_state_WORK – указывающим, что устройство находится в состоянии ENABLE.

Открытие замка (включение зуммера, переключение светодиодов) осуществляется по установленному флагу FLG_mode_ACCESS, который, в конце кода loop, сбрасывается через 5 секунд после установки.

Управление:

  • Вход в меню – кратковременное нажатие на обе кнопки.
  • Переход к следующему пункту меню – нажатие на кнопку «A».
  • Переход к предыдущему пункту меню – нажатие на кнопку «B».
  • Выбор пункта меню – кратковременное нажатие на обе кнопки.
  • Выход из меню – удержание двух кнопок «A» и «B» дольше 2 с, или выбор пункта меню «Exit».
  • Открытие замка изнутри – нажатие на кнопку «A» или «B» без входа в меню.
  • Блокировка замка – выбор параметра «DISABLE» в пункте меню «State».
  • Разблокировка замка – выбор параметра «ENABLE» в пункте меню «State».
  • Просмотр занятых ID шаблонами отпечатков пальцев – выбор пункта меню «Show ID».
  • Создание шаблона отпечатка пальца – выбор пункта меню «New ID»
  • Удаление шаблона отпечатка пальца – выбор пункта меню «New ID»

Код программы:

// Подключаем библиотеки:
#include // подключаем библиотеку для работы с шиной I2C
#include // подключаем библиотеку для работы с программным UART
#include // подключаем библиотеку для работы с LCD дисплеем
#include // подключаем библиотеку для работы с модулем отпечатков пальцев
LiquidCrystal_I2C lcd(0x27,16,2); // объявляем объект lcd для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2)
SoftwareSerial mySerial(2, 3); // объявляем объект mySerial для работы с библиотекой SoftwareSerial ИМЯ_ОБЪЕКТА( RX, TX ); // Можно указывать любые выводы, поддерживающие прерывание PCINTx
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); // объявляем объект finger для работы с библиотекой Adafruit_Fingerprint ИМЯ_ОБЪЕКТА = Adafruit_Fingerprint(ПАРАМЕТР); // ПАРАМЕТР – ссылка на объект для работы с UART к которому подключен модуль, например: &Serial1
// Объявляем переменные и константы:
const uint8_t PIN_led_OPEN = 4; // указываем номер вывода arduino, к которому подключен зелёный светодиод
const uint8_t PIN_led_CLOSED = 5; // указываем номер вывода arduino, к которому подключен красный светодиод
const uint8_t PIN_beep_OPEN = 6; // указываем номер вывода arduino, к которому подключен Trema зуммер
const uint8_t PIN_key_OPEN = 7; // указываем номер вывода arduino, к которому подключен Trema ключ
const uint8_t PIN_button_A = 8; // указываем номер вывода arduino, к которому подключена кнопка A
const uint8_t PIN_button_B = 9; // указываем номер вывода arduino, к которому подключена кнопка B uint16_t TIM_Button_A = 0; // время удержания кнопки A (в сотых долях секунды) uint16_t TIM_Button_B = 0; // время удержания кнопки B (в сотых долях секунды) uint32_t TIM_mode_ACCESS = 0; // время установки флага FLG_mode_ACCESS указывающего о необходимости открытия замка int ACK_finger_FUN = 0; // результат выполнения функции библиотеки Adafruit_Fingerprint uint8_t VAR_mode_MENU = 0; // текущий режим вывода меню uint8_t VAR_count_ID = 0; // количество найденных ID в базе uint8_t VAR_first_ID = 0; // номер первого выведенного ID из всех найденных uint8_t VAR_this_ID = 0; // номер ID, шаблон которого требуется сохранить/удалить uint8_t VAR_array_ID[162]; // массив найденных ID в базе bool FLG_result_FUN = 0; // флаг указывающий на результат сохранения шаблона bool FLG_mode_ACCESS = 0; // флаг указывающий о необходимости открытия замка bool FLG_state_WORK = 1; // флаг указывающий о состоянии работы замка bool FLG_display_UPD = 1; // флаг указывающий о необходимости обновления информации на дисплее
void setup(){ pinMode(PIN_button_A, INPUT); // устанавливаем режим работы вывода PIN_button_A, как “вход” pinMode(PIN_button_B, INPUT); // устанавливаем режим работы вывода PIN_button_B, как “вход” pinMode(PIN_led_OPEN, OUTPUT); // устанавливаем режим работы вывода PIN_led_OPEN, как “выход” pinMode(PIN_led_CLOSED, OUTPUT); // устанавливаем режим работы вывода PIN_led_CLOSED, как “выход” pinMode(PIN_key_OPEN, OUTPUT); // устанавливаем режим работы вывода PIN_key_OPEN, как “выход” pinMode(PIN_beep_OPEN, OUTPUT); // устанавливаем режим работы вывода PIN_beep_OPEN, как “выход” lcd.init(); // инициируем LCD дисплей lcd.backlight(); // включаем подсветку LCD дисплея lcd.clear(); // стираем информацию с дисплея lcd.setCursor(0, 0); lcd.print(F(“iArduino.ru”)); // выводим текст “iArduino.ru” delay(500); // обязательная задержка перед инициализацией модуля отпечатков пальцев finger.begin(9600); // finger.begin(57600); // инициируем модуль отпечатков пальцев, с подключением через программный UART на скорости 57600 (скорость модуля по умолчанию) lcd.clear(); // стираем информацию с дисплея lcd.setCursor(0, 0); lcd.print(F(“Scan sensor…”)); // выводим текст “Scan sensor…” lcd.setCursor(0, 1); // устанавливаем курсор в позицию: 0 столбец, 1 строка if(finger.verifyPassword()){lcd.print(F(“Found sensor”));} // если модуль отпечатков обнаружен, выводим сообщение “сенсор обнаружен” else {lcd.print(F(“Sensor not found”)); while(1);} // если модуль отпечатков не обнаружен, выводим сообщение “сенсор не обнаружен” и входим в бесконечный цикл: while(1); delay(1000); // необязательная задержка, чтоб можно было прочитать сообщение об обнаружении модуля
}
void loop(){
// Передаём управление кнопкам Func_buttons_control(); // вызываем функцию Func_buttons_control();
// Обновляем информацию на дисплее if(FLG_display_UPD){Func_display_show();} // если установлен флаг FLG_display_UPD (нужно обновить информацию на дисплее), то вызываем функцию Func_display_show();
// Общаемся с модулем отпечатков пальцев Func_sensor_communication(); // вызываем функцию Func_sensor_communication();
// Управляем замком, светодиодами и зуммером if(FLG_state_WORK){ // если установлен флаг FLG_state_WORK (замок работает, «State: ENABLE»), то … digitalWrite(PIN_key_OPEN, FLG_mode_ACCESS); // если используется электромагнитный замок, где 0-открыто, а 1-закрыто, то второй параметр указывается с восклицательным знаком: digitalWrite(PIN_key_OPEN, !FLG_mode_ACCESS); digitalWrite(PIN_led_OPEN, FLG_mode_ACCESS); // включаем или выключаем светодиод подключённый к выводу PIN_led_OPEN digitalWrite(PIN_led_CLOSED, !FLG_mode_ACCESS); // включаем или выключаем светодиод подключённый к выводу PIN_led_CLOSED if(FLG_mode_ACCESS){tone(PIN_beep_OPEN, 2000, 100);} // если установлен флаг FLG_mode_ACCESS (замок открыт), то отправляем меандр на вывод PIN_beep_OPEN (к которому подключён Trema зуммер) длительностью 100 мс с частотой 2000 Гц }
// Сбрасываем флаг FLG_mode_ACCESS, указывающий о необходимости открытия замка, через 5 секунд после его установки if(FLG_mode_ACCESS){ if( TIM_mode_ACCESS >millis()){FLG_mode_ACCESS=0; FLG_display_UPD = 1; if(VAR_mode_MENU==1){VAR_mode_MENU=0;}} if((TIM_mode_ACCESS+5000)0){VAR_mode_MENU = 10; } // войти в меню if(TIM_Button_A >0 && TIM_Button_B==0){FLG_mode_ACCESS = 1; TIM_mode_ACCESS=millis(); } // открыть замок if(TIM_Button_A==0 && TIM_Button_B >0){FLG_mode_ACCESS = 1; TIM_mode_ACCESS=millis(); } // открыть замок break; case 10: /* 1 уровень меню – вкл/выкл замок */ if(TIM_Button_A >0 && TIM_Button_B==0){VAR_mode_MENU = 99; } // перейти к предыдущему пункту меню if(TIM_Button_A==0 && TIM_Button_B >0){VAR_mode_MENU = 20; } // перейти к следующему пункту меню if(TIM_Button_A >0 && TIM_Button_B >0){VAR_mode_MENU = 11; } // выбрать текущий пункт меню break; case 11: /* 2 уровень меню – вкл/выкл замок */ if(TIM_Button_A >0 && TIM_Button_B==0){FLG_state_WORK = FLG_state_WORK?0:1; } // вкл/выкл if(TIM_Button_A==0 && TIM_Button_B >0){FLG_state_WORK = FLG_state_WORK?0:1; } // вкл/выкл if(TIM_Button_A >0 && TIM_Button_B >0){VAR_mode_MENU = 10; } // выйти из текущего пункта меню break; case 20: /* 1 уровень меню – показать ID */ if(TIM_Button_A >0 && TIM_Button_B==0){VAR_mode_MENU = 10; } // перейти к предыдущему пункту меню if(TIM_Button_A==0 && TIM_Button_B >0){VAR_mode_MENU = 30; } // перейти к следующему пункту меню if(TIM_Button_A >0 && TIM_Button_B >0){VAR_mode_MENU = 21; } // выбрать текущий пункт меню break;
// case 21: /* 2 уровень меню – показать ID */ это поиск ID с надписью Please wait …
// без реакции на нажатие кнопок
// case 22: /* 3 уровень меню – показать ID */ if(TIM_Button_A >0 && TIM_Button_B==0){VAR_first_ID -= VAR_first_ID>0?3:0; } // уменьшить первый выводимый на дисплей ID if(TIM_Button_A==0 && TIM_Button_B >0){VAR_first_ID += ((VAR_first_ID+3)0 && TIM_Button_B >0){VAR_mode_MENU = 20; } // выйти из текущего пункта меню break; case 30: /* 1 уровень меню – сохранить ID */ if(TIM_Button_A >0 && TIM_Button_B==0){VAR_mode_MENU = 20; } // перейти к предыдущему пункту меню if(TIM_Button_A==0 && TIM_Button_B >0){VAR_mode_MENU = 40; } // перейти к следующему пункту меню if(TIM_Button_A >0 && TIM_Button_B >0){VAR_mode_MENU = 31; } // выбрать текущий пункт меню break;
// case 31: /* 2 уровень меню – сохранить ID */ это поиск ID с надписью Please wait …
// без реакции на нажатие кнопок
// case 32: /* 3 уровень меню – сохранить ID */ if(TIM_Button_A >0 && TIM_Button_B==0){VAR_this_ID -= VAR_this_ID>0?1:0; } // уменьшить ID по которому будет сохранён отпечаток if(TIM_Button_A==0 && TIM_Button_B >0){VAR_this_ID += VAR_this_ID0 && TIM_Button_B >0){VAR_mode_MENU = 33; } // выбрать текущий пункт меню break;
// case 33: /* 4 уровень меню – сохранить ID */ это ожидание прикладываемого пальца (в первый раз) с надписью Put finger …
// без реакции на нажатие кнопок
//
// case 34: /* 5 уровень меню – сохранить ID */ это ожидание конвертации изображения в шаблон (в первый раз) с надписью converting …
// без реакции на нажатие кнопок
//
// case 35: /* 6 уровень меню – сохранить ID */ это ожидание отсутствия пальца перед сканером с надписью remove finger …
// без реакции на нажатие кнопок
//
// case 36: /* 7 уровень меню – сохранить ID */ это ожидание прикладываемого пальца (во второй раз) с надписью Put finger …
// без реакции на нажатие кнопок
//
// case 37: /* 8 уровень меню – сохранить ID */ это ожидание конвертации изображения в шаблон (во второй раз) с надписью converting …
// без реакции на нажатие кнопок
//
// case 38: /* 9 уровень меню – сохранить ID */ это ожидание создания и сохранения шаблона с надписью Saved …
// без реакции на нажатие кнопок
// case 39: /*10 уровень меню – сохранить ID */ if(TIM_Button_A >0 && TIM_Button_B==0){VAR_mode_MENU = 30; } // в начало текущего пункта меню if(TIM_Button_A==0 && TIM_Button_B >0){VAR_mode_MENU = 30; } // в начало текущего пункта меню if(TIM_Button_A >0 && TIM_Button_B >0){VAR_mode_MENU = 30; } // в начало текущего пункта меню break; case 40: /* 1 уровень меню – удалить ID */ if(TIM_Button_A >0 && TIM_Button_B==0){VAR_mode_MENU = 30; } // перейти к предыдущему пункту меню if(TIM_Button_A==0 && TIM_Button_B >0){VAR_mode_MENU = 99; } // перейти к следующему пункту меню if(TIM_Button_A >0 && TIM_Button_B >0){VAR_mode_MENU = 41; VAR_this_ID=0; } // выбрать текущий пункт меню break; case 41: /* 2 уровень меню – удалить ID */ if(TIM_Button_A >0 && TIM_Button_B==0){VAR_this_ID = VAR_this_ID==255?0:255; } // 255-all / 0-one if(TIM_Button_A==0 && TIM_Button_B >0){VAR_this_ID = VAR_this_ID==255?0:255; } // 255-all / 0-one if(TIM_Button_A >0 && TIM_Button_B >0){VAR_mode_MENU = VAR_this_ID==255?42:43; } // выбрать текущий пункт меню break;
// case 42: /* 3 уровень меню – удалить ID */ это удаление всех ID с надписью Please wait …
// без реакции на нажатие кнопок //
// case 43: /* 4 уровень меню – удалить ID */ это поиск ID с надписью Please wait …
// без реакции на нажатие кнопок case 44: /* 5 уровень меню – удалить ID */ if(TIM_Button_A >0 && TIM_Button_B==0){VAR_this_ID -= VAR_this_ID>0?1:0; } // уменьшить ID по которому будет удалён отпечаток if(TIM_Button_A==0 && TIM_Button_B >0){VAR_this_ID += VAR_this_ID0 && TIM_Button_B >0){VAR_mode_MENU = 45; } // выбрать текущий пункт меню break;
// case 45: /* 6 уровень меню – удалить ID */ это удаление выбранного ID с надписью Please wait …
// без реакции на нажатие кнопок // case 99: /* 1 уровень меню – выйти из меню */ if(TIM_Button_A >0 && TIM_Button_B==0){VAR_mode_MENU = 40; } // перейти к предыдущему пункту меню if(TIM_Button_A==0 && TIM_Button_B >0){VAR_mode_MENU = 10; } // перейти к следующему пункту меню if(TIM_Button_A >0 && TIM_Button_B >0){VAR_mode_MENU = 0; } // выбрать текущий пункт меню break; } }
}
// функция вывода информации на дисплей
void Func_display_show(){ FLG_display_UPD=0; lcd.clear(); switch(VAR_mode_MENU){ case 0: /* вне меню */ lcd.setCursor(0, 0); lcd.print(F(“State: “)); lcd.print(FLG_state_WORK ? F(“ENABLE”) : F(“DISABLE”) ); lcd.setCursor(0, 1); lcd.print(F(“Access: “)); lcd.print(FLG_mode_ACCESS ? F(“OPENED”) : F(“CLOSED” ) ); break; case 1: /* замок открыт отпечатком */ lcd.setCursor(0, 0); lcd.print(F(“Found ID: “)); if(VAR_this_ID

Источник: https://lesson.iarduino.ru/page/urok-28-kontrol-dostupa-po-otpechatku-palca

Датчик отпечатков пальцев R307 и Arduino

Оптические датчики отпечатков пальцев обычно используются в системах безопасности. Эти сенсоры включают в себя DSP чип, который обрабатывает изображение, производит необходимые расчеты для обнаружения соответствия между записанными и текущими данными. Недорогие датчики отпечатка пальцев позволяют записать до 162 разных отпечатков пальцев!

Сенсор поставляется с софтом для Windows, что значительно облегчает его тестирование. С использованием родного софта можно даже отобразить фотографию вашего отпечатка на мониторе! Ну и самое замечательное – есть отдельная библиотека для Arduino, с использованием которой можно настроить датчик меньше чем за 10 минут.

Видео с кратким описанием на английском языке представлено ниже:

Технические характеристики датчика отпечатка пальца

  • Напряжение питания: 3.6 – 6.0 В (постоянный ток);
  • Рабочая сила тока: 120 мА;
  • Максиммальная сила тока: 150 мА;
  • Время обработки изображения отпечатка: < 1.0 секунды;
  • Размер окна: 14 мм x 18 мм;
  • Количество одновременно записываемых файлов: 162 файлов;
  • Уровень безопасности (от 1 до 5);
  • Интерфейс (подключение): TTL последовательный;
  • Скорость передачи данных (Baud rate): 9600, 19200, 28800, 38400, 57600 (по умолчанию 57600);
  • Рабочий диапазон температур: от -20 C до +50 C;
  • Допустимый уровень влажности: 40 % – 85 % RH;
  • Габаритные размеры: 56 x 20 x 21.5 мм;
  • Вес: 20 грамм.

Запись в память и поиск данных

При использовании датчика отпечатка пальцев есть два основных этапа. Сначала вам надо записать данные в память сенсора, то есть присвоить свой уникальный ID каждому отпечатку, который вы будете использовать для соавнения в дальнейшем. После записи данных, вы можете переходить к 'поиску', сравнивая текущее изображение отпечатка с теми, которые записаны в памяти датчика.

Для записи отпечатков пальцев можно использовать прилагающийся для Windows софт (самый легкий и удобный вариант, так как вы видите снимок, который сделан) или скетч для (актуально для тех, у кого не стоит Windows).

Запись новых отпечатков через программу для Windows

Как уже говорилось выше, самый простой путь записи новых данных в память оптического датчика отпечатков пальцев – программа для Windows. К сожалению, для других ОС программное обеспечение не предусмотрено.

Сначала надо подключить сенсор к компьютеру с помощью USB-to-serial конвертера. Загрузите 'blank sketch' на ваш Arduino (Uno или Mega):

// этот скетч дает вам возможность обойти чип Atmega

// и подключить датчик отпечатка пальца непосредственно к USB/Serial конвертеру

// Красный подключается к +5V

// Черный подключается к Ground

// белый подключается к Digital 0

// Зеленый подключается к Digital 1

void setup() {}

void loop() {}

Скетч “blank” не работает на Arduino с чипом ATmega32u4 (Leonardo и Micro). Для этих моделей используйте скетч Leo_passthru!

Если вы используете Leonardo, Micro, Yun, или другой контроллер на базе ATmega32U4, загрузите скетч Leo_passthru вместо скетча “blank”.

//Leo_passthru

// дает возможность Leonardo выполнять роль моста между

// сенсором отпечатков пальцев и Windows.

// Красный подключается к +5V

// Черный подключается к Ground

// Зеленый подключается к Digital 0

// Белый подключается к Digital 1

void setup() {

Serial1.begin(57600);

Serial.begin(57600);

}

void loop()

{

while (Serial.available())

Serial1.write(Serial.read());

while (Serial1.available())

Serial.write(Serial1.read());

}

Датчик отпечатка пальца подключается к Arduino в соответствии с комментариями в скетче после! Загрузки программы на Arduino.

Так как проводники на датчике тонкие и короткие, можно припаять их к отдельным рельсам контактов или просто нанести на концы припоя для надежного контакта с пинами микроконтроллера.

После подключения питания, красный светодиод начнет мигать, обозначая, что сенсор работает.

Запустите программу SFGDemo и выберите в меню пункт Open Device в левом углу. Выберите COM порт, к которому подключен ваш Arduino.

После выбора, нажмите OK. В результате должны отобразиться синяя надпись об успешном открытии устройства и некоторые данные об устройстве.

Вы можете изменить скорость передачи данных (baund rate) в нижнем левом углу и уровень безопасности (security level – насколько чувствительный датчик), но не рекомендуется трогать эти настройки, пока вы не убедитесь, что все работает.

По умолчанию скорость передачи данных равна 57600 baud, а уровень безопасности равен 3. Если установлены другие значения, установите их на приведенные выше.

Теперь давайте загрузим новый отпечаток пальца! Выберите пункт меню Preview и нажмите кнопку Enroll рядом с ним (Con Enroll значит 'Continuous' (без остановки). Удобная опция, если вы собираетесь записывать много отпечатков пальцев). Когда появится новое меню, укажите ID #, который вы хотите использовать. Вы можете использовать 162 ID номера.

Программа предложит вам приложить палец к сенсору:

Вы можете увидеть превью (если вы нажмете чекбокс preview) вашего отпечатка пальца.

После этого вам надо будет повторить процесс. Используйте тот же палец!

После успешного завершения, вы увидите сообщение:

Если снимок получился в плохом качестве, рекомендуется сделать еще один, чтобы сенсор в последствии отработал корректно.

Поиск изображения с помощью софта

После загрузки изображения желательно проверить, появилось ли оно в вашей базе данных. Нажмите кнопку Search справа.

Когда появится запрос, приложите другой/тот же палец к датчику отпечатка пальца.

Если это тот же палец, должно появится окно с ID #:

Если этого отпечатка нет в базе данных, появится окно с предупреждением:

Подключаем и используем датчик отпечатка пальца с Arduino

После проверки работоспособности, можно переходить к использованию сенсора со скетчем Arduino. Для этого надо перепрошить сенсор. Отключите зеленый и белый контакты и подключите зеленый проводник к контакту digital 2, а белый – к digital 3.

Эти пины можно изменить в дальнейшем, но на данном этапе лучше использовать именно их. На рисунке ниже показан пример подключения датчика отпечатков пальцев к Arduino. Осле подачи питания сенсор подмигнет красным светодиодом.

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

Для тех, кто использует Arduino Leonardo: Leonardo не поддерживает последовательный интерфейс на пинах 2 и 3. Используйте контакты 8 и 9 для подключения и не забудьте внести соответствующие изменения в скетч.

Для тех, кто использует Mega: Mega не поддерживает последовательный интерфейс на пинах 2 и 3. Используйте контакты 10 и 11 и внесите необходимые изменения в скетч.

После подключения, скачайте Adafruit-Fingerprint-Sensor-Library . Для тех, кто устанавливает дополнительные библиотеки впервые, есть полная инструкция по установке библиотек для Arduino.

После установки библиотеки, не забудьте перезагрузить Arduino IDE.

После перезагрузки вы сможете загрузить пример скетча File→Examples→Adafruit_Fingerprint→fingerprint. Загрузите этот скетч на ваш Arduino. Откройте окно серийного монитора, установив скорость передачи данных на 9600 baud и, когда появится запрос, прислоните палец к сенсору отпечатка пальца.

Вы должны увидеть примерно следующее:

Если вам нужен более детальный отчет, замените в пределах цикла loop() функцию getFingerprintIDez() на getFingerprintID(). Эта функция предоставит вам полный отчет о том, что именно сенсор определяет в каждый момент поиска.

Взаимодействие с Arduino

На данном этапе мы уже научились опознавать отпечаток пальца через с использованием Arduino скетча.

Этот процесс не настолько удобный и наглядный как использование софта для Windows, но вполне работоспособный.

Теперь откройте скетч File→Examples→Adafruit_Fingerprint→enroll и загрузите его на ваш Arduino. Подключение датчика отпечатков пальцев остается таким же как и в предыдущем пункте.

Когда вы откроете окно серийного монитора, вам будет предложено ввести ID, под которым будет записываться отпечаток пальца. Используйте строку в верхней части серийного монитора для ввода номера, под которым вы хотите сохранить изображение и нажмите Send.

После этого следуйте инструкциям. Когда загрузка пройдет успешно, отобразится надпись Stored!

После записи не забудьте провести поиск изображения, чтобы убедиться в успешности записи отпечатка пальца!

Источник: http://electronica52.in.ua/proekty-arduino/datchik-otpechatkov-palcev-i-arduino-

Сканер отпечатков пальцев с помощью Arduino UNO

Хотя вы можете получить доступ к защищенным системам через пароли и ключи, обе опции могут быть неудобными и легко забываемы. В этом уроке узнаем, как использовать модуль FPM10A с библиотекой Adafruit Arduino для создания биометрической системы отпечатков пальцев.

Что нам понадобится?

По традиции начинаем с комплектующих для нашего урока.

Детали

  • Модуль отпечатков пальцев FPM10A
  • Arduino Uno

FPM10A модуль для Ардуино

Библиотеки и ПО

  • Arduino IDE
  • Adafruit Fingerprint Library

Схема соединения

Схема соединения модуля FPM10A и Ардуино Уно нужно соединить вместе как на рисунке выше. Подробнее мы остановимся на следующем шаге.

Подключаем комплектующие

Начать работать с этим модулем невероятно просто из-за того, что он использует последовательный порт для связи.

Однако, поскольку у Arduino Uno только один аппаратный последовательный порт, вам необходимо использовать последовательный порт через программное обеспечение, используя контакты 2 и 3, чтобы общаться с модулем отпечатков пальцев (серийный порт аппаратного обеспечения зарезервирован для связи с ПК).

Ленточный кабель, который поставляется вместе с модулем FPM10A, является не очень удобным для хобби, так провода сидят в корпусе с шагом 1,27 мм, поэтому мы отрезали с одной стороны, а затем провода подключили к перемычкам.

Установка и использование библиотеки

Первым шагом в использовании FPM10A является установка библиотеки Fingerprint от Adafruit, которая может быть выполнена с помощью Менеджера библиотек. Откройте Arduino IDE и перейдите в:

Sketch → Include Library → Manage Libraries (Управление библиотеками)

Когда менеджер библиотек загружает поиск по “Fingerprint”, то первым результатом должна быть библиотека “отпечатков пальцев” от Adafruit. Установите её.

После установки библиотеки пришло время создать новый проект Ардуино. Нажмите Файл → Создать, а затем сохраните проект в своей собственной папке. На этом этапе откройте папку проекта и скопируйте в нее файл «fingerprint.h».

Это специальный файл заголовок, который был написан для того, чтобы сделать библиотеку отпечатков пальцев более легкой в использовании. Файл заголовка имеет только три функции:

  • fingerprint_setup () – конфигурирует последовательный порт для 9600 бод и подключается к модулю;
  • readFingerprint () – функция опроса, которая возвращает -1, если что-то пошло не так, или возвращает информацию о том, что найден успешный отпечаток
  • enrollFingerprint (int id) – добавляет отпечаток в систему с присвоенным идентификатором «id».

Чтобы включить этот файл в свой проект, просто используйте команду include, как показано ниже:

Первой функцией, которую необходимо вызвать в setup (), является fingerprint_setup (), которая автоматически соединяется с модулем и подтверждает, что все работает.

void setup(){  fingerprint_setup();}

Чтобы добавить новый отпечаток, вызовите функцию enrollFingerprint (id).

Это приведет к возврату -1, если произойдет сбой. В противном случае значения указывают на успешную регистрацию отпечатков пальцев. Идентификатор передал этой функции ссылки на отсканированный отпечаток пальца, и каждый отпечаток имел уникальный идентификационный номер.

Код Ардуино

Итоговый скетч для нашей платы Ардуино вы можете скопировать ниже:

1234567891011121314151617181920 #include “fingerprint.h”void setup(){  fingerprint_setup();}void loop(){  // Create a new fingerprint entry  enrollFingerprint(0x01);  delay(1000);  // Request entry  Serial.println(”
USER LOGIN REQUEST…PLACE FINGER ONTO SENSOR  
“);  while(readFingerprint() == -1);  Serial.println(”
ACCESS GRANTED
“);  Serial.println(”
Fingerprint confidence : ” + String(confidence) + ”
“);    delay(3000);}

Принцип работы

Когда вы включите этот проект, он сначала попросит вас поместить палец на сканер. Если сканер способен считывать ваши отпечатки пальцев, он попросит вас удалить и затем заменить палец на сканер. Это должно привести к тому, что сканер успешно добавит ваш отпечаток пальца в ID 1, а перенос пальца на сканер должен привести к доступу системы.

Этот проект можно легко расширить, включив блокировки и реле соленоида, чтобы разрешить авторизованным пользователям вносить изменения и разблокировать систему. Как только ваш проект будет готов, – установите новый сканер в двери, шкафы, сейфы, окна, электрические системы, компьютеры и многое другое!

Больше интересного ↓

Источник: https://ArduinoPlus.ru/skaner-otpechatkov-palcev-arduino/

Биометрический замок для авто | Каталог самоделок

В продолжении темы о модулях Arduino хочется предложить интересный проект, связанный биометрией. Собрав описываемое устройство, можно установить необычную систему безопасности автомобиля, работающую по принципу сканирования отпечатков пальцев. Данная схема еще раз доказывает многофункциональность возможностей Arduino.

Принцип работы охранного устройства на Arduino

Основное соединение — проводник IG замка зажигания. По нему поступает питающее напряжение на регулятор напряжения и далее по цепи на блок Ардуино, который активирует биометрический датчик. При совпадении отпечатка пальца микроконтроллер подает разрешающий сигнал на блок реле, который управляет реле стартера.

Таким образом, двигатель автомобиля можно завести.

Ровно через десять секунд происходит отключение датчика и для его повторного включения необходимо повторить цикл запуска зажигания.

Если же за десять секунд система не смогла распознать отпечаток пальца или же он не совпадает с заданным образцом, устройство автоматически выключается. Запуск двигателя при этом становится не возможным.

Используемые компоненты

Для того, чтобы сделать охранное устройство по отпечатку пальца, нужно приобрести следующее:

  • Модуль Areduino Uno 1 шт.

ArduinoUno

  • Биометрический сенсор для считывания отпечатка пальцев.

Сенсорный датчикРегулируемый источник питанияБлок реле

  • Биполярный транзистор NPN-типа ВС 547 или подобный. Следует отметить, что в данном случае, цоколевка не критична, поэтому при подборе аналога, следует основываться лишь характеристиками.

Транзистор BC547B

Сборка и программирование

Принципиальная схема устройства показана на рисунке ниже. Здесь отсутствуют какие-либо детали, требующие глубоких знаний.

Прошивка контроллера осуществляется при помощи стандартного интерфейса Arduino IDE и специальной библиотеки Adafruit fingerprint, которую нужно добавлять дополнительно. Кроме всего, необходимо подключение blank.ino. Эта операция выполняется при помощи команд File – Adafruit – Fingerprint — Sensor-Library-Master – blank.

Для загрузки эталонного отпечатка пальца, по которому впоследствии будет производиться сравнение, требуется скачать и установить бесплатную программу SFG Demo, актуальная версия которой всегда находится на официальном сайте Adafrut. Инструкцию можно посмотреть здесь.

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

Устанавливают готовое устройство под приборную панель автомобиля, размещая сенсор в удобном свободном месте.

При подсоединении всех проводов следует избегать короткого замыкания на корпус. Перед первым пробным включением смонтированной «секретки», желательно несколько раз проверить правильность предыдущих действий и соответствие с предложенной схемой.

Примечание

Нельзя быть полностью уверенным в надежности практического применения подобного охранного устройства. Данный проект был разработан исключительно в целях более глубокого изучения микроконтроллеров Arduino. Рекомендуется использовать схему в качестве одной из комплекса мер защиты автомобиля от несанкционированного доступа злоумышленников.

Прикрепленные файлы: СКАЧАТЬ 

Источник: https://volt-index.ru/high-tech/arduino/ohrannoe-ustroystvo-avtomobilya-po-otpechatku-paltsa-svoimi-rukami.html

Противоугонное устройство на микроконтроллере семейства Х51

» Схемы » Авто · Безопасность

21-08-2007

Фрунзе А. В.
Микроконтроллеры? Это же просто.

Практические примеры разработки устройств на МК Х51Наше знакомство с микроконтроллерами было бы неполным, если бы мы не ознакомились с несколькими примерами полностью законченных разработок. На этих примерах мы должны научиться проводить весь цикл разработки, с прорисовкой блок.

схемы как всей разрабатываемой программы, так и отдельных подпрограмм, с написанием их текстов и т. д. Я предлагаю вашему вниманию несколько примеров разной степени сложности, как говорится, на разный вкус. Их назначение — не только показать вам, как это делается, но и создать основу для ваших самостоятельных разработок.

Думаю, что приведенных примеров будет вполне достаточно, что-бы вы смогли выбрать из них тот, который максимально близок к стоящей перед вами задаче.

Противоугонное устройство на микроконтроллере семейства Х51

Несмотря на обилие появившихся в последние годы противоугонных систем (Alligator, Mоngoose и т. д.), интерес к простым противоугонным системам не пропал. Причина проста — потенциальные угонщики хорошо знают промышленные системы, их уязвимые места, типичные ошибки при их установке и в состоянии угнать машину даже несмотря на функционирующую противоугонку.

Конечно, не бывает систем защиты, с которыми не смог бы справиться подготовленный специалист-угонщик. Но если противостоящая система ему незнакома, вероятность ее взлома резко падает. С этой точки зрения самодельные системы, выполненные в единичных экземплярах и известные, чаще всего, только изготовившим их авторам, весьма эффективны.

Одна из идей состоит в том, чтобы установленная в режим охраны противоугонка никак себя внешне не проявляла, ее включение/отключение осуществлялось бы штатными средствами (т. е. теми, которые обычно установлены на автомобиле в момент его продажи), а ее действие не вписывалось бы в типичные алгоритмы действия подобных систем.

Этим требованиям во многом удовлетворяет устройство, схема которого приведена на pис. Его включение/отключение осуществляется штатным выключателем из тех, которыми включается вентилятор обогрева, ближний свет и т.д.

При этом, однако, спустя несколько секунд после запуска автомобиля, когда «противоугонка» отключится, этот выключатель можно вернуть в исходное положение — не будешь же ездить с постоянно включенными фарами или отопителем.

Основой устройства является микроконтроллер DD1 (AT89C2051 фирмы Atmel).

Требуемые для DD1 5 В формирует стабилизатор DA1 (КРЕН5А), резистор R1 ограничивает на безопасном уровне протекающий через него ток. Один из выводов контроллера (в данном случае Р1.5) сконфигурирован как выход, он управляет транзистором VT1 (КГ815А), в коллекторной цепи которого находится обмотка реле К1, разрывающего цепь зажигания. Выводы Р1.6 и Р1.

7 являются входами, на них поступают ограниченные диодными ограничителями напряжения, возбуждающие бобину зажигания и (в нашем случае) включающие вентилятор отопителя Rн. К аккумуляторной батарее АБ устройство подключено постоянно. Остальные его элементы очевидны и не требуют пояснения.

Читать далее статью в полном обьеме (pdf)

Источник: https://www.rlocman.ru/shem/schematics.html?di=32573

Ардуино: оптический датчик препятствия

Каждый робот, способный ездить, летать или плавать, должен видеть препятствия, находящиеся у него на пути. Чтобы робот смог это сделать, ему необходимы соответствующие датчики. В английской литературе такие устройства называют proximity sensor, мы же их будем называть датчиками препятствия.

На этом уроке мы рассмотрим один из самых распространенных датчиков препятствия, который работает по принципу отражения. Устроен он очень просто. Датчик содержит направленный источник света и детектор света. Источником часто служит инфракрасный светодиод с линзой, а детектором — фотодиод или фототранзистор.

Светодиод на датчике постоянно включен и излучает узкий пучок света в прямом направлении. Если перед датчиком есть препятствие (рисунок А), то на детектор попадает отраженный свет от источника, и на выходе датчика появляется положительный импульс.

В противном случае, если препятствия нет, то датчик молчит (рисунок Б). Есть и третий вариант, когда препятствие есть, но свет от него не отражается! На рисунке В изображен как раз такой случай. Получается, матовую черную поверхность робот не увидит.

1. Подключение

Будем подключать самый простой датчик с цифровым выходом. Принципиальная схема подключения к выводам Ардуино Уно:

Внешний вид макета

2. Настройка чувствительности

Как известно, вокруг нас имеется множество источников инфракрасного излучения, включая лампы освещения и солнце. Фоточувствительный элемент датчика регистрирует это фоновое излучение, и может дать ложный сигнал срабатывания. Другими словами, датчик препятствия может сработать, когда никакого препятствия и нет вовсе.

Чтобы решить эту проблему, на датчике имеется возможность настроить чувствительность таким образом, чтобы воспринимать только свет достаточной силы. Обычно это реализуется с помощью компаратора — электронного устройства, позволяющего сравнивать два уровня напряжения.

Одно напряжение подается на компаратор с фотодиода, а другое с делителя напряжения на основе потенциометра. Второе напряжение будем называть пороговым.

Теперь датчик даст положительный сигнал только тогда, когда напряжение на фотодиоде станет больше, чем настроенное нами.

Для настройки порогового напряжения нам понадобится шлицевая отвертка (она же — плоская). В этой процедуре нам также поможет зеленый светодиод состояния, который загорается когда датчик регистрирует достаточный уровень инфракрасного света. Алгоритм настройки сводится к трем шагам:

  • помещаем датчик в условия освещенности, в которых он будет работать;
  • подключаем датчик к питанию, при этом на нем загорится красный светодиод;
  • убираем перед датчиком все препятствия, и крутим потенциометр до тех пор, пока зеленый светодиод состояния не погаснет.

Для проверки поднесем к датчику ладонь, и на определенном расстоянии загорится зеленый светодиод. Уберем руку — светодиод погаснет. Расстояние на котором датчик регистрирует препятствие зависит от уровня фоновой засветки, от настройки чувствительности и от правильного расположения фотодиода и светодиода на датчике. Они должны быть расположены строго параллельно  друг другу.

Теперь, когда датчик настроен должным образом, приступим к составлению программы.

3. Программа

Для примера, будем зажигать и гасить штатный светодиод №13 на Ардуино Уно, в зависимости от показаний датчика.

При использовании цифрового датчика, программа будет такой же, как и в случае работы с кнопками.

На каждой итерации цикла loop мы считываем значение на выводе №2, и затем сравниваем это значение с уровнем HIGH.

Если значение равно HIGH, значит датчик видит препятствие, и мы зажигаем светодиод на выводе №13. В противном случае — гасим светодиод.

const int prx_pin = 2; const int led_pin = 13; byte v; void setup() { pinMode(prx_pin, INPUT); pinMode(led_pin, OUTPUT); } void loop() { v = digitalRead( prx_pin ); if( v == HIGH ) digitalWrite( led_pin, HIGH ); else digitalWrite( led_pin, LOW ); }

4. Пример использования

Попробуем теперь применить цифровой датчик по прямому назначению. Заставим двухколесного робота реагировать на показания двух датчиков, размещенных слева и справа.

Сделаем так, чтобы при обнаружении препятствия робот отворачивал от него в противоположную сторону, а затем продолжал движение вперед. Оформим программу в виде блок-схемы процедуры loop.

Задания

Если все получилось, попробуйте выполнить еще несколько заданий с роботом.

  1. Направить датчики препятствия вниз, чтобы робот смог чувствовать край стола. Написать программу, которая предотвращает падение робота со стола.
  2. Снова направить датчики вниз, но на этот раз для другой цели. Как мы выяснили, датчик может отличить черную поверхность от белой. Воспользуйтесь этим свойством, чтобы сделать робота-следопыта (он же LineFollower).
  3. Направить датчики в стороны, и заставить робота двигаться вдоль стены.

Заключение

На следующем уроке мы познакомимся с датчиком, который устроен практически так же, но больше подходит для детектирования черных и белых поверхностей. Попробуем считывать уже не цифровой, а аналоговый сигнал датчика, чтобы сделать более совершенного робота-следопыта.

Изменено: 30 Май, 2016 13:53

Источник: http://robotclass.ru/tutorials/arduino-proximity-sensor/

Простая реализация сигнализации с помощью Arduino и лазера

Источник: http://gm-project.ucoz.com/publ/moi_proekty_i_mysli/prostaja_realizacija_signalizacii_s_pomoshhju_arduino_i_lazera/1-1-0-10

Домашняя сигнализация на Arduino

Здравствуй, дорогой читатель! Сегодняшняя статья посвящена созданию простой домашней системы безопасности, при помощи доступных компонентов. Это маленькое и дешёвое устройство поможет тебе защитить ваше жилище от проникновения при помощи Arduino, датчика движения, дисплея и динамика. Питаться устройство сможет от батарейки или USB-порта компьютера.

Итак, начнём!

Как оно работает?

Тела теплокровных излучают в ИК-диапазоне, который невидим для человеческих глаз, однако может быть обнаружен при помощи датчиков. Такие датчики делаются из материала, который под воздействием тепла может спонтанно поляризоваться, благодаря чему это позволяет определить появления источников тепла в радиусе действия датчика.

Для более широкого радиуса действия используют линзы Френеля, которые собирают ИК-излучение с разных направлений и концентрируют его на самом датчике.

На рисунке видно, как линза искажает лучи, которые падают на неё.

Стоит отметить, что роботы без особо греющихся частей и хладнокровные излучают в ИК-диапазоне очень слабо, поэтому датчик может не сработать в случае, если тебя решат обнести сотрудники Boston Dynamics или рептилоиды.

Когда происходит изменение уровня ИК излучения в диапазоне действия, это будет обрабатываться на Arduino после чего на LCD дисплее будет выводится статус, светодиод будет мигать, а спикер пищать.

Что нам потребуется?

Кстати, если не хочется покупать все эти детали по отдельности – рекомендуем обратить внимание на наши стартовые наборы. К примеру, всё необходимое и даже больше есть в нашем стартовом наборе Кавасаки-2.

Подключаем!

Подключение датчика движения очень простое:

  1. Пин Vcc подключаем к 5V Ардуино.
  2. Пин Gnd подключаем к GND Ардуино.
  3. Пин OUT подключаем к цифровому пину №7 от Arduino

Теперь присоединим светодиод и спикер. Тут всё так же просто:

  1. Короткую ножку (минус) светодиода подключаем к земле
  2. Длинную ножку (плюс) светодиода подключаем к выходу №13 Arduino
  3. Красный провод спикера к выходу №10
  4. Чёрный провод – к земле

И теперь самое сложное – подключение LCD дисплея 1602 к Arduino. Дисплей у нас без I2C, поэтому потребуется много выходов Arduino, но результат будет того стоить. Схема представлена ниже:

Нам нужна только часть схемы (у нас не будет регулировки контраста потенциометром). Поэтому требуется сделать лишь следующие:

Идея создания сигнализации возникла еще давно, когда мне было лет 13-14. Мы тогда, с моим младшим братом, любили допоздна играть в компьютер. И конечно же, родители нас постоянно за это ругали. И вот чтобы такого не происходило, мы решили сделать какую-нибудь “штучку”.

Идея была проста: когда кто-нибудь приближался к нашей комнате, эта самая “штучка” нам “сообщала” об этом, и мы спокойно притворялись спящими. Все это было реализовано очень просто: обычная схема подключения лампочки через ключ. Сам ключ был сделан из небольшой картонки, сложенной пополам. На краях картонки были приклеены 2 куска фольги.

И уже к фольгам были прикреплены провода. Вся эта конструкция подкладывалась под ковер, и когда кто-то наступал, картонка складывалась, и провода (ключ) замыкался. И в это время в нашей комнате загоралась лампочка. После этого, насмотревшись фильмов про агентов и прочее, были попытки использовать лазер и солнечную батарею.

Но это все не увенчалось успехом..    

Прошло немало времени. Многое изменилось, а вот детское желание, сделать что-то подобное, осталось. Решение использовать в этом деле лазер, после стольких лет, не отпало.

Но уже вместо приемника было решено использовать фоторезистор (резистор, сопротивление которого зависит от яркости света, падающего на него). Вся идея была реализована на Arduino. И состояла в следующем: с одной стороны дверного проема располагается лазер, напротив него находится фотоэлемент, который подключен к Arduino.

Лазер светит, а значит на фоторезистор попадает свет. Если кто-нибудь пересекает луч, то сопротивление увеличивается. И контроллер это замечает и происходит какое-либо действие. Например загорается светодиод, включается звуковая сигнализация и т.д. 

Процесс реализации:

Для начала был куплен обычный детский лазер и фоторезистор. 

И так, когда лазер у нас разобран, отпаиваем кнопку (при желании можно ее оставить), продеваем в отверстие на корпусе провода. И припаиваем их к контактам от кнопки. Не перегревайте схему!

Собираем все в обратном порядке. При желании, на конце провода можно поставить тумблер (ключ), я же для проверки использовал обычную перемычку. Вот что получилось:

Далее переходим к подключению всех элементов к Arduino. Подключаем наш фоторезистор к контроллеру по схеме ниже. Эта схема делителя напряжения. Резистор брался на 10кОм.

Подключаем Arduino к компьютеру и заливаем скетч. 

#define foto 0 //Фотоэлемент подключен к пину 0 (аналоговый вход)
void setup()
{ Serial.begin(9600);
}
void loop()
{ Serial.println(analogRead(foto)); //Выводим на монитор последовательного порта значения с фоторезистора delay(20);
}

Закрепляем датчик и лазер друг напротив друга, так, чтобы луч с лазера светил прямо на фоторезистор. 

Далее в Arduino IDE открываем “монитор последовательного порта” (кнопка в виде лупы на верхней панели справа). И смотрим какие значения у нас выводятся. У меня эти значения колебались от 940 до 970 где-то. Самое минимальное было 940.

Поэтому в следующем скетче я использовал пороговое значение 930. Теперь надо как-то сигнализировать о том, что кто-то прошел через наш луч, для этого будем использовать светодиод (СД), подключенный к 5 пину.

В Arduinо заливаем новый скетч:

#define foto 0 //Фотоэлемент подключен к пину 0 (аналоговый вход)
#define led 5 //светодиод подключен к 5 пину
void setup()
{ Serial.begin(9600); pinMode(led, OUTPUT); }
void loop()
{ if (analogRead(foto) < 930) //Если текущее значение меньше порогового { for (int i=0 ; i < 10 ; i++) { digitalWrite(led , HIGH); delay(500); digitalWrite(led , LOW); delay(500); } } else digitalWrite(led , LOW); }

Получается следующее. Наше значения колеблются от 940 и более. Если вдруг кто-то прерывает наш луч, то значение моментально падает, и контроллер воспринимает это.

И так, кто-то прошел, сразу начинает мигать СД. Чтобы мы случайно этот момент не пропустили, светодиод будет моргать 10 раз, не зависимо от того, проходит ли кто-то в данный момент, или же нет.

Если никто луч не прерывал – СД будет выключен.  

Видео работы (не обращайте внимание на транзистор, остался с предыдущего эксперимента):

Мысли и идеи по данной теме:

Очень много всего можно сделать на базе данной системы. Первое, что приходит в голову, это включать лазер не в ручную, а например тем же Arduino, используя транзисторный ключ, ну или реле.

Можно реализовать настоящую охранную систему: имеется кнопка, нажав на нее, вы включаете охрану, нажав еще раз – отключаете. Представьте если таких датчиков несколько, по одному на каждое помещение в доме.

Вы сможете контролировать перемещение человека, в зависимости от того какой из датчиков был задет.

Сделав небольшую карту помещения и написав правильно программу, можно будет без труда отслеживать любые движения. Вот например на этом плане квартиры, красным обозначается та комната, в которой было замечено движение. 

Еще одна идея заключается в уменьшении количества проводов. Берем план помещения и помещаем датчики в каждом проеме, а само Arduino располагаем в левом нижнем углу. Представляете сколько проводов понадобится, чтобы контролировать все датчики и управлять всеми лазерами? Правильно! Поэтому лучше будет использовать беспроводное подключение датчиков с главным Arduino.

Осуществить это можно так: разбиваем датчики на группы. Группа – несколько датчиков, расположенных на небольшом расстоянии друг от друга. И подключенных к промежуточному Arduino, который в свою очередь подключается через Bluetoth с главным, передавая ему все данные. И в итоге мы получаем целую сеть датчиков, через которые очень трудно будет пройти незамеченным.

 

Вот и все, что хотелось бы рассказать по поводу сигнализации на основе лазера. Надеюсь тема была вам полезна. Все интересующие вас вопросы и пожелания, вы можете оставить в комментариях или же на форуме.

Если Вам понравилась наша статья, поделитесь ею с друзьями.

Пин дисплея

Пин Arduino

RS

12

Enable

11

D4

5

D5

4

D6

3

D7

2

Теперь ты знаешь, как подключить дисплей 1602 к Arduino UNO R3 (ровно как и к любой версии Arduino от Mini до Mega).

Программируем

Пришло время перейти к программированию. Ниже представлен код, который надо лишь залить и, если вы собрали всё верно – устройство готово!

#include int ledPin = 13; // Пин светодиода int inputPin = 7; // Пин, к которому подключен Out датчика движения int pirState = LOW; // Текущее состояние (в начале ничего не обнаружено) int val = 0; // Переменная для чтения состояния цифровых входов int pinSpeaker = 10; // Пин, к которому подключен динамик. Требуется использовать пин с ШИМ (PWM) LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Инициалиация LCD дисплея void setup() { // Определение направления передачи данных на цифровых пинах pinMode(ledPin, OUTPUT); pinMode(inputPin, INPUT); pinMode(pinSpeaker, OUTPUT); // Запуск вывода отладочной информации через последовательный порт Serial.begin(9600); // Запуск вывода на LCD дисплей lcd.begin(16, 2); // Устанавливаем индекс на дисплеи, с которого начнём вывод // (2 символ, 0 строки) lcd.setCursor(2, 0); // Вывод на LCD дисплей lcd.print(“P.I.R Motion”); // Снова перемещаем lcd.setCursor(5, 1); // Выводим lcd.print(“Sensor”); // Пауза, чтобы успели прочитать, что вывели delay(5000); // Очистка lcd.clear(); // Аналогично lcd.setCursor(0, 0); lcd.print(“Processing Data.”); delay(3000); lcd.clear(); lcd.setCursor(3, 0); lcd.print(“Waiting For”); lcd.setCursor(3, 1); lcd.print(“Motion….”); } void loop() { // Считываем показание датчика val = digitalRead(inputPin); if (val == HIGH) { // Если есть движение, то зажигаем светодиод и включаем сирену digitalWrite(ledPin, HIGH); playTone(300, 300); delay(150); // Если движения до данного момента не было, то выводим сообщение // что оно обнаружено // Код ниже нужен для того, чтобы писать лишь смену состояния, а не каждый раз выводить значение if (pirState == LOW) { Serial.println(“Motion detected!”); lcd.clear(); lcd.setCursor(0, 0); lcd.print(“Motion Detected!”); pirState = HIGH; } } else { // Если движене закончилось digitalWrite(ledPin, LOW); playTone(0, 0); delay(300); if (pirState == HIGH){ // Сообщаем, что движение было, но уже закончилось Serial.println(“Motion ended!”); lcd.clear(); lcd.setCursor(3, 0); lcd.print(“Waiting For”); lcd.setCursor(3, 1); lcd.print(“Motion….”); pirState = LOW; } } } // Функция воспроизведения звука. Duration (длительность )- в миллисекундах, Freq (частота) – в Гц void playTone(long duration, int freq) { duration *= 1000; int period = (1.0 / freq) * 100000; long elapsed_time = 0; while (elapsed_time < duration) { digitalWrite(pinSpeaker,HIGH); delayMicroseconds(period / 2); digitalWrite(pinSpeaker, LOW); delayMicroseconds(period / 2); elapsed_time += (period); } }

Заключение

Итоговая схема представлена на рисунке:

На ней Arduino уже запитана от батарейки 9V, а не от USB порта.

Источники

Источник: https://tpai.ru/blog/stati/domashnyaya-signalizaciya-ili-ispolzovanie-datchika-dvizheniya-i-lcd-monitora-s-arduino

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}