Текущее время: 20 окт 2020, 02:37

Калининград - город ХОББИ

Занятие любимым хобби - это путь к счастливой жизни!

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

Тут собраны схемы различных устройств сделанных на контроллерах Ардуино, Лазерный гравер на Ардуино, Металлоискатель на Ардуино, Метеостанция, Кодовый замок, и множество других устройств и изобретений
Аватар пользователя
 
Сообщений: 789
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 25 сен 2014, 16:00

Кодовый замок на Ардуино УНО.

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

корпус - 1 шт
клавиатура - 1 шт
контроллер Ардуино УНО - 1 шт
Блок реле для контроллера Ардуино - 1 шт
Исполняющее устройство - электромагнит или электрозащелка - 1 шт.


Вложения
1.jpg
Электронный кодовый замок
2.jpg
Кодовый замок на Arduino
3.jpg
Кодовый замок на Ардуино

Аватар пользователя
 
Сообщений: 789
Зарегистрирован: 27 мар 2013, 22:12

Re: Кодовый замок на Ардуино

Сообщение -=dp=- » 26 сен 2014, 13:01

Далее нам понадобиться кусок макетной платы для создания собственного шилда (модуля для Ардуино)

В макетную плату необходимо впаять штырьки для соединения с Ардуино, весь ряд цифровых выводов и нижнюю часть с выводами питания и общим .
Клавиатура у нас матричная, 4х4, очень удобно и экономично :D по отношению в цифровым выводам.
В Ардуино их всего 13.
Клавиатуру распаиваем тоже на штырьки, к цифровым выводам :
строки - 2,3,4,5
столбцы - 6,7,8,9.

К выводу 10 припаиваем резистор 100 ом и динамик - бипер от ПК второй вывод динамика на общий.
К выводам 11,12,13 припаиваем резисторы по 560 Ом, и провода к светодиодам, второй вывод на светодиодах припаиваем к общему.

Вывод 11 - синий светодиод - индицирует нажатие лубой клавиши.
Вывод 12 - Зеленый светодиод - индицирует правильный ввод кода и открытие кодового замка.
Вывод 13- красный светодиод, индицирует неправильный ввод кода, сброс, ошибку ввода.


Вложения
1.jpg
Кодовый замок на Arduino
2.jpg
Ардуино кодовый замок
3.jpg
Кодовый замок Ардуино

Аватар пользователя
 
Сообщений: 789
Зарегистрирован: 27 мар 2013, 22:12

Re: Кодовый замок на Ардуино

Сообщение -=dp=- » 26 сен 2014, 13:10

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

Пароль я прописал в скетче, причем длина пароля 5 символов , цифры + буквы, попробуй подбери :D

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

Жду ваших замечаний , вопросов, предложений и т.д.


Вложения
4.jpg
Кодовый замок для шкафа
5.jpg
Ардуино клуб Калининград
6.jpg
Ардуино Калининград

Аватар пользователя
 
Сообщений: 789
Зарегистрирован: 27 мар 2013, 22:12

Re: Кодовый замок на Ардуино

Сообщение -=dp=- » 26 сен 2014, 13:12

Все вопросы по кодовому замку на Ардуино пишем в данную тему.
Библиотеки и скетч выложу по требованию.


Вложения
7.jpg
Кодовый замок для сейфа

Аватар пользователя
 
Сообщений: 789
Зарегистрирован: 27 мар 2013, 22:12

Re: Кодовый замок на Ардуино

Сообщение -=dp=- » 26 сен 2014, 13:57

Тут я выложил видео обзор кодового замка http://youtu.be/Ya23w7Yqu-g



Аватар пользователя
 
Сообщений: 789
Зарегистрирован: 27 мар 2013, 22:12

Re: Кодовый замок на Ардуино

Сообщение -=dp=- » 11 дек 2014, 17:03

Fox писал(а):классный проект ;) у меня возник вопрос можно ли сделать смену пароля с клавиатуры так как в моем случае будет не возможно постоянно прошивать :( хотелось бы как то использовать энергонезависимую память :?: я не очень селен в программирование а сделать такое устройство на мастерскую хотелось бы.



Это легко можно реализовать подключив модуль SD карты http://newmar.ru/index.php?id_product=8 ... er=product. Пароли будут хранится в энергонезависимой памяти, и соответственно при вводе определенной команды их можно будет поменять, удалить или добавить.



Аватар пользователя
 
Сообщений: 789
Зарегистрирован: 27 мар 2013, 22:12

Re: Кодовый замок на Ардуино

Сообщение -=dp=- » 12 дек 2014, 08:56

Fox писал(а):да возможно но я не селен в программировании и мне нужно пароль писать в памяти EERPOM он весит не много и менять каждый раз мне его не надо. и еще вопрос как мне сделать при в воде 5 не правильных паролев включалась сигнализация


Запись пароля в EEPROM и счетчик неправильных вводов паролей легко можно сделать так:

#include <EEPROM2.h>
//подключаем заголовочный файл библиотеки EEPROM2

void setup()
{
unsigned long counter; //Здесь будем хранить счетчик
//unsigned long - тип данных, занимающий 4 байта,
//и хранящий значение от 0 до 4'294'967'295

//следующие 2 строчки нужны только при первом запуске,
//чтобы обнулить значение счетчика:
counter = 0;
EEPROM_write(0, counter);

//Инициализируем последовательный порт на 9600бит/сек:
Serial.begin(9600);

//Читаем счетчик из EEPROM:
EEPROM_read(0, counter);

counter++; // увеличиваем его на единицу

//Записываем значение счетчика
EEPROM_write(0, counter);

//Выводим счетчик в порт:
Serial.print("It's reset #");
Serial.println(counter, DEC);
}

void loop()
{
}

Библиотека для работы с EEPROM во вложении


Вложения
EEPROM2.zip
Библиотека для работы с EEPROM
(3.17 KiB) Скачиваний: 719

Аватар пользователя
 
Сообщений: 789
Зарегистрирован: 27 мар 2013, 22:12

Re: Кодовый замок на Ардуино

Сообщение -=dp=- » 31 июл 2015, 15:08

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



Аватар пользователя
 
Сообщений: 789
Зарегистрирован: 27 мар 2013, 22:12

Re: Кодовый замок на Ардуино

Сообщение -=dp=- » 01 окт 2015, 22:18

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

Код: выделить все
#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9,8,7,6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5,4,3,2}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
String summ;
String keystr;
int shet=0;
void setup(){
  Serial.begin(9600);
   pinMode(11, OUTPUT);
    pinMode(12, OUTPUT);
    pinMode(13, OUTPUT);
  //---------start tone------------
 digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
tone(10, 800, 200);
  delay(200);
  noTone(10);
  tone(10, 300, 200);
  delay(200);
  noTone(10);
    tone(10, 800, 200);
  delay(200);
  noTone(10);
      tone(10, 300, 200);
  delay(200);
  noTone(10);
      tone(10, 800, 200);
  delay(200);
  noTone(10);
    tone(10, 300, 200);
  delay(200);
  noTone(10);
    tone(10, 800, 200);
  delay(200);
  noTone(10);
      tone(10, 300, 200);
  delay(200);
  noTone(10);
      tone(10, 800, 200);
  delay(200);
  noTone(10);
    tone(10, 300, 200);
  delay(200);
  noTone(10);
    tone(10, 800, 200);
  delay(200);
  noTone(10);
      tone(10, 300, 200);
  delay(200);
  noTone(10);
      tone(10, 800, 200);
  delay(200);
  noTone(10);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
 //-------stop tone------------
}
 
void loop(){
char key = keypad.getKey();
 
if (key){
Serial.println(key);
 //---------start tone------------
 digitalWrite(11, HIGH);
  tone(10, 1440, 200);
  delay(200);
  noTone(10);
  digitalWrite(11, LOW);
 //-------stop tone------------
shet=shet+1;
if (shet==6){
summ="";
keystr="";
shet=0;
Serial.println("LONG");
//---------start tone------------
  digitalWrite(12, HIGH);
  tone(10, 600, 200);
  delay(200);
  noTone(10);
  digitalWrite(12, LOW);
 //-------stop tone------------ 
};
summ=summ+key;
Serial.println(summ);
keystr=String(key);

if (keystr=="#"){
summ="";
keystr="";
shet=0;
Serial.println("RESET");
 //---------start tone------------
  digitalWrite(12, HIGH);
  tone(10, 600, 200);
  delay(200);
  noTone(10);
  digitalWrite(12, LOW);
 //-------stop tone------------
};

if (keystr=="*"){
summ="";
keystr="";
shet=0;
Serial.println("ENTER");
 //---------start tone------------
 digitalWrite(12, HIGH);
  tone(10, 600, 200);
  delay(200);
  noTone(10);
  digitalWrite(12, LOW);
 //-------stop tone------------
};

if (summ=="83B12"){
Serial.println("PASS OK");
summ="";
keystr="";
shet=0;
 //---------start tone------------
 digitalWrite(13, HIGH);
 tone(10, 800, 200);
  delay(200);
  noTone(10);
  tone(10, 300, 200);
  delay(200);
  noTone(10);
    tone(10, 800, 200);
  delay(200);
  noTone(10);
      tone(10, 300, 200);
  delay(200);
  noTone(10);
      tone(10, 800, 200);
  delay(200);
  noTone(10);
    tone(10, 300, 200);
  delay(200);
  noTone(10);
    tone(10, 800, 200);
  delay(200);
  noTone(10);
      tone(10, 300, 200);
  delay(200);
  noTone(10);
      tone(10, 800, 200);
  delay(200);
  noTone(10);
    tone(10, 300, 200);
  delay(200);
  noTone(10);
    tone(10, 800, 200);
  delay(200);
  noTone(10);
      tone(10, 300, 200);
  delay(200);
  noTone(10);
      tone(10, 800, 200);
  delay(200);
  noTone(10);
  digitalWrite(13, LOW);
 //-------stop tone------------

};
//---------------start pass 2 -----------------
if (summ=="94C3A"){
Serial.println("PASS OK");
summ="";
keystr="";
shet=0;
 //---------start tone------------
 digitalWrite(13, HIGH);
 tone(10, 800, 200);
  delay(200);
  noTone(10);
  tone(10, 300, 200);
  delay(200);
  noTone(10);
    tone(10, 800, 200);
  delay(200);
  noTone(10);
      tone(10, 300, 200);
  delay(200);
  noTone(10);
      tone(10, 800, 200);
  delay(200);
  noTone(10);
    tone(10, 300, 200);
  delay(200);
  noTone(10);
    tone(10, 800, 200);
  delay(200);
  noTone(10);
      tone(10, 300, 200);
  delay(200);
  noTone(10);
      tone(10, 800, 200);
  delay(200);
  noTone(10);
    tone(10, 300, 200);
  delay(200);
  noTone(10);
    tone(10, 800, 200);
  delay(200);
  noTone(10);
      tone(10, 300, 200);
  delay(200);
  noTone(10);
      tone(10, 800, 200);
  delay(200);
  noTone(10);
  digitalWrite(13, LOW);
 //-------stop tone------------

};
//------------------stop pass 2---------------------
//---------------start pass 3 -----------------
if (summ=="A5D81"){
Serial.println("PASS OK");
summ="";
keystr="";
shet=0;
 //---------start tone------------
 digitalWrite(13, HIGH);
 tone(10, 800, 200);
  delay(200);
  noTone(10);
  tone(10, 300, 200);
  delay(200);
  noTone(10);
    tone(10, 800, 200);
  delay(200);
  noTone(10);
      tone(10, 300, 200);
  delay(200);
  noTone(10);
      tone(10, 800, 200);
  delay(200);
  noTone(10);
    tone(10, 300, 200);
  delay(200);
  noTone(10);
    tone(10, 800, 200);
  delay(200);
  noTone(10);
      tone(10, 300, 200);
  delay(200);
  noTone(10);
      tone(10, 800, 200);
  delay(200);
  noTone(10);
    tone(10, 300, 200);
  delay(200);
  noTone(10);
    tone(10, 800, 200);
  delay(200);
  noTone(10);
      tone(10, 300, 200);
  delay(200);
  noTone(10);
      tone(10, 800, 200);
  delay(200);
  noTone(10);
  digitalWrite(13, LOW);
 //-------stop tone------------

};
//------------------stop pass 3---------------------

  }
}




и библиотеку для матричной клавиатуры 4х4


Вложения
Keypad.rar
библиотека для матричной клавиатуры 4х4
(15.98 KiB) Скачиваний: 885

Аватар пользователя
 
Сообщений: 789
Зарегистрирован: 27 мар 2013, 22:12

Re: Кодовый замок на Ардуино

Сообщение -=dp=- » 12 май 2016, 21:54

Вот , проектик кодового замка ожил :D
Хорошо получилось, молодца!
Для управления электромагнитом рекомендую использовать модуль реле, транзисторные ключи горят от обратного всплеска индуктивности, даже защитный диод не помогал :(



Аватар пользователя
 
Сообщений: 789
Зарегистрирован: 27 мар 2013, 22:12

Re: Кодовый замок на Ардуино

Сообщение -=dp=- » 01 мар 2018, 23:59

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

Код: выделить все

#include <Keypad.h> // библиотека матричной клавиатуры
#include <Servo.h> // библиотека управления серводвигателем
Servo myservo;  // инициализация двигателя
// переменные счетчиков
int pos = 0;   
int val = 0;
int alarm = 0;
int alar = 0;

const byte ROWS = 4; //строки клавиатуры
const byte COLS = 4; //столбцы клавиатуры
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9,8,7,6}; // строки клавиатуры
byte colPins[COLS] = {5,4,3,2}; // столбцы клавиатуры

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
String summ;
String keystr;
int shet=0;

// установочный цикл
void setup(){
  Serial.begin(9600);
   myservo.attach(13);
   pinMode(11, OUTPUT);
   pinMode(12, OUTPUT);
   
// тест индикации и сигнализации
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
// звуковой сигнал , где tone(номер вывода, частота тона, длительность)
tone(10, 800, 200);
// задержка
  delay(200);
// отключение звукового сигнала
  noTone(10);
  tone(10, 500, 200);
  delay(200);
  noTone(10);
    tone(10, 600, 200);
  delay(200);
  noTone(10);
      tone(10, 700, 200);
  delay(200);
  noTone(10);
      tone(10, 800, 200);
  delay(200);
  noTone(10);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
}
 
 
// основной цикл
void loop(){
if (val==0){
char key = keypad.getKey();
 
if (key){
Serial.println(key);
 digitalWrite(11, HIGH);
  tone(10, 1440, 200);
  delay(200);
  noTone(10);
  digitalWrite(11, LOW);
shet=shet+1;
// считаем неверные вводы кода
if (shet==6){
summ="";
keystr="";
shet=0;
alarm = alarm +1;
Serial.println("LONG");
  digitalWrite(12, HIGH);
  tone(10, 600, 200);
  delay(200);
  noTone(10);
  digitalWrite(12, LOW); 
};
summ=summ+key;
Serial.println(summ);
keystr=String(key);

// сброс при ошибочном вводе кода
if (keystr=="#"){
summ="";
keystr="";
shet=0;
Serial.println("RESET");
  digitalWrite(12, HIGH);
  tone(10, 600, 200);
  delay(200);
  noTone(10);
  digitalWrite(12, LOW);
};

// ввод, необязательно
if (keystr=="*"){
summ="";
keystr="";
shet=0;
Serial.println("ENTER");
 digitalWrite(12, HIGH);
  tone(10, 600, 200);
  delay(200);
  noTone(10);
  digitalWrite(12, LOW); 
};

// проверяем на соответствие верному коду
if (summ=="2548"){
Serial.println("PASS OK");
val=1;
summ="";
keystr="";
shet=0;
 tone(10, 1200, 200);
  delay(500);
  noTone(10);
  tone(10, 1200, 200);
  delay(500);
  noTone(10);
    tone(10, 1200, 200);
  delay(500);
  noTone(10);
};
}
// включаем сирену при 5 неверных наборов кода
if (alarm>=5) {
 for(alar = 0; alar <= 10; alar += 1)
  {  tone(10, 500, 200);
  delay(200);
  noTone(10);
  tone(10, 800, 200);
  delay(200);
  noTone(10);
  } ;
 alarm = 0;
 alar = 0;
};

} else {
 
  // открываем замок на 5 сек и закрываем
    tone(10, 1500, 200);
  delay(500);
  noTone(10);
 for(pos = 0; pos <= 90; pos += 1)
  { myservo.write(pos);
    delay(10);
  }
  delay(5000);
    tone(10, 1500, 200);
  delay(500);
  noTone(10);
  for(pos = 90; pos>=0; pos-=1)   
  {myservo.write(pos);       
   delay(10);                 
  }
  delay(5000);
    tone(10, 1500, 200);
  delay(500);
  noTone(10);
val=0; 
};
}





Библиотека управления серводвигателем во вложении


Вложения
Servo.rar
Библиотека управления серводвигателем
(27.03 KiB) Скачиваний: 337

Аватар пользователя
 
Сообщений: 789
Зарегистрирован: 27 мар 2013, 22:12

Re: Кодовый замок на Ардуино

Сообщение -=dp=- » 07 мар 2018, 15:37

Код: выделить все


#include <Keypad.h> // библиотека матричной клавиатуры
#include <Servo.h> // библиотека управления серводвигателем
Servo myservo;  // инициализация двигателя
// переменные счетчиков
int pos = 0;   
int val = 0;
int alarm = 0;
int alar = 0;

const byte ROWS = 4; //строки клавиатуры
const byte COLS = 4; //столбцы клавиатуры
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9,8,7,6}; // строки клавиатуры
byte colPins[COLS] = {5,4,2,3}; // столбцы клавиатуры

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
String summ;
String keystr;
int shet=0;

// установочный цикл
void setup(){
  Serial.begin(9600);
   myservo.attach(13);
   pinMode(11, OUTPUT);
   pinMode(12, OUTPUT);
   
// тест индикации и сигнализации
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
// звуковой сигнал , где tone(номер вывода, частота тона, длительность)
tone(10, 800, 200);
// задержка
  delay(200);
// отключение звукового сигнала
  noTone(10);
  tone(10, 500, 200);
  delay(200);
  noTone(10);
    tone(10, 600, 200);
  delay(200);
  noTone(10);
      tone(10, 700, 200);
  delay(200);
  noTone(10);
      tone(10, 800, 200);
  delay(200);
  noTone(10);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
}
 
 
// основной цикл
void loop(){
if (val==0){
char key = keypad.getKey();
 
if (key){
Serial.println(key);
 digitalWrite(11, HIGH);
  tone(10, 1440, 200);
  delay(200);
  noTone(10);
  digitalWrite(11, LOW);
shet=shet+1;
// считаем неверные вводы кода
if (shet==6){
summ="";
keystr="";
shet=0;
alarm = alarm +1;
Serial.println("LONG");
  digitalWrite(12, HIGH);
  tone(10, 600, 200);
  delay(200);
  noTone(10);
  digitalWrite(12, LOW); 
};
summ=summ+key;
Serial.println(summ);
keystr=String(key);

// сброс при ошибочном вводе кода
if (keystr=="#"){
summ="";
keystr="";
shet=0;
Serial.println("RESET");
  digitalWrite(12, HIGH);
  tone(10, 600, 200);
  delay(200);
  noTone(10);
  digitalWrite(12, LOW);
};

// ввод, необязательно
if (keystr=="*"){
summ="";
keystr="";
shet=0;
Serial.println("ENTER");
 digitalWrite(12, HIGH);
  tone(10, 600, 200);
  delay(200);
  noTone(10);
  digitalWrite(12, LOW); 
};

// проверяем на соответствие верному коду
if (summ=="2548"){
Serial.println("PASS OK");
val=1;
summ="";
keystr="";
shet=0;
 tone(10, 1200, 200);
  delay(500);
  noTone(10);
  tone(10, 1200, 200);
  delay(500);
  noTone(10);
    tone(10, 1200, 200);
  delay(500);
  noTone(10);
};
}
// включаем сирену при 5 неверных наборов кода
if (alarm>=5) {
 for(alar = 0; alar <= 10; alar += 1)
  {  tone(10, 500, 200);
  delay(200);
  noTone(10);
  tone(10, 800, 200);
  delay(200);
  noTone(10);
  } ;
 alarm = 0;
 alar = 0;
};

} else {
 
  // открываем замок на 5 сек и закрываем
    tone(10, 1500, 200);
  delay(500);
  noTone(10);
 for(pos = 0; pos <= 90; pos += 1)
  { myservo.write(pos);
    delay(10);
  }
  delay(5000);
    tone(10, 1500, 200);
  delay(500);
  noTone(10);
  for(pos = 90; pos>=0; pos-=1)   
  {myservo.write(pos);       
   delay(10);                 
  }
  delay(5000);
    tone(10, 1500, 200);
  delay(500);
  noTone(10);
val=0; 
};
}







Вернуться в Устройства на Ардуино

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2