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

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

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

Вот давно зрела у меня идея какого-нибудь хитрого кодового замка – например, где кодом было бы время удерживания кнопки.

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

Обратите внимание

Я уже даже был готов взять генератор прямоугольных импульсов, 3 десятеричных счётчика и ещё ворох какой-то логики, чтобы это всё собрать… Но даже в smd это выглядело бы слишком громоздко и неудобно для практического использования. Но идея вертелась в голове и зрела…

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

Нигде раньше не встречал такого решения, если встретите – сообщите 🙂

Схема проста до безобразия. (код, впрочем, тоже )

Не очень хорошо видно, но кнопки подключаются к: а) земле и D3 (третий цифровой пин), b) D5 и D7 c) D9 и D11.

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

Вот и код:

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 == 8) { 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 – это значит что пин подтянут к +5В внутренним резистором (10 кОм, вроде).

Это позволяет избежать “плавающего” сигнала на нём и не коротнуть чего лишнего при замыкании кнопкой на землю. blinktwice выделен в отдельную функцию ради удобства – никогда не упускайте возможности попрактиковаться в использовании функций! Далее считываются уровни сигнала на портах (они будут LOW, т.

е 0, когда кнопка нажата, и 1, когда не нажата), и сравниваются с записанными в массивах значениями – например нулевые значения 0,1,1 означают, что первая кнопка должна быть нажата, а две других обязательно отжаты. Если условие выполняется, происходит переход к следующим значениям.

Когда все 7 последовательных условий выполнились, выполняется условие k==8 и светодиод загорается на 3 секунды, сигнализируя о правильности введённого кода. В этот кусок кода надо вписывать то, что и должно происходить при этом – открытие двери, звуковой сигнал и т.д.

Важно

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

Очень полезно помнить при этом, что в году всего лишь 31 миллион секунд. А время введения правильного кода – 5 секунд после небольшой тренировки, так что можно ещё зажать по времени.

Мне пока не на ком тестировать систему, но если кому система понравится настолько, чтобы воплотить её в жизнь – пожалуйста, напишите о результатах!

Прикрепленные файлы:

Источник: http://cxem.net/arduino/arduino101.php

Как сделать кодовый замок на 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

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

11.10.2018

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

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

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

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

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

Для работы с датчиком отпечатка пальцев, есть отличная библиотека для 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 отдельно.

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

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

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

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

#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»;

Кроме того, надо создать экземпляр объекта 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 подключится к 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);

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: триггеры. Триггеры — это по-сути условия, которые вы можете применять к настроенным каналам. То есть, их можно использовать для взаимосвязи двух каналов.

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

Источник: https://electshema.ru/drugoe/neobychnyj-kodovyj-zamok-na-arduino.html

Делаем RFID-замок с использованием Arduino

Сегодня урок о том как использовать RFID-ридер с Arduino для создания простой системы блокировки, простыми словами – RFID-замок.

RFID (англ.

Radio Frequency IDentification, радиочастотная идентификация) — способ автоматической идентификации объектов, в котором посредством радиосигналов считываются или записываются данные, хранящиеся в так называемых транспондерах, или RFID-метках. Любая RFID-система состоит из считывающего устройства (считыватель, ридер или интеррогатор) и транспондера (он же RFID-метка, иногда также применяется термин RFID-тег).

В уроке будет использоваться RFID-метка с Arduino. Устройство читает уникальный идентификатор (UID) каждого тега RFID, который мы размещается рядом со  считывателем, и отображает его на OLED-дисплее.

Если UID тега равен предопределенному значению, которое хранится в памяти Arduino, тогда на дисплее мы увидим сообщение «Unlocked» (англ., разблокировано).

Если уникальный идентификатор не равен предопределенному значению, сообщение “Unlocked” не появится – см. фото ниже.

Замок закрыт

Замок открыт

Шаг 1: Детали, комплектующие

Детали, необходимые для создания этого проекта:

  • Arduino Uno
  • RFID-ридер RC522
  • OLED-дисплей
  • Макетная плата
  • Провода

Дополнительные детали:

Общая стоимость комплектующих проекта составила примерно 15 долларов.

В каждой метке RFID есть небольшой чип (на фото белая карточка). Если направить фонарик на эту RFID-карту, можно увидеть маленький чип и катушку, которая его окружает. У этого чипа нет батареи для получения мощности. Он получает питание от считывателя беспроводным образом используя эту большую катушку. Можно прочитать RFID-карту, подобную этой, с расстояния до 20 мм.

Тот же чип существует и в тегах RFID-брелка.

Каждый тег RFID имеет уникальный номер, который идентифицирует его. Это UID, который показывается на OLED-дисплее. За исключением этого UID, каждый тег может хранить данные. В этом типе карт можно хранить до 1 тысячи данных.

Впечатляет, не так ли? Эта функция не будет использована сегодня. Сегодня все, что интересует, – это идентификация конкретной карты по ее UID. Стоимость RFID-считывателя и этих двух карт RFID составляет около 4 долларов США.

Шаг 3: OLED-дисплей

В уроке используется OLED-монитор 0.96' 128×64 I2C.

Это очень хороший дисплей для использования с Arduino. Это дисплей OLED и это означает, что он имеет низкое энергопотребление. Потребляемая мощность этого дисплея составляет около 10-20 мА, и это зависит от количества пикселей.

Дисплей имеет разрешение 128 на 64 пикселя и имеет крошечный размер. Существует два варианта отображения. Один из них монохромный, а другой, как тот, который использован в уроке, может отображать два цвета: желтый и синий. Верхняя часть экрана может быть только желтой, а нижняя часть – синей.

Совет

Этот OLED-дисплей очень яркий и у него отличная и очень приятная библиотека, которую разработала компания Adafruit для этого дисплея. В дополнение к этому дисплей использует интерфейс I2C, поэтому соединение с Arduino невероятно простое.

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

Шаг 4: Соединяем все детали

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

Будьте осторожны, считыватель RFID должен быть подключен к выходу 3,3 В от Arduino Uno или он будет испорчен.

Так как дисплей также может работать на 3,3 В, мы подключаем VCC от обоих модулей к положительной шине макета. Затем эта шина подключается к выходу 3,3 В от Arduino Uno. После чего соединяем обе земли (GND) с шиной заземления макета. Затем мы соединяем GND-шину макета с Arduino GND.

OLED-дисплей → Arduino

VCC → 3.3V

GND → GND

SCL → Аналоговый Pin 5

SDA → Аналоговый Pin 4

RFID-ридер → Arduino

RST → Цифровой Pin 9

IRQ → Не соединен

MISO → Цифровой Pin 12

MOSI → Цифровой Pin 11

SCK → Цифровой Pin 13

SDA → Цифровой Pin 10

Модуль RFID-считывателя использует интерфейс SPI для связи с Arduino. Поэтому мы собираемся использовать аппаратные штыри SPI от Arduino UNO.

Вывод RST поступает на цифровой контакт 9. Контакт IRQ остается несвязным. Контакт MISO подключается к цифровому выходу 12. Штырь MOSI идет на цифровой контакт 11. Контакт SCK переходит на цифровой контакт 13, и, наконец, вывод SDA идет на цифровой вывод 10. Вот и все.

Считыватель RFID подключен. Теперь нам нужно подключить OLED-дисплей к Arduino, используя интерфейс I2C. Таким образом, вывод SCL на дисплее переходит к аналоговому выводу Pin 5 и SDA на дисплее к аналоговому Pin 4. Если теперь мы включим проект и разместим RFID-карту рядом с ридером, мы увидим, что проект работает нормально.

Читайте также:  Допускается ли проход кабеля через перегородку в трубе из пвх?

Шаг 5: Код проекта

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

Чтобы установить её, перейдите в Sketch -> Include Libraries -> Manage libraries (Управление библиотеками). Найдите MFRC522 и установите её.

Нам также нужна библиотека Adafruit SSD1306 и библиотека Adafruit GFX для отображения.

Обратите внимание

Установите обе библиотеки. Библиотека Adafruit SSD1306 нуждается в небольшой модификации. Перейдите в папку Arduino -> Libraries, откройте папку Adafruit SSD1306 и отредактируйте библиотеку Adafruit_SSD1306.h. Закомментируйте строку 70 и раскомментируйте строку 69, т.к. дисплей имеет разрешение 128×64.

Сначала мы объявляем значение метки RFID, которую должен распознать Arduino. Это массив целых чисел:

int code[] = {69,141,8,136}; // UID

Затем мы инициализируем считыватель RFID и дисплей:

rfid.PCD_Init(); display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

После этого в функции цикла мы проверяем тег на считывателе каждые 100 мс.

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

if(match) { Serial.println(”
I know this card!”); printUnlockMessage(); }else { Serial.println(”
Unknown Card”); }

Конечно, вы можете изменить этот код, чтобы сохранить более 1 значения UID, чтобы проект распознал больше RFID-меток. Это просто пример.

Код проекта:

#include #include #include #include #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); #define SS_PIN 10 #define RST_PIN 9 MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class MFRC522::MIFARE_Key key; int code[] = {69,141,8,136}; //This is the stored UID int codeRead = 0; String uidString; void setup() { Serial.begin(9600); SPI.begin(); // Init SPI bus rfid.PCD_Init(); // Init MFRC522 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128×64) // Clear the buffer. display.clearDisplay(); display.display(); display.setTextColor(WHITE); // or BLACK); display.setTextSize(2); display.setCursor(10,0); display.print(“RFID Lock”); display.display(); } void loop() { if( rfid.PICC_IsNewCardPresent()) { readRFID(); } delay(100); } void readRFID() { rfid.PICC_ReadCardSerial(); Serial.print(F(”
PICC type: “)); MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); Serial.println(rfid.PICC_GetTypeName(piccType)); // Check is the PICC of Classic MIFARE type if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && piccType != MFRC522::PICC_TYPE_MIFARE_1K && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { Serial.println(F(“Your tag is not of type MIFARE Classic.”)); return; } clearUID(); Serial.println(“Scanned PICC's UID:”); printDec(rfid.uid.uidByte, rfid.uid.size); uidString = String(rfid.uid.uidByte[0])+” “+String(rfid.uid.uidByte[1])+” “+String(rfid.uid.uidByte[2])+ ” “+String(rfid.uid.uidByte[3]); printUID(); int i = 0; boolean match = true; while(i

Источник: https://ArduinoPlus.ru/rfid-zamok-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

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

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

Ссылка на основную публикацию
Adblock
detector