This shows you the differences between two versions of the page.
|
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 ===== | ||