Необычный кодовый замок на arduino

Автоматический “умный” замок и Arduino

Прогресс не стоит на месте и “Умные замки” все чаще появляются на дверях квартир, гаражей и домов.

Открывается подобный замок при нажатии на кнопку на смартфоне. Благо, смартфоны и планшеты уже вошли в наш обиход. В некоторых случаях, “умные замки” подключают к “облачным сервисам” вроде гугл диска и открывают удаленно. Кроме того, подобный вариант дает возможность давать доступ к открытию двери другим людям.

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

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

Подобный замок может стать отличным первым шагом в проекте вашего “Умного дома”.

Настройка датчика отпечатка пальца

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

Начнем с подключения питания:

  • Подключите контакт 5V с платы Arduino к красной рельсе питания;
  • Контакт GND с Arduino подключается к синей рельсе на беспаечной монтажной плате.

Переходим к подключению датчика отпечатка пальца:

  • Сначала подключите питание. Для этого красный провод соединяется с рельсой +5 V, а черный – с рельсой GND;
  • Белый провод датчика подключается к контакту 4 на Arduino.
  • Зеленый провод идет к контакту 3 на микроконтроллере.

Теперь займемся модулем CC3000:

  • Контакт IRQ с платы CC3000 подключаем к пину 2 на Arduino.
  • VBAT – к контакту 5.
  • CS – к контакту 10.
  • После этого надо подключить SPI контакты к Arduino: MOSI, MISO и CLK – к контактам 11, 12 и 13 соответственно.

Ну и в конце надо обеспечить питание: Vin – к Arduino 5V (красная рельса на вашей монтажной плате), а GND к GND (синяя рельса на макетке).

Фотография полностью собранного проекта показана ниже:

Перед разработкой скетча, который будет подгружать данные на Adafruit IO, надо передать данные о вашем отпечатке пальца сенсору. Иначе в дальнейшем он вас не опознает ;).

Рекомендуем откалибровать датчик отпечатка пальца, используя Arduino отдельно.

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

Если вы еще не сделали этого, то заведите аккаунт на Adafruit IO.

После этого можем перейти к следующему этапу разработки “умного замка” на Arduino: а именно, разработка скетча, который будет передавать данные на Adafruit IO. Так как программа достаточно объемная, в статье мы выделим и рассмотрим только ее основные части, а после дадим ссылку на GitHub, где вы сможете скачать полный скетч.

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

#include

#include

#include

#include “Adafruit_MQTT.h”

#include “Adafruit_MQTT_CC3000.h”

#include

#include >

После этого надо немного подкорректировать скетч, вставив параметры вашей WiFi сети, указав SSID и пароль (password):

#define WLAN_SSID “ваш_wifi_ssid”

#define WLAN_PASS “ваш_wifi_пароль”

#define WLAN_SECURITY WLAN_SEC_WPA2>

Кроме этого, необходимо ввести имя и AIO ключ (key) для входа в ваш аккаунт Adafruit IO:

#define AIO_SERVER “io.adafruit.com”

#define AIO_SERVERPORT 1883

#define AIO_USERNAME “adafruit_io_имя”

#define AIO_KEY “adafruit_io_ключ”>

Следующие строки отвечают за взаимодействие и обработку данных с датчика отпечатка пальца. Если датчик был активирован (отпечаток совпал), будет '1':

const char FINGERPRINT_FEED[] PROGMEM = AIO_USERNAME “/feeds/fingerprint”;

Adafruit_MQTT_Publish fingerprint = Adafruit_MQTT_Publish(&mqtt, FINGERPRINT_FEED);

Кроме того, надо создать экземпляр объекта SoftwareSerial для нашего сенсора:

SoftwareSerial mySerial(3, 4);

После этого мы можем создать объект для нашего сенсора:

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

Внутри скетча мы указываем какой fingerID должен активировать замок в дальнейшем. В данном примере используется 0, который соответствует ID первого отпечатка пальцев, который используется датчиком:

После этого инициализируем счетчик и задержку (delay) в нашем проекте. По сути мы хотим, чтобы замок автоматически срабатывал после открытия. В данном примере используется задержка в 10 секунд, но вы можете подстроить это значение под собственные потребности:

int activationCounter = 0;

int lastActivation = 0;

int activationTime = 10 * 1000;

В теле функции setup() мы инициализируем датчик отпечатка пальцев и обеспечиваем подключение чипа CC3000 к вашей WiFi сети.

В теле функции loop() подключаемся к Adafruit IO. За это отвечает следующая строка:

После подключения к платформе Adafruit IO, проверяем последний отпечаток пальца. Если он совпадает, а замок не активирован, мы отсылаем '1' для обработки в Adafruit IO:

if (fingerprintID == fingerID && lockState == false) {

Serial.println(F(“Access granted!”));

lockState = true;

state = 1;

if (! fingerprint.publish(state)) {

Serial.println(F(“Failed”));

} else {

Serial.println(F(“OK!”));

}

lastActivation = millis();

}

Если же в пределах функции loop() замок активирован и мы достигли значения задержки, которое указывали выше, отсылаем '0':

if ((activationCounter – lastActivation > activationTime) && lockState == true) {

lockState = false;

state = 0;

if (! fingerprint.publish(state)) {

Serial.println(F(“Failed”));

} else {

Serial.println(F(“OK!”));

}

}

Последнюю версию кода вы можете скачать на GitHub.

Пришло время тестировать наш проект! Не забудьте скачать и установить все необходимые библиотеки для Arduino!

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

Когда Arduino подключится к WiFi сети, сенсор отпечатка пальца начнет мигать красным цветом. Прислоните палец к датчику. В окне серийного монитора должен отобразится ID номер. Если он совпадет, появится сообщение, 'OK!'. Это значит, что данные были отправлены на сервера Adafruit IO.

Схема и скетч для дальнейшей настройки замка на примере светодиода

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

Для подключения к беспроводной сети и активации/деактивации замка понадобится дополнительный модуль Adafruit ESP8266 (модуль ESP8266 не обязательно должен быть от Adafruit).

На примере, который рассмотрим ниже, вы сможете оценить насколько легко обеспечить обмен данными между двумя платформами (Arduino и ESP8266) с использованием Adafruit IO.

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

Схема достаточно простая: сначала установите ESP8266 на breadboard. После этого установите светодиод. Не забывайте, что длинная (позитивная) нога светодиода подключается через резистор. Вторая нога резистора подключается к контакту 5 на модуле ESP8266. Вторая (катод) светодиода подключаем к пину GND на ESP8266.

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

Теперь давайте разберемся со скетчем, который используем для этого проекта. Опять-таки, код достаточно объемный и сложный, поэтому мы рассмотрим только его основные части:

Начинаем с подключения необходимых библиотек:

#include

#include “Adafruit_MQTT.h”

#include “Adafruit_MQTT_Client.h”

Настраиваем параметры WiFi:

#define WLAN_SSID “ваш_wifi_ssid”

#define WLAN_PASS “ваш_wifi_пароль”

#define WLAN_SECURITY WLAN_SEC_WPA2

Также настраиваем параметры Adafruit IO. Так же, как и в предыдущем разделе:

#define AIO_SERVER “io.adafruit.com”

#define AIO_SERVERPORT 1883

#define AIO_USERNAME “adafruit_io_имя_пользователя”

#define AIO_KEY “adafruit_io_ключ”

Указываем, к какому пину мы подключили светодиод (в дальнейшем это будет наш замок или реле):

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

const char LOCK_FEED[] PROGMEM = AIO_USERNAME “/feeds/lock”;

Adafruit_MQTT_Subscribe lock = Adafruit_MQTT_Subscribe(&mqtt, LOCK_FEED);

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

pinMode(relayPin, OUTPUT);

В пределах цикла loop() сначала проверяем, подключились ли мы к Adafruit IO:

После этого проверяем, какой сигнал поступает. Если передается '1', активируем контакт, который мы объявили раньше, к которому подключен наш светодиод. Если мы получили '0', переводим контакт в состояние 'low':

Adafruit_MQTT_Subscribe *subscription;

while ((subscription = mqtt.readSubscription(1000))) {

if (subscription == &lock) {

Serial.print(F(“Got: “));

Serial.println((char *)lock.lastread);

// Сохраняем команду в данные типа строка

String command = String((char *)lock.lastread);

command.trim();

if (command == “0”) {

digitalWrite(relayPin, LOW);

}

if (command == “1”) {

digitalWrite(relayPin, HIGH);

}

}

}

Найти последнюю версию скетча вы можете на GitHub.

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

https://www.youtube.com/watch?v=B0Xr_iLC8iQ

Для программирования чипа ESP8266 можно использовать простой USB-FTDI конвертер.

Загрузите скетч на Arduino и откройте окно серийного монитора. На данном этапе мы просто проверили, удалось ли подключиться к Adafruit IO: доступный функционал мы рассмотрим дальше.

Тестируем проект

Теперь приступаем к тестированию! Перейдите в меню пользователя вашего Adafruit IO, в меню Feeds. Проверьте, созданы или нет каналы для отпечатка пальцев и замка (на принт-скрине ниже это строки fingerprint и lock):

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

Теперь нам надо обеспечить обмен данными между каналами fingerprint и lock. Канал lock должен принимать значение '1', когда канал fingerprint принимает значение '1' и наоборот.

Для этого используем очень мощный инструмент Adafruit IO: триггеры. Триггеры – это по-сути условия, которые вы можете применять к настроенным каналам. То есть, их можно использовать для взаимосвязи двух каналов.

Создаем новый reactive trigger из раздела Triggers в Adafruit IO. Это обеспечит возможность обмениваться данными между каналами датчика отпечатка пальцев и замка:

Вот как это должно выглядеть, когда оба триггера настроены:

Все! Теперь мы действительно можем тестить наш проект! Прикладываем палец к сенсору и видим как Arduino начал подмигивать светодиодом, который соответствует передаче данных. После этого должен начать мигать светодиод на модуле ESP8266. Это значит, что он начал получать данные через MQTT. Светодиод на монтажной плате в этот момент должен тоже включиться.

После задержки, которую вы установили в скетче (по умолчанию это значение равно 10 секундам), светодиод выключится. Поздравляем! Вы можете управлять светодиодом с помощью отпечатка пальца, находясь в любой точке мира!

Настраиваем электронный замок

Мы добрались до последней части проекта: непосредственное подключение и управление электронным замком с помощью Arduino и датчика отпечатка пальца. Проект непростой, вы можете использовать все исходники в том виде, в котором они изложены выше, но вместо светодиода подключить реле.

Для непосредственного подключения замка вам понадобятся дополнительные компоненты: источник питания на 12 В, джек для подключения питания, транзистор (в данном примере используется IRLB8721PbF MOSFET, но можно использовать и другой, например, биполярный транзистор TIP102. Если вы используете биполярный транзистор, вам надо будет добавить резистор.

Ниже показана электрическая схема подключения всех компонентов к модулю ESP8266:

Обратите внимание, что если вы используете MOSFET транзистор, вам не понадобится резистор между пином 5 модуля ESP8266 и транзистором.

Полностью собранный проект показан на фото ниже:

Запитайте модуль ESP8266 с использованием FTDI модуля и подключите источник питания 12 В к джеку. Если вы использовали рекомендованные выше пины для подключения, в скетче ничего менять не придется.

Теперь можете прислонить палец к сенсору: замок должен сработать, отреагировав на ваш отпечаток пальца. На видео ниже показан проект автоматического “умного” замка в действии:

Дальнейшее развитие проекта «Умный замок»

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

Можете смело экспериментировать, модифицировать скетч и обвязку. Например, можно заменить дверной электронный замок на реле для управления питанием вашего 3D принтера, манипулятора или квадрокоптера…

Можно развивать ваш “умный дом”. Например, удаленно активировать систему полива на Arduino или включать свет в комнате… При этом не забывайте, что вы одновременно можете активировать практически неограниченное количество устройств, используя Adafruit IO.

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!

Источник: http://arduino-diy.com/arduino-avtomaticheskiy-umnyy-zamok

Как сделать кодовый замок на Arduino

ПодробностиКатегория: ArduinoСоздано 29.11.2013 14:41Автор: Admin

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

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

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

Для того чтобы сделать кодовый замок нам понадобиться:

  • одна плата Arduino UNO, или другие платы;
  • клавиатура ввода данных;
  • нагрузка.

О том что такое Arduino было сказано ранее.

Принципиальна схема замка

“Строчные” линии R1-R4 подключены к выводам Arduino с 6-го по 9-й. Колонные выводы C1-C4 подключены к выводам C1-C4.

Третий вывод настроен как выход в цепь включена нагрузка, в нашем случае это светодиод D1, последовательно к которому подключено сопротивление номиналом в 330 Ом. Оно необходимо для ограничения тока через светодиод.

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

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

int p[6]; //array for storing the password int c[6]; // array for storing the input code int n; int a=0; int i=0; int lock=3; int r1=6; int r2=7; int r3=8; int r4=9; int c1=10; int c2=11; int c3=12; int c4=13; int colm1; int colm2; int colm3; int colm4; void setup() { pinMode(r1,OUTPUT); pinMode(r2,OUTPUT); pinMode(r3,OUTPUT); pinMode(r4,OUTPUT); pinMode(c1,INPUT); pinMode(c2,INPUT); pinMode(c3,INPUT); pinMode(c4,INPUT); pinMode(lock,OUTPUT); Serial.begin(9600); //sets the baud rate at 9600 digitalWrite(c1,HIGH); digitalWrite(c2,HIGH); digitalWrite(c3,HIGH); digitalWrite(c4,HIGH); digitalWrite(lock,LOW); p[0]=1; //sets 1st digit of the password p[1]=2; // sets 2nd digit of the password p[2]=3; // sets 3rd digit of the password p[3]=4; // sets 4th digit of the password p[4]=5; // sets 5th digit of the password p[5]=6; // sets 6th digit of the password } void loop() { digitalWrite(r1,LOW); digitalWrite(r2,HIGH); digitalWrite(r3,HIGH); digitalWrite(r4,HIGH); colm1=digitalRead(c1); colm2=digitalRead(c2); colm3=digitalRead(c3); colm4=digitalRead(c4); if(colm1==LOW) { n=1; a=1; Serial.println(“1”); delay(200);} else { if(colm2==LOW) { n=2; a=1; Serial.println(“2”); delay(200);} else { if(colm3==LOW) {Serial.println(“3”); n=3; a=1; delay(200);} else { if(colm4==LOW) {Serial.println(“LOCKED”); digitalWrite(lock,LOW); //locks i=0; delay(200);} }}} digitalWrite(r1,HIGH); digitalWrite(r2,LOW); digitalWrite(r3,HIGH); digitalWrite(r4,HIGH); colm1=digitalRead(c1); colm2=digitalRead(c2); colm3=digitalRead(c3); colm4=digitalRead(c4); if(colm1==LOW) {Serial.println(“4”); n=4; a=1; delay(200);} else { if(colm2==LOW) {Serial.println(“5”); n=5; a=1; delay(200);} else { if(colm3==LOW) {Serial.println(“6”); n=6; a=1; delay(200);} else { if(colm4==LOW) { if(c[0]==p[0]&&c[1]==p[1]&&c[2]==p[2]&&c[3]==p[3]&&c[4]==p[4]&&c[5]==p[5]) {digitalWrite(lock,HIGH); //unlocks Serial.println(“UNLOCKED”); c[5]=9;} //corrupts the code in array c else {Serial.println(“WRONG PASSWORD”);} delay(200);} }}} if(a==1) // test whether a digit key is pressed { c[i]=n; // saves the current digit pressed to array c i=i+1; a=0;} } 

 Как работает программа самодельного кодового замка

Наш пароль состоит из 6 цифр “123456” это значение храниться в массиве “p”. Введенные нами значения последовательно записываются в массив “c”. В коде программы происходит сравнение этих двух массивов,после того как будет нажата кнопка разблокировки. Если они совпадают то посылаем на вывод 3 “положительный сигнал”, а если не совпадают то “отрицательный”.

 Теперь вы знаете как сделать настоящий кодовый замок, и сохранить все ваше имущество!)

Источник: http://www.radio-magic.ru/arduino-projects/107-kodovji-zamok

Кодовой замок на Ардуино: подключение

Главная » Полезные советы » Хитрости электрика » Кодовой замок на Ардуино: подключение

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

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

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

Кодовой замок на Ардуино: принцип работы

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

Что нужно для сборки

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

  1. Пучок провод для бреборда, 30 штук будет более чем достаточно.
  2. Далее нужно купить две вилки и розетки RJ45.
  3. L293D.
  4. Актуатор центрального замка. Можно использовать с ВАЗа – это оптимально по цене и функциональности.
  5. Геркон – его можно взять со старого окна, здесь сложностей нет.
  6. Нам еще понадобиться блок питания от хаба D-LINK на 12 Вольт.
  7. Пульт управления от охранной сигнализации, его можно найти в любом магазине с электроникой.
  8. Arduino protoshield + breadboard.
  9. Arduino UNO.
  10. Также не обойтись без шпингалета. Он должен иметь внушительный размер, чтобы не сделать ошибку во время его выбора смотрите фото дальше.

Как правило, чтобы приобрести все эти детали, придется выложить 40-50 долларов. Вроде сумма небольшая, но решать вам, напрягаться с этим или установить уже рабочую модель. Чтобы установить и соединить между собой, придется потратить несколько часов при условии, если вы все будете делать правильно.

Программирование кодового замка

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

Процесс сборки: фото и видео

Изначально покажем вам несколько фото о том, как его собирать и устанавливать.

Вот так выглядит кодовой замок в сочетании с актуатором.

Подключаем блок питания.

Шпингалет, который и будет закрывать всю нашу конструкцию.

Как подключить кодовый замок Arduino: видео

Также читайте: как спрятать провода от компьютера.

Источник: http://vse-elektrichestvo.ru/poleznye-sovety/xitrosti-elektrika/kodovoj-zamok-na-arduino.html

Как сделать кодовый замок на Arduino

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

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

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

Для того чтобы сделать кодовый замок нам понадобиться:

  • одна плата Arduino UNO, или другие платы;
  • клавиатура ввода данных;
  • нагрузка.

О том что такое Arduino было сказано ранее.

Принципиальна схема замка

“Строчные” линии R1-R4 подключены к выводам Arduino с 6-го по 9-й. Колонные выводы C1-C4 подключены к выводам C1-C4.

Третий вывод настроен как выход в цепь включена нагрузка, в нашем случае это светодиод D1, последовательно к которому подключено сопротивление номиналом в 330 Ом. Оно необходимо для ограничения тока через светодиод.

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

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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 int p[6];int c[6];int n;int a=0;int i=0;int lock=3;int r1=6;int r2=7;int r3=8;int r4=9;int c1=10;int c2=11;int c3=12;int c4=13;int colm1;int colm2;int colm3;int colm4;void setup(){  pinMode(r1,OUTPUT);  pinMode(r2,OUTPUT);  pinMode(r3,OUTPUT);  pinMode(r4,OUTPUT);  pinMode(c1,INPUT);  pinMode(c2,INPUT);  pinMode(c3,INPUT);  pinMode(c4,INPUT);  pinMode(lock,OUTPUT);  Serial.begin(9600);    digitalWrite(c1,HIGH);  digitalWrite(c2,HIGH);  digitalWrite(c3,HIGH);  digitalWrite(c4,HIGH);  digitalWrite(lock,LOW);  p[0]=1;    p[1]=2;   p[2]=3;   p[3]=4;   p[4]=5;   p[5]=6; }void loop(){  digitalWrite(r1,LOW);  digitalWrite(r2,HIGH);  digitalWrite(r3,HIGH);  digitalWrite(r4,HIGH);  colm1=digitalRead(c1);  colm2=digitalRead(c2);  colm3=digitalRead(c3);  colm4=digitalRead(c4);  if(colm1==LOW)  { n=1;    a=1;    Serial.println(“1”);   delay(200);}  else  {   if(colm2==LOW)   { n=2;     a=1;     Serial.println(“2”);    delay(200);}   else   {   if(colm3==LOW)   {Serial.println(“3”);     n=3;     a=1;   delay(200);}   else   {   if(colm4==LOW)   {Serial.println(“LOCKED”);    digitalWrite(lock,LOW);     i=0;    delay(200);}   }}}  digitalWrite(r1,HIGH);  digitalWrite(r2,LOW);  digitalWrite(r3,HIGH);  digitalWrite(r4,HIGH);  colm1=digitalRead(c1);  colm2=digitalRead(c2);  colm3=digitalRead(c3);  colm4=digitalRead(c4);  if(colm1==LOW)  {Serial.println(“4”);   n=4;   a=1;  delay(200);}  else  {   if(colm2==LOW)   {Serial.println(“5”);    n=5;    a=1;  delay(200);}   else   {   if(colm3==LOW)   {Serial.println(“6”);      n=6;      a=1;    delay(200);}   else   {   if(colm4==LOW)   {    if(c[0]==p[0]&&c[1]==p[1]&&c[2]==p[2]&&c[3]==p[3]&&c[4]==p[4]&&c[5]==p[5])    {digitalWrite(lock,HIGH);     Serial.println(“UNLOCKED”);    c[5]=9;}          else   {Serial.println(“WRONG PASSWORD”);}   delay(200);}   }}}    if(a==1)    {    c[i]=n;    i=i+1;    a=0;}   } 

 Как работает программа самодельного кодового замка

Наш пароль состоит из 6 цифр “123456” это значение храниться в массиве “p”. Введенные нами значения последовательно записываются в массив “c”. В коде программы происходит сравнение этих двух массивов,после того как будет нажата кнопка разблокировки. Если они совпадают то посылаем на вывод 3 “положительный сигнал”, а если не совпадают то “отрицательный”.

 Теперь вы знаете как сделать настоящий кодовый замок, и сохранить все ваше имущество!)

Источник: http://robot-russia.ru/2016/07/06/kak-sdelat-kodovyj-zamok-na-arduino/

Сейф с кодовым замком на Arduino

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

Источник: http://diy-vitebsk.ru/2018/01/04/sejf-s-kodovym-zamkom-na-arduino/

Хитрый кодовый замок своими руками | Каталог самоделок

Arduino является идеальной платформой для создания прототипов. Без нее множество замечательных идей никогда не были бы реализованы.

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

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

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

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

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

Так выглядит схема кодового замка:

Хитрый кодовый замок своими руками

Подключение кнопок следующее:

  1. К земле и D3 (3-й цифровой PIN);
  2. К D5 и D7;
  3. К D9 и D

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

Код будет таким:

const int ina = 3;
const int inb = 5;
const int inc = 9;
const int ledPin = 13;
int i = 1000;
byte a = 0;
byte b = 0;
byte c = 0;
byte d = 0;
unsigned long time = 0; //не забывайте всё, что принимает значение millis()
unsigned long temp = 0; //хранить в unsigned long
byte keya[] = { 0, 0, 0, 0, 0, 0, 0, 0}; //коды собственно
byte keyb[] = { 1, 1, 1, 1, 0, 1, 0, 0};
byte keyc[] = { 1, 0, 1, 0, 1, 1, 1, 0};
byte k = 0;
void setup() {
pinMode(ina, INPUT_PULLUP); //3 входа, подключаемые к кнопкам
pinMode(inb, INPUT_PULLUP);
pinMode(inc, INPUT_PULLUP);
pinMode(ledPin, OUTPUT); //встроенный светодиод на 13-ом пине
pinMode(7, OUTPUT);
pinMode(11, OUTPUT);
digitalWrite(7, LOW); //заменяют землю
digitalWrite(11, LOW);
time = millis(); //нужно для отсчёта времени
}
void blinktwice() { //двойное мигание светодиодом
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(200);
}
void loop() {
if(k==0) {
blinktwice(); //приглашение ввести код
}
if (k == {
digitalWrite(ledPin, HIGH);
delay(3000);
k = 0;
}
a = digitalRead(ina); //считываются уровни сигналов с кнопок – нажата/не нажата
b = digitalRead(inb);
c = digitalRead(inc);
delay(100); //следующий if – защита против ложных срабатываний, можно не использовать
if((digitalRead(ina) == a)&&(digitalRead(inb) ==b)&&(digitalRead(inc)==c)) {
if (a == keya[k]) {
if (b == keyb[k]) {
if (c == keyc[k]) {
k++;
}
}
}
}
if (k==1) {
if (d ==0) {
time = millis ();
d++;
}
}
temp = millis();
temp = temp – time;
if (temp > 10000) {
k= 0;
d=0;
time = millis ();
}
}

Пояснения к коду программы:

В функции setup назначаются порты, и устанавливается низкий уровень на тех, которые назначены заменять землю.

Параметр INPUT_PULLUP означает, что PIN подтянут к +5В при помощи внутреннего резистора на 10 кОм. Так можно избавиться от «плавающего» сигнала на пине. Также будет невозможно закоротить чего-нибудь лишнего, когда кнопка замыкается на землю.

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

Дальше происходит считывание сигналов на портах. Когда клавиша нажата, значение равно 0, а если отжата– это 1. Сигналы сопоставляются со значениями, которые записаны в массивах. К примеру, сигнал 0,1,1 говорит о том, что клавиша 1 зажата, а две оставшиеся непременно отжаты.

При выполнении этого условия произойдет переход к последующим значениям для сравнения. Если все 7 условий, следующие друг за другом, были реализованы, то выполнится k==8 и светодиод загорится на 3 секунды. Это значит, что пароль был введен верно.

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

Оставшаяся часть кода производит обнуление счетчика при условии, что с момента введения пароля прошло более 10 секунд. При этом светодиод должен погаснуть.

Без сбрасывания счетчика теоретически было бы возможно подобрать комбинацию путем перебора, несмотря на то, что их число составит (2^3)^7=2^21. Это немного больше 2000000 комбинаций.

Время ввода правильного пароля около 5 секунд после непродолжительных тренировок. Можно даже поставить зажатие кнопок по времени.

Прикрепленные файлы. Код программы 

Источник: https://volt-index.ru/electronika-dlya-nachinayushih/interesnoe/hitryiy-kodovyiy-zamok-svoimi-rukami.html

Кодовый замок на Arduino своими руками

Кодовый замок на Arduino своими руками

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

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

ИдеяНа двери с внешней стороны двери должна располагаться клавиатура, на которой вводится пароль, с внутренней стороны закреплена остальная конструкция. Для контроля полного закрытия двери используется геркон.

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

Комплектующие Arduino UNO = $18 Arduino protoshield + breadboard = $6 L293D = $1 Пучок проводов 30шт для бредборда = $4 2 розетки RJ45 = $4 2 вилки RJ45 = $0.5 актуатор центрального замка = 250 руб. Геркон = бесплатно оторван от старого окна.

 Шпингалет металлический гигантских размеров = бесплатно Корпус от старого хаба D-LINK из полуторамиллиметрового железа = бесплатно Блок питания от того же хаба D-LINK на 12 и 5в = тоже бесплатно Куча винтов и гаечек для крепления всего этого добра к корпусу = 100руб. Пульт управления от охранной сигнализации = бесплатно.Итого: $33,5 и 350руб.Не так уж и мало, скажете вы, и будете, определенно правы, но ведь за удовольствие надо платить! А собрать, что-то своими руками всегда приятно. К тому-же конструкцию можно сильно удешевить, если использовать голый МК без Arduino.Подготовка к сборке

Хочется несколько слов сказать о покупке ключевого элемента конструкции актуатора. В местном авто-магазине мне предложили актуаторы двух видов: «с двумя проводами и с пятью». Со слов продавщицы они были абсолютно одинаковыми и различие в количестве проводов не значило абсолютно ничего.

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

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

Синяя изолента нам, как всегда помогла нам в дальнейшем при сборке его назад.

Для управления мотором актуатора был использован драйвер моторов L293D, который выдерживает пиковую нагрузку до 1200 мА, у нас при остановке двигателя актуатора пиковая нагрузка вырастала всего до 600 мА.

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

Пульт и основное устройство предполагалось соединить с помощью витой пары и RJ45 разъемовПрограммирование.Так, как опыта программирования Arduino у меня не было до сих пор.

Я воспользовался чужими наработками и статьями с сайта arduino.cc. Кому интересно, может поглядеть этот безобразный код 🙂

Фото и видео

Ардуино и актуатор

Блок питания

Клавиатурка

Шпингалет (соединен с актуатором металлической спицей и на которую надета термоусадка для красоты).

Видео процесса работы устройства:

Использованные источники:

www.youtube.com/watch?v=eJ46wRyT-ZA

arduino.cc

Источник: https://eurosamodelki.ru/katalog-samodelok/samodelnie-supergadjety/kodovyi-zamok-na-arduino-svoimi-rukami

«Цифровая лаборатория» NR05: делаем кодовый замок

5 апреля 2016 в 12:42 (МСК) | сохранено5 апреля 2016 в 12:51 (МСК)

Продолжаем цикл статей по использованию возможностей набора «Цифровая лаборатория» NR05 для изучения программирования микроконтроллеров на примере Ардуино и конструированию полезных электронных устройств.

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

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

Используем эти элементы для построения кодового замка. Зададимся следующими требованиями: 1. Имеется 5 кнопок для ввода кода, открывающего замок; 2. Крайняя левая кнопка соответствует коду 1, далее слева направо — 2,3,4,5; 3. Количество цифр вводимого кода может быть любым (в разумных пределах) и просто устанавливаться в программе; 4.

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

Используем дисплей, RGB-светодиод и звукоизлучатель, входящие в набор для отображения понятной для пользователя информации. 9. Будем открывать настоящий электромеханический замок, питающийся от 12 вольт.

Теперь подберем устройство, которое будет подавать на замок напряжение открывания.

Это напряжение в соответствии с паспортом электромеханического замка, который мы и будем открывать, равно 12 вольтам при токе около 1 ампера. Плата расширения набора NR05 не может работать с такими напряжениями и токами, поэтому необходим дополнительный модуль коммутации.

Такими модулями могут быть предлагаемые компанией Мастер Кит реле MP515, или блоки реле MP2211, MP4411 в зависимости от того, захотим ли мы управлять не только замком, но и другими устройствами, например, включить свет при открывании двери. Все эти устройства совместимы с уровнями управляющих сигналов Ардуино. В нашем конкретном случае используем MP2211 – модуль с двумя реле.

Учитывая сказанное выше, нарисуем схему соединений используемых устройств:Если внимательно посмотреть на маркировку платы расширения, то мы увидим, что зеленый канал RGB-светодиода GREEN и выход на реле CH3 подключены к одному выводу D9 Arduino Nano.

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

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

Вот скетч, работающий в Ардуино, спойлер// Кодовый замок на пяти кнопках с индикацией на ЖК и RGB-светодиоде // на основе платы расширения из набора NR05 //——————————————————————- // подключаем библиотеки LiquidCrystalRus #include #include #include // определяем выводы для RGB-светодиода и звукоизлучателя #define red 5 #define blue 6 #define green 9 #define beep 12 // определяем, сколько кнопок у нас подключено #define NUM_KEYS 5 // для каждой кнопки заносим калибровочные значения(выведены экспериментально) int adcKeyVal[NUM_KEYS] = {30, 150, 360, 535, 760}; /////////////////////////////////////////////////////////// // длина кода, открывающего замок #define codeLength 6 // массив, содержащий код, открывающий замок. Число элементов массива должно быть равным codeLength const int codeOrigin[codeLength] = {1, 2, 3, 4, 5, 3}; // время разблокировки замка, миллисекунд const int unlockTime = 400; /////////////////////////////////////////////////////////// // массив для записи номеров нажатых клавиш int codePressed[codeLength]; // счетчик нажатий (замок разблокируется при пятом нажатии) int pressCount; // переменные для счетчика времени неактивности набора кода unsigned long oldTime; unsigned long currentTime; const int timeout = 5; // время таймаута при наборе кода, сек. После таймаута неполностью набранный код сбрасывается //———————————————————————– // инициализируем дисплей, объясняя программе куда подключены линии RS,EN,DB4,DB5,DB6,DB7 LiquidCrystalRus lcd(A1, A2, A3, 2, 4, 7); //———————————————————————– // Эта функция будет выполнена 1 раз в момент запуска программы Arduino void setup() { // инициализируем LCD: 16 символов и 2 строки lcd.begin(16, 2); // курсор находится на первой строке (верхней) и первом слева символе // напишем на дисплее «Мастер Кит» lcd.print(«Мастер Кит»); // установим курсора в первую позицию втрой строки lcd.setCursor(0,1); lcd.print(«tоткр.: „); lcd.print(unlockTime); lcd.print(“ мс»); // выдержим паузу в 2000 миллисекунд = 2 секунды delay(2000); // очистим дисплей lcd.clear(); // обнулим счетчик нажатий pressCount = 0; // зададим режим «на вывод» для подключения RGB-светодиода и звукоизлучателя pinMode(red, OUTPUT); pinMode(blue, OUTPUT); pinMode(green, OUTPUT); pinMode(beep, OUTPUT); } //———————————————————————– // Эта функция будет выполнена после функции setup и будет бесконечное число раз повторятся после своего окончания. void loop() { // записываем текущее время (в миллисекундах), прошедшее с момента начала исполнения программы currentTime = millis(); // проверяем, не достигнул ли таймаут на ввод кода if (currentTime — oldTime 0){ // если кнопка нажата codePressed[pressCount] = key; // записываем номер нажатой кнопки в массив // короткий сигнал звукоизлучателя (50 мс) digitalWrite(beep, HIGH); delay(50); digitalWrite(beep, LOW); // печатаем на втрой строке звездочки, мигая синим светодиодом lcd.setCursor(pressCount, 1); lcd.print('*'); digitalWrite(blue, LOW); delay(200); digitalWrite(blue, HIGH); pressCount++; // увеличиваем счетчик нажатий // сбрасываем счетчик времени таймаута oldTime = currentTime; } } // если достигнут таймаут, сбрасываем частично набранный код else{ pressCount = 0; lcd.clear(); oldTime = currentTime; } // если весь код введен, сравниваем поэлементно два массива: codeOrigin и codePressed if (pressCount == codeLength){ int compareResult = 1; for (int i = 0; i

Или, опираясь на материал, посвященный взаимодействию Ардуино со смартфоном по Bluetooth, сделать замок, который открывается кодом, посылаемым этим самым смартфоном.

Можно также достаточно просто ввести в наше устройство беспроводной канал управления.

Для этого достаточно воспользоваться двумя модулями: пультом-передатчиком MP910 и одноканальным приемником с релейным выходом MP911, работающими на частоте 433 МГц.

Контакты реле модуля MP2211 подключаются при этом параллельно кнопке пульта, а реле модуля приемника – к замку. Дистанция управления может быть до 100 м.

Изучайте Ардуино, изучайте микроконтроллеры и их программирование – и вы сможете создать немало умных и полезных электронных устройств!

Источник: https://sohabr.net/gt/post/273864/

Ссылка на основную публикацию
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}