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/29 20:05]
mihai.cosor [Download]
pm:prj2023:vstoica:sistem-alarma-cosor-mihai [2023/05/29 20:49] (current)
mihai.cosor [Software Design]
Line 57: Line 57:
 </​note>​ </​note>​
  
 +Biblioteci utilizate
 <code C> <code C>
- // todo+    #include <​Keypad.h>​ 
 +    #include <​Wire.h>​  
 +    #include <​LiquidCrystal_I2C.h>​ 
 +    #include <​SPI.h>​ 
 +    #include <​MFRC522.h>​
 </​code>​ </​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 =====
  
pm/prj2023/vstoica/sistem-alarma-cosor-mihai.1685379925.txt.gz · Last modified: 2023/05/29 20:05 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