Кодовый замок на Arduino

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

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

  • одна плата Arduino UNO или другая;
  • матричная клавиатура 4х4;
  • реле замка.

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

kodovji zamok arduino

"Строчные" линии R1-R4 подключены к выводам Arduino с 6-го по 9-й. Колоночне выводы C1-C4 подключены к выводам 10-10. Третий вывод настроен как выход, в цепь которого включена нагрузка, в нашем случае, для примера, это светодиод 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 "положительный сигнал", а если не совпадают то "отрицательный".

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;}
   }
Загрузка...