This shows you the differences between two versions of the page.
pm:prj2023:vstoica:fire_alarm [2023/05/28 23:44] tudor.selea [Software Design] |
pm:prj2023:vstoica:fire_alarm [2023/05/29 19:06] (current) tudor.selea [Software Design] |
||
---|---|---|---|
Line 40: | Line 40: | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | Implementarea software a proiectului poate fi reprezentata prin urmatoarea diagrama de stari: | ||
+ | |||
+ | {{:pm:prj2023:vstoica:diagrama_de_stari_-_pm.drawio.png?700|}} | ||
<note tip> | <note tip> | ||
Line 192: | Line 195: | ||
<code c> | <code c> | ||
- | digitalWrite(LED, LOW); | + | digitalWrite(LED, LOW); |
digitalWrite(buzzer, HIGH); | digitalWrite(buzzer, HIGH); | ||
lcd.setCursor(0, 0); | lcd.setCursor(0, 0); | ||
Line 202: | Line 205: | ||
+ | **Receiver_pm.ino** | ||
+ | |||
+ | <note tip> | ||
+ | Acest fisier este incarcat pe placuta care controleaza: | ||
+ | * **Keypad-ul** | ||
+ | </note> | ||
+ | |||
+ | In "alarm_trigger" va fi retinuta variabila trimisa de prima placuta Arduino, care va semnala declansarea alarmei. Matricea "keys" retine simbolurile keypad-ului, ROWS si COLS retin dimensiunile keypad-ului, iar rowPins si colPins retin pinii alocati pentru fiecare linie si coloana din keypad. Pe baza acestor variabile se va face maparea keypad-ului la Arduino. | ||
+ | <code c> | ||
+ | #include <Keypad.h> | ||
+ | |||
+ | #define PASSWORD_LENGTH 10 | ||
+ | |||
+ | char alarm_trigger; | ||
+ | |||
+ | // Parola introdusa de utilizator | ||
+ | char password[PASSWORD_LENGTH]; | ||
+ | |||
+ | // Parola corecta | ||
+ | char correct_password[PASSWORD_LENGTH]="13468*#AD"; | ||
+ | char count = 0; | ||
+ | |||
+ | // Keypad-ul are 4 linii si 4 coloane | ||
+ | const byte ROWS = 4; | ||
+ | const byte COLS = 4; | ||
+ | |||
+ | // Simbolurile keypad-ului | ||
+ | char keys[ROWS][COLS] = { | ||
+ | {'1', '2', '3', 'A'}, | ||
+ | {'4', '5', '6', 'B'}, | ||
+ | {'7', '8', '9', 'C'}, | ||
+ | {'*', '0', '#', 'D'} | ||
+ | }; | ||
+ | |||
+ | // Pinii arduino corespunzatori tuturor coloanelor si liniilor | ||
+ | // keypad-ului | ||
+ | byte rowPins[ROWS] = {9, 8, 7, 6}; | ||
+ | byte colPins[COLS] = {5, 4, 3, 2}; | ||
+ | |||
+ | // Vom genera un keypad pe baza dimensiunilor si a simbolurilor setate | ||
+ | // de programator | ||
+ | Keypad customKeypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); | ||
+ | </code> | ||
+ | |||
+ | Daca nu exista conectivitate cu prima placuta Arduino, nu pot fi citite date pe portul serial. | ||
+ | |||
+ | Daca exista conectivate, se va citi semnalul de alarma trimis de catre prima placuta Arduino in "alarm_trigger". Daca acesta este 1, alarma a fost declansata, astfel ca poate fi introdus codul pentru dezactivarea acesteia. Fiecare tasta apasata de utilizator va fi retinuta in variabila "customKey" si va fi adaugata in array-ul "password", care reprezinta parola introdusa de utilizator. Daca dimensiunea parolei introduse de utilizator este egala cu dimensiunea parolei corecte, se vor compara cele 2 parole. In caz de egalitate (utilizatorul a introdus parola corecta), prima placuta Arduino va fi instiintata de catre a doua placuta Arduino (placuta curenta), ca poate sa dezactiveze alarma, iar keypad-ul va fi dezactivat pana la urmatoarea declansarea a alarmei. In caz contrar, se va reincerca introducerea parolei corecte. | ||
+ | <code c> | ||
+ | void loop(){ | ||
+ | |||
+ | // Daca nu exista conectivitate cu prima placuta Arduino | ||
+ | // nu pot fi citite date pe portul serial | ||
+ | if (Serial.available()) { | ||
+ | Serial.print("In serial loop..."); | ||
+ | Serial.println(); | ||
+ | |||
+ | // Variabila care semnaleaza declansarea alarmei | ||
+ | alarm_trigger = Serial.read(); | ||
+ | | ||
+ | if (alarm_trigger == 1) { | ||
+ | Serial.print("Alarm triggered..."); | ||
+ | Serial.println(); | ||
+ | |||
+ | // Daca alarma a fost declansata, se va incerca | ||
+ | // introducerea parolei pana cand este cea corecta | ||
+ | while(1) { | ||
+ | |||
+ | // Tasta apasata de utilizator va fi intoarsa in | ||
+ | // variabila "customKey" | ||
+ | char customKey = customKeypad.getKey(); | ||
+ | |||
+ | if(customKey){ | ||
+ | | ||
+ | // Caracterul corespunzator tastei apasate de | ||
+ | // utilizator va fi adaugat in parola introdusa | ||
+ | // de utilizator | ||
+ | password[count]=customKey; | ||
+ | Serial.print(password[count]); | ||
+ | count++; | ||
+ | } | ||
+ | |||
+ | // In momentul in care lungimea parolei introduse | ||
+ | // de utilizator este egala cu lungimea parolei | ||
+ | // corecte, se va verifica daca parola introdusa | ||
+ | // de utilizator este corecta | ||
+ | if(count == PASSWORD_LENGTH - 1){ | ||
+ | Serial.println(" "); | ||
+ | |||
+ | if(strcmp(password,correct_password) == 0){ | ||
+ | |||
+ | // Dupa verificarea parolei introduse de | ||
+ | // utilizator, aceasta va fi stearsa si pregatita | ||
+ | // pentru reintroducerea parolei, cand va fi cazul | ||
+ | while(count !=0) { | ||
+ | password[count]=0; | ||
+ | count--; | ||
+ | } | ||
+ | |||
+ | // Daca parola introdusa de utilizator este corecta, | ||
+ | // prima placuta Arduino va fi instiintata de catre | ||
+ | // a doua placuta Arduino (placuta curenta), ca poate | ||
+ | // sa dezactiveze alarma | ||
+ | Serial.println("Correct"); | ||
+ | alarm_trigger = 0; | ||
+ | Serial.write(alarm_trigger); | ||
+ | break; | ||
+ | |||
+ | } else{ | ||
+ | |||
+ | // Daca parola introdusa de utilizator este incorecta, | ||
+ | // se va reincerca introducerea parolei | ||
+ | Serial.println("Incorrect"); | ||
+ | alarm_trigger = 1; | ||
+ | } | ||
+ | |||
+ | while(count !=0){ | ||
+ | password[count]=0; | ||
+ | count--; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | <note> | ||
+ | Dupa introducerea unei parole de catre utilizator, aceasta va fi stearsa! | ||
+ | </note> | ||
+ | |||
+ | |||
+ | ===== Rezultate obtinute ===== | ||
+ | {{:pm:prj2023:vstoica:poza_pm1.jpg?700|}}\\ | ||
+ | {{:pm:prj2023:vstoica:poza_pm4_1.jpg?700|}}\\ | ||
+ | {{:pm:prj2023:vstoica:poza_pm3.jpg?700|}}\\ | ||
+ | {{:pm:prj2023:vstoica:poza_pm2.jpg?700|}}\\ | ||
+ | |||
+ | ===== Concluzii ===== | ||
+ | |||
+ | Mi-a placut sa lucrez la acest proiect intrucat am putut sa pun in practica notiunile invatate la laboratoare pentru a realiza un lucru cu aplicatie in viata. Mi-a placut, in special, sa lucrez cu componentele proiectului si sa observ cum se leaga si cum comunica intre ele. | ||
+ | |||
+ | ===== Download ===== | ||
+ | {{:pm:prj2023:vstoica:selea_tudor_octavian_-_332ca_-_proiect_pm.zip|}} | ||
+ | |||
+ | ===== Resurse ===== | ||
+ | * https://ocw.cs.pub.ro/courses/pm/lab/lab4-2022 | ||
+ | * https://ocw.cs.pub.ro/courses/pm/lab/lab1-2022 | ||
+ | * https://ocw.cs.pub.ro/courses/pm/lab/lab6-2022 | ||
+ | * https://www.youtube.com/watch?v=sPhcOm3FdOQ&t=254s&ab_channel=DomingoMartinez | ||
+ | * https://linuxhint.com/serial-uart-communication-between-two-arduino/ | ||
+ | * Proiect AD - Selea Tudor-Octavian (vezi sectiunea Downloads) | ||