Sunteți pe pagina 1din 9

Proiectare cu microprocesoare

Seif – Arduino

PROIECT de SEMESTRU

Catedra de Calculatoare

Disciplina : Proiectarea cu microprocesoare

Profesor: Mihai Traistaru

Studenti: Ilie Neag

Nechiti Radu

Grupa: 30234
Contents
1. Cerinte functionale.............................................................................................................................. 3
2. Analiza problemei ............................................................................................................................... 3
3. Implementare ...................................................................................................................................... 5
4. Concluzii si dezvoltari ulterioare ....................................................................................................... 8
5. Bibliografie .......................................................................................................................................... 9
1. Cerinte functionale
Sa se proiecteze folosind sistemul de intreruperi cifrul unui seif folosind un
sistem Arduino care va avea urmatorul mod de functionare: Initial utilizatorul va
seta o parola. Dupa setarea parolei cu succes, utilizatorul va avea sansa sa se
autentifice doar cu acea parola. La introducerea de 3 ori in mod repetat a unei
parole gresite, cifrul va intra intr-un mod protectie ce nu va mai accepta
introducerea parolei pentru fix 3 minute. Intrarea in modul protectie ii va fi
semnalizata utilizatorului sonor si visual, iar acesta nu va putea schimba nici parola
in acest timp. In afara modului protective, utilizatorul poate sa solicite cifrului
schimbarea parolei si introducerea parolei corecte de oricate ori. Ca input se va
folosi doar Serial Monitor, iar ca output Serial Monitor si difuzorul

2. Analiza problemei
Pentru a putea implementa correct cerinta problemei este esential sa intelegem
functionarea Serial Monitorului. Acesta este un terminal separat ( o fereastra ) care
comunica cu Arduino atat prin trimitere de date cat si prin primire.
Funcțiile print şi println ale clasei Serial trimit date pe portul serial. Diferența
este ca println() adaugă un caracter rând nou (‘\n’) si un caracter „carriage return”
(‘\r’) la finalul mesajului transmis. Pentru numere transmise puteți specifica si un
format de transmitere a datelor (HEX, DEC etc.)
Funcția begin() setează viteza de comunicație, in biți/secunda (baud rate).
Pentru comunicația cu computerul se folosesc în general următoarele viteze.
Funcția read() citește datele venite prin interfața seriala. Sintaxa este următoare:
IncomingByte = Serial.read();
Funcția write() trimite un octet sau o succesiune de octeți. Pentru a trimite totuși
numere se recomanda folosirea funcției print().
Urmatoarea componenta este difuzorul care poate fi conectat direct pe unul
dintre pinii PWM ai placii pentru a crea efecte sonore sau melodii.
3. Implementare

In implementarea proiectului am folosit IDE-ul oferit de Arduino. O placuta


Arduino MEGA2560 un difuzor si un led.
//includem libraria de LCD
#include <LiquidCrystal.h>
String inputString = ""; // cream un string care sa ne tina datele care vin pe serial
// conditie pentru verificare daca stringul este complet (s-a apasat enter)
/*
* Folosinm variabile de tip boolean pe post de flaguri pentru a ne conditiona
programu sa intre in anumite moduri
* (logat, delogat, schimbare parola, blocat )
*/
boolean stringComplete = false;
boolean setareParola = false;
String parola="";
int incercari=0;
boolean protectie = false;
boolean logat = false;
boolean schimbare = false;

void setup() {
// initializare interfata seriala
Serial.begin(9600); // format frame serial implicit
// rezervam 200 de octeti pentru sirul de preluare a datelor de intrare
inputString.reserve(200);
Serial.println("Introduceti o parola initiala");
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{

inputString=citire(); // functia de citire


/*
* Acest if ne conditioneaza setarea initiala a parolei
*/
if(inputString.length()>0 && !setareParola)
{
parola = inputString;
inputString="";
setareParola = true;
Serial.println("Parola initiala a fost setata cu succes.");
Serial.println("Introduceti parola pentru a va loga");
}
/*
* Verificam daca flagul de protectie este adevarat deoarece atunci cand se iese
din modul protectie
* bufferul stringului introdus de la tastatura acumuleaza caractere, acestea
trebuind excluse, atata timp
* cat ne aflam in modul protectie.
* Am verificat primadata aceasta conditie deoarece avem 2 cazuri in modul
protectie:
* -cand se incearca introducerea unei parole in modul protectie ( buffer plin )
* -cand nu se introduce nimic in modul protectie ( buffer gol )
* Acest if pus la inceput rezolva problemele care apar atunci cand incercam sa ne
logam dupa modul protectie
*/
if(protectie)
{
protectie=false;
}
/*
* Se verifica daca s-a introdus ceva in Seriam Monitor
*/
else if(inputString.length()>0)
{
/*
* Daca acest flag este activat ne aflam in modul de schimbare a parolei
*/
if(schimbare)
{
parola=inputString;
schimbare=false;
Serial.println("Parola a fost schimbata cu succes");
Serial.println("Apasati tasta 1 pentru schimbare parola");
Serial.println("Apasati tasta 2 pentru delogare");
}
/*
* Daca acest flag nu este activat inseamna ca nu suntem logati
* In cadrul lui avem 2 optiuni:
* -stringul introdus este parola curenta -> intram in modul logat
* -stringul introdus este o parola incorecta -> numarul de incercari creste
-> daca este > 3 -> mod protectie
*/
else if(!logat)
{
if(inputString == parola)
{
incercari=0;
logat=true;
Serial.println("V-ati logat cu succes");
Serial.println("Apasati tasta 1 pentru schimbare parola");
Serial.println("Apasati tasta 2 pentru delogare");
}
else
{
incercari++;
Serial.println("Parola incorecta");
Serial.println("Introduceti parola pentru a va loga");
}
}
/*
* Daca acest flag este activat inseamna ca suntem logat
* In cadrul lui avem 2 optiuni:
* -schimbarea parolei -> mod schimbare parola
* -delogare -> mod delogat
* In cadrul acestui if se ignora orice altceva introdus de la tastatura in
afara de 1 si 2
*/
else if(logat)
{
if(inputString=="1")
{
schimbare=true;
Serial.println("Introduceti o noua parola");
}
else if(inputString=="2")
{
logat=false;
Serial.println("V-ati delogat cu succes");
}
else
{
Serial.println("Sunteti logat");
Serial.println("Apasati tasta 1 pentru schimbare parola");
Serial.println("Apasati tasta 2 pentru delogare");
}
}
/*
* Aici se activeaza modul protectie
* Se activeaza difuzorul si ledul care semnalizeaza acest lucru
* Difuzorul este onectat la pinul 8 si emite semnale la 220 Hz
*
* Modul protectie tine 5 secunde
*/
if(incercari==3)
{
for(int i = 5000; i>=0; i=i-1000)
{
tone(8,220);
digitalWrite(LED_BUILTIN, HIGH);
Serial.print("Mod protectie: " );
Serial.println(i/1000);
delay(1000);
}
noTone(8);
digitalWrite(LED_BUILTIN, LOW);
incercari=0;
protectie=true;
inputString="";
Serial.println("Introduceti parola pentru a va loga");
}
inputString=""; //resetam bufferul
}
}
/*
* Atat timp cat Serial Monitor este disponibil se citeste caracter cu caracter si se
concateneaza intr-un string pe care
* il returnam in programul principal
*/
String citire()
{
String best;
while(Serial.available())
{
delay(2);
char c = Serial.read();
best += c ;
}
return best;
}

4. Concluzii si dezvoltari ulterioare

Aceasta este prima versiune a aplicatiei. In timp, aceasta poate sa fie


inbunatatita cu diverse optiuni. O posibila dezvoltare ulterioara ar fi posibilitatea
de a exista mai multi useri sau anuntarea prin difuzor a starii seifului. O alta
dezvoltare ulterioara este afisarea comenzilor pe un ecran LCD.
5. Bibliografie

http://users.utcluj.ro/~rdanescu/pmp-lab05.pdf
https://learn.adafruit.com/adafruit-arduino-lesson-5-the-serial-monitor/the-serial-
monitor
https://stackoverflow.com/

S-ar putea să vă placă și