Скетч под кодовый замок.

Remmeh
Offline
Зарегистрирован: 10.06.2016

Появилась необходимость в кодовом замке. Решил попробовать сделать на Ардуино.  Так как я только только начинаю изучать Ардуино нашел пример скетча в интеренете. В скетче при правильном пароле замыкается реле и находится в таком положении пока снова не введёшь пароль на закрытие. А мне нужно сделать чтобы сигнал на замыкание реле подавался на 2-3 секунды. Хочу поставить электромеханический замок, который будет сам возвращаться в закрытое положение когда нет напряжения на нём. Подскажите что нужно вписать в скеч для того чтобы работало по моему принципу. Всем заранее спасибо. 

Скетч

#include <Password.h>
#include <Keypad.h>
#include <LiquidCrystal.h>
 
Password password = Password("1234");  // password
int dlugosc = 4;                        // length of the password
 
LiquidCrystal lcd(A0, A1, A5, A4, A3, A2);
 
int ledRed = 11;
int ledGreen = 12;
int buzzer = 13;
int relay = 10;
 
int ilosc; // number of clicks
 
const byte ROWS = 4; // rows
const byte COLS = 3; // cols
 
char keys[ROWS][COLS] =
{
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
 
byte rowPins[ROWS] = {2,3,4,5};
byte colPins[COLS] = {6,7,8};
 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
void setup()
{
  Serial.begin(9600);
  keypad.addEventListener(keypadEvent); 
  pinMode(ledRed, OUTPUT); 
  pinMode(ledGreen, OUTPUT);
  pinMode(buzzer, OUTPUT);
 
  digitalWrite(ledRed, HIGH);
  digitalWrite(ledGreen, LOW);
 
  lcd.begin(16, 2);
 
  lcd.setCursor(1,0);
  lcd.print("  :Привет:");
  lcd.setCursor(0,1);
  lcd.print("PLEASE ENTER PIN");
}
 
void loop()
{
  keypad.getKey();
}
void keypadEvent(KeypadEvent eKey)
{
  switch (keypad.getState())
  {
    case PRESSED:
  
int i;
for( i = 1; i <= 1; i++ )
{
  digitalWrite(buzzer, HIGH); 
  delay(50);           
  digitalWrite(buzzer, LOW); 
  delay(50);     
}   
 
Serial.print("Pressed: ");
Serial.println(eKey);
 
switch (eKey)
{
/*
case '#':
break;
 
case '*':
break;
*/
 
default:
ilosc=ilosc+1;
password.append(eKey);
}
//Serial.println(ilosc);
 
if(ilosc == 1)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print("   < PIN >");
lcd.setCursor(0,1);
lcd.print("*_");
}
if(ilosc == 2)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print("   < PIN >");
lcd.setCursor(0,1);
lcd.print("**_");
}
if(ilosc == 3)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print("   < PIN >");
lcd.setCursor(0,1);
lcd.print("***_");
}
if(ilosc == 4)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print("   < PIN >");
lcd.setCursor(0,1);
lcd.print("****_");
}
if(ilosc == 5)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print("   < PIN >");
lcd.setCursor(0,1);
lcd.print("*****_");
}
if(ilosc == 6)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print("   < PIN >");
lcd.setCursor(0,1);
lcd.print("******_");
}
if(ilosc == 7)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print("   < PIN >");
lcd.setCursor(0,1);
lcd.print("*******_");
}
if(ilosc == 8)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print("   < PIN >");
lcd.setCursor(0,1);
lcd.print("********");
}
 
if(ilosc == dlugosc)
{
delay(250);
checkPassword();
ilosc = 0;
}
}
}
 
void checkPassword()
{
  if (password.evaluate())
  {
int i;
for( i = 1; i <= 2; i++ )
{
  digitalWrite(buzzer, HIGH); 
  delay(70);           
  digitalWrite(buzzer, LOW); 
  delay(70);     
}   
    ilosc = 0;
 
    Serial.println("Success");   
 
    digitalWrite(ledRed, LOW);
    digitalWrite(ledGreen, HIGH);
 
    lcd.clear();
    lcd.setCursor(0,1);
    lcd.print(" << SUCCESS >>");   
 } 
  else 
  {
int i;
for( i = 1; i <= 1; i++ )
{
  digitalWrite(buzzer, HIGH); 
  delay(200);           
  digitalWrite(buzzer, LOW); 
  delay(200);     

    ilosc = 0; 
    password.reset();
 
    Serial.println("Wrong");
 
    digitalWrite(ledGreen, LOW);
    digitalWrite(ledRed, HIGH);   
            
    lcd.clear();
    lcd.setCursor(0,1);
    lcd.print("  << WRONG >>");
    delay(2000);
  
    lcd.clear();
    lcd.setCursor(1,0);
    lcd.print("  :Welcome:");
    lcd.setCursor(0,1);
    lcd.print("PLEASE ENTER PIN");   
  }
}

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

Во-первых:http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

Во-вторых: в вашем скетче пин" РЕЛЕ "упоминается только один раз  в начале при объявлении ( насколько я рассмотрел ) и более нигде..Не объявлен ни как вход , ни как выход...

Вот тут товарисч тоже кодовый замок делал .Посмотрите.

artemon25
Offline
Зарегистрирован: 25.12.2015

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


#include <Password.h>
#include <Keypad.h>

 
Password password = Password("2405");  // password
int dlugosc = 4;                        // length of the password
 

 
int ledRed = 11;
int ledGreen = 12;
int buzzer = 13;
int relay = 10;
 
int ilosc; // number of clicks
 
const byte ROWS = 4; // rows
const byte COLS = 3; // cols
 
char keys[ROWS][COLS] =
{
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
 
byte rowPins[ROWS] = {2,3,4,5};
byte colPins[COLS] = {6,7,8};
 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
void setup()
{
  Serial.begin(9600);
  keypad.addEventListener(keypadEvent);  
  pinMode(ledRed, OUTPUT);  
  pinMode(ledGreen, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(relay, OUTPUT);
  digitalWrite(ledRed, HIGH);
  digitalWrite(ledGreen, LOW);
 digitalWrite(relay, HIGH);
}
 
void loop()
{
  keypad.getKey();
}
void keypadEvent(KeypadEvent eKey)
{
  switch (keypad.getState())
  {
    case PRESSED:
      
int i;
for( i = 1; i <= 1; i++ )
{
  digitalWrite(buzzer, HIGH);  
  delay(50);            
  digitalWrite(buzzer, LOW);  
  delay(50); 
  
}    
 
Serial.print("Pressed: ");
Serial.println(eKey);
 
switch (eKey) 

  
{
/*
case '#':
break;
 
case '*':
break;
*/
 
default:
ilosc=ilosc+1;
password.append(eKey);
}
//Serial.println(ilosc);
 
}

 
if(ilosc == dlugosc)
{
delay(250);
checkPassword();
ilosc = 0;
}
}

 
void checkPassword()
{
  if (password.evaluate())
  {
int i;
for( i = 1; i <= 2; i++ )
{
  digitalWrite(buzzer, HIGH);  
  delay(70);            
  digitalWrite(buzzer, LOW);  
  delay(70);      
}    
    ilosc = 0;
    password.reset();

 
    Serial.println("Success");    
 
    digitalWrite(ledRed, LOW);
    digitalWrite(ledGreen, HIGH);
     digitalWrite(relay, LOW);
     delay (5000);
      digitalWrite(ledGreen, LOW);
      digitalWrite(relay, HIGH);
       digitalWrite(ledRed, HIGH);
       
 }
 else  
  {
int i;
for( i = 1; i <= 1; i++ )
{
  digitalWrite(buzzer, HIGH);  
  delay(200);            
  digitalWrite(buzzer, LOW);  
  delay(200);      
}  
    ilosc = 0;  
    password.reset();
 
    Serial.println("Wrong");
 
    digitalWrite(ledGreen, LOW);
    digitalWrite(ledRed, HIGH); 
    digitalWrite(relay, HIGH); 
  } 
 
  }

реле включается на 5 секунд и пароль 2405 можете менять в скетче. а я хочу добавить ещё открывание с радиопульта и сейчас как раз мучаюсь как это сделать

artemon25
Offline
Зарегистрирован: 25.12.2015

если кто то знает как добавить радиопульт обратите внимание сюда  http://arduino.ru/forum/programmirovanie/matrichnaya-klaviatura-dlya-kalitki-nuzhna-pomoshch#comment-199679

RuslanRec
Offline
Зарегистрирован: 02.11.2016

Подскажите как реализовать если нужно несколько паролей иметь и они должны сменяться каждую минуту?