This is an old revision of the document!
Theodor Protopopescu, 332CB
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.
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.
Proiectul a fost programat exclusiv in ArduinoIDE.
Am folosit 3 biblioteci auxiliare, pentru utilizarea LCD-ului cu modul I2C si pentru utilizarea Keypad-ului.
#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; }
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.