Table of Contents

Fancy Door Lock

Theodor Protopopescu, 332CB

Introducere

Acesta este un sistem de deblocare a unei incuietori pe baza unui PIN tastat pe un keypad, cu afisaj pe un LCD. Parola va putea fi introdusa si modificata din keypad; usa se va putea deschide si din telefon, care va avea o conexiune Bluetooth cu sistemul.

Descriere generală

Deschiderea usii se realizeaza prin introducerea parolei, urmata de caracterul ”#”.

Daca parola introdusa este corecta, se va afisa pe ecranul LCD un mesaj corespunzator, iar incuietoarea se va deschide pentru 3 secunde. In cazul in care parola este gresita, se va afisa un mesaj corespunzator timp de 3 secunde, dupa care parola va putea fi reintrodusa.

La introducerea codului ”####”, se va activa optiunea de resetare a parolei. Se va solicita vechea parola a incuietorii inainte de a putea fi setata o noua parola.

In plus, deblocarea usii se va putea face si din telefon, prin trimiterea parolei prin aplicatie, dupa conectarea la modulul Bluetooth.

Schema bloc

Hardware Design

Lista de piese

Schema electrica

Software Design

Mediu de dezvoltare

Proiectul a fost programat exclusiv in ArduinoIDE.

Biblioteci

Am folosit 3 biblioteci auxiliare, pentru utilizarea LCD-ului cu modul I2C si pentru utilizarea Keypad-ului.

Organizarea codului

#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Wire.h>
#define LENGTH 5
#define LOCK 11
 
char data[LENGTH];
char password[LENGTH] = "1234";
char resetCode[LENGTH] = "####";
byte k = 0;
byte z = 1;
const byte column = 4;
const byte rows = 4;
char confirmButton;
int openCommand;
char keys[rows][column]= {
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};
byte rowPins[rows] = {9,8,7,6};
byte colPins[column] = {5,4,3,2};
Keypad myKeypad=Keypad(makeKeymap(keys), rowPins, colPins, rows, column);
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() { 
  pinMode(LOCK, OUTPUT);
  digitalWrite(LOCK, LOW);
 
  lcd.init();
  lcd.backlight();
  Serial.begin(9600);
}
void loop() {
  lcd.setCursor(0,0);
  lcd.print("Enter pass:");
 
  int t = 1;
  // Se verifica daca se transmite ceva pe seriala
  if (Serial.available() > 0) {
    t = 0;
  }
 
  // Se citeste parola introdusa de la tastatura, sau pe seriala
  while(k < 4) {
    if (!t) {
      data[k] = Serial.read();
    } else {
      data[k] = myKeypad.waitForKey();
    }
    if(data[k]) {
      lcd.setCursor(k,1);
      lcd.print(data[k]);
      delay(500);
      k++;
    }
  }
 
  z = 1;
  while(z) {
    // Se asteapta tasta '#' pentru confirmarea parolei
    if (t) {
      confirmButton = myKeypad.waitForKey();
    } else {
      confirmButton = Serial.read();
    }
    if(confirmButton == '#') {
      z = 0;
      // Daca parola este corecta
      if(strncmp(data, password, 4) == 0) { 
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Correct pass");
        digitalWrite(LOCK, HIGH);
        delay(3000);
        digitalWrite(LOCK, LOW);
 
      // Daca s-a introdus codul de resetare
      } else if(strncmp(data, resetCode, 4) == 0){
        clearData();
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Enter old pass:");
        while (k < 4) {
          data[k] = myKeypad.waitForKey();
          if(data[k]) {
            lcd.setCursor(k,1);
            lcd.print(data[k]);
            delay(500);
            k++;
          }
        }
 
        // Daca parola veche introdusa este corecta
        if (strncmp(data, password, 4) == 0) {
          clearPassword();
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Enter new pass:");
          while(k < 4) {
            password[k] = myKeypad.waitForKey();
            if(password[k]) {
              lcd.setCursor(k,1);
              lcd.print(password[k]);
              delay(500);
              k++;
            }
          }  
 
        // Daca parola veche introdusa este gresita
        } else {
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Wrong old pass:");
          delay(1000);
        }
 
      // Daca parola initiala introdusa este gresita
      } else { 
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Incorrect pass");
        delay(3000);
      }
 
    // Daca se introduce din greseala alta tasta in afara de #  
    } else {
      lcd.clear();
      lcd.print("Press #");
      delay(1000);
    }
    clearData();
  } 
 
  lcd.clear();
}
void clearData() {
  while (k != 0) {
    data[k] = 0;
    k = k - 1;
  }
  return;
}
 
void clearPassword() {
  while (k != 0) {
    password[k] = 0;
    k = k - 1;
  }
  return;
} 

Rezultate Obţinute

In urma proiectului, am obtinut o macheta cu tastatura si afisajul LCD, cu o mica usa ce se va putea deschide la deblocarea incuietorii, care functioneaza conform ciclului descris mai sus.

Concluzii

A fost un proiect interesant, aplicat, in care am simtit ca am pus la folosinta conceptele si tehnicile dobandite in cadrul laboratoarelor, dar am avut parte si de experiente noi, utilizand anumite module unice.

Download

332cb_protopopescu_theodor_fancy_door_lock.zip

Bibliografie/Resurse

Export to PDF