Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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)
  
pm/prj2023/vstoica/fire_alarm.1685306695.txt.gz · Last modified: 2023/05/28 23:44 by tudor.selea
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0