Differences

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

Link to this comparison view

pm:prj2023:vstoica:sistem-alarma-cosor-mihai [2023/05/24 00:10]
mihai.cosor [Rezultate Obţinute]
pm:prj2023:vstoica:sistem-alarma-cosor-mihai [2023/05/29 20:49] (current)
mihai.cosor [Software Design]
Line 3: Line 3:
  
 <note tip> <note tip>
-Ideea mi-a venit gandindu-ma la usile pe care scrie "Acces interzis"​ dar defapt ​nu sunt securizate in vreun fel. Proiectul consta intr-un senzor ultrasonic care detecteaza trecerea unui om prin fata lui care implica un buzzer sa scoata un sunet. Sunetul se poate opri daca persoana in cauza are o cartela autorizata si o foloseste in apropierea unui modul rfid sau daca introduce o parola corecta la tastatura. De asemenea, cartela / codul se poate folosi si inainte de trecerea prin fata senzorului pentru a-l deactiva o perioada scurta de timp. Tastatura suporta multe actiuni precum: adaugare / stergere parole noi (doar daca introduci codul de admin), stergere caractere in timpul introducerii parolei, iesire din functia selectata. Aceasta vine insotita cu un LCD care ofera mesaje sugestive la fiecare pas.+Ideea mi-a venit gandindu-ma la usile pe care scrie "Acces interzis"​ dar de fapt nu sunt securizate in vreun fel. Proiectul consta intr-un senzor ultrasonic care detecteaza trecerea unui om prin fata lui care implica un buzzer sa scoata un sunet. Sunetul se poate opri daca persoana in cauza are o cartela autorizata si o foloseste in apropierea unui modul rfid sau daca introduce o parola corecta la tastatura. De asemenea, cartela / codul se poate folosi si inainte de trecerea prin fata senzorului pentru a-l deactiva o perioada scurta de timp. Tastatura suporta multe actiuni precum: adaugare / stergere parole noi (doar daca introduci codul de admin), stergere caractere in timpul introducerii parolei, iesire din functia selectata. Aceasta vine insotita cu un LCD care ofera mesaje sugestive la fiecare pas.
 Proiectul poate fi util pentru scenariul descris mai sus, dar si ca element de securitate al propriei case. Proiectul poate fi util pentru scenariul descris mai sus, dar si ca element de securitate al propriei case.
 </​note>​ </​note>​
Line 57: Line 57:
 </​note>​ </​note>​
  
 +Biblioteci utilizate
 +<code C>
 +    #include <​Keypad.h>​
 +    #include <​Wire.h> ​
 +    #include <​LiquidCrystal_I2C.h>​
 +    #include <​SPI.h>​
 +    #include <​MFRC522.h>​
 +</​code>​
 +
 +Setup module / senzori / butoane:
 +<code C>
 +    void setup() {
 +      // LCD setup
 +      lcd.init();
 +      lcd.backlight();​
 +      lcd.clear();​
 +      lcd.setCursor(1,​ 0);
 +      lcd.print("​Welcome home!"​);​
 +
 +      // RFID setup
 +      SPI.begin();​
 +      mfrc522.PCD_Init();​
 +
 +      // Ultrasonic setup
 +      pinMode(trigPin,​ OUTPUT);
 +      pinMode(echoPin,​ INPUT);
 +
 +      // Buton de panica setup
 +      pinMode(INTERRUPT_PIN,​ INPUT_PULLUP);​
 +      attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN),​ panic, CHANGE);
 +
 +      // Parole reset
 +      initPasswords();​
 +    }
 +</​code>​
 +
 +Functia de loop verifica alarma si accepta input de la tastatura pentru unul din 3 scenarii:
 +<code C>
 +    void loop() {
 +      checkAlarm();​
 +      char key = keypad.getKey();​
 +      ​
 +      if (key){
 +        switch (key) {
 +          case ADD_PASSWORD:​
 +            add_password();​
 +            break;
 +          case DELETE_PASSWORD:​
 +            delete_password();​
 +            break;
 +          case SEND_PASSWORD:​
 +            send_password();​
 +            break;
 +          default:
 +            break;
 +        }
 +      }
 +    }
 +</​code>​
 +
 +Functia de verificare per total a alarmei:
 +<code C>
 +    bool checkAlarm() {
 +      if (isPanic) { // verificare buton de panica
 +        lcd.clear();​
 +        lcd.setCursor(3,​ 0);
 +        lcd.print("​EMERGENCY!"​);​
 +        startAlarm();​
 +        return true;
 +      }
 +
 +      if (isAuthorized) { // verificare daca s-a introdus cartela/cod inainte
 +        countdown();​ // countdown pana se reporneste senzorul
 +        isAuthorized = false;
 +        return false;
 +      }
 +      ​
 +      if (getID()) { // verificare existenta cartela
 +        if (tagID == MasterTag) {
 +          countdown();​
 +          return false;
 +        } else {
 +          lcd.clear();​
 +          lcd.print("​Not a valid card"​);​
 +        }
 +      }
 +
 +      if (isObstacleInFront()) { // verificare obstacol in fata senzorului
 +        lcd.clear();​
 +        lcd.print("​INTRUDER ALERT!"​);​
 +        startAlarm();​
 +        return true;
 +      }
 +
 +      return false;
 +    }
 +</​code>​
 +
 +Functiile de citire senzor ultrasonic si calculare distanta si  decidere daca exista obstacol in fata la 30 de cm sau nu.
 +<code C>
 +    int getDistance() {
 +      digitalWrite(trigPin,​ LOW);
 +      delayMicroseconds(2);​
 +
 +      digitalWrite(trigPin,​ HIGH);
 +      delayMicroseconds(10);​
 +      digitalWrite(trigPin,​ LOW);
 +
 +      duration = pulseIn(echoPin,​ HIGH);
 +      distance = duration * 0.034 / 2; // formula distanta conform vitezei sunetului
 +
 +      return distance;
 +    }
 +
 +    /*
 +    * Verificare senzor ultrasonic
 +    */
 +    bool isObstacleInFront() {
 +      int distance = getDistance();​
 +      if (distance < 30) {
 +        return true;
 +      }
 +
 +      return false;
 +    }
 +</​code>​
 +
 +Functia de verificare a existentei cartelei in apropierea modului RFID si de citire a acesteia.
 +<code C>
 +    bool getID() ​ {
 +      // Getting ready for Reading PICCs
 +      if (!mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
 +        return false;
 +      }
 +      if (!mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
 +        return false;
 +      }
 +
 +      tagID = "";​
 +      for (uint8_t i = 0; i < 4; i++) { // The MIFARE PICCs that we use have 4 byte UID
 +        //​readCard[i] = mfrc522.uid.uidByte[i];​
 +        tagID.concat(String(mfrc522.uid.uidByte[i],​ HEX)); // Adds the 4 bytes in a single String variable
 +      }
 +
 +      tagID.toUpperCase();​
 +      mfrc522.PICC_HaltA();​ // Stop reading
 +      ​
 +      return true;
 +    }
 +</​code>​
 +
 +
 +Restul functiilor folosite, doar semnaturile deoarece cele de add / send / delete sunt asemanatoare in primirea si handle-uirea inputului de la tastatura.
 +<code C>
 +/*
 + * Constante si initializari necesare programului in sine
 + */
 +enum state {ACCEPTED, DENIED, WAITING};
 +const byte NUMBER_OF_PASSWORDS = 10;
 +byte FREE_SPACE_PASSWORDS = 10;
 +long passwords[NUMBER_OF_PASSWORDS];​
 +const long MASTER_KEY = 2001;
 +bool isAuthorized = false;
 +
 +/*
 + * Initializare vector de parole
 + */
 +void initPasswords() {...}
 +
 +/*
 + * Verificare parola
 + */
 +state checkPassword(long password) {...}
 +
 +/*
 + * Verificare parola admin 
 + */
 +bool checkMasterKey() {...}
 +
 +/*
 + * Adaugare parola noua
 + */
 +void add_password() {...}
 +
 +/*
 + * Stergere parola
 + */
 +void delete_password() {...}
 +
 +/*
 + * Introducere parola pentru verificare
 + */
 +void send_password() {...}
 +
 +/*
 + * Start alarma
 + */
 +void startAlarm() {...}
 +</​code>​
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
Line 65: Line 264:
 </​html>​ </​html>​
  
 +{{:​pm:​prj2023:​vstoica:​mihai-cosor-1.jpeg?​400|}}
  
 +{{:​pm:​prj2023:​vstoica:​mihai-cosor-2.jpeg?​400|}}
 +
 +{{:​pm:​prj2023:​vstoica:​mihai-cosor-3.jpeg?​400|}}
  
 </​note>​ </​note>​
Line 78: Line 281:
 ===== Download ===== ===== Download =====
  
-<​note ​warning+<​note>​ 
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului:​ surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). +{{pm:prj2023:vstoica:cosormihai332ca-pm.zip| Sursa, diagramescheme, poze}}
- +
-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 Alin331CC -> **:​pm:​prj2009:​cc:​dumitru_alin**.+
 </​note>​ </​note>​
- 
- 
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
pm/prj2023/vstoica/sistem-alarma-cosor-mihai.1684876236.txt.gz · Last modified: 2023/05/24 00:10 by mihai.cosor
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