This shows you the differences between two versions of the page.
pm:prj2023:vstoica:sistem-alarma-cosor-mihai [2023/05/29 20:04] mihai.cosor [Software Design] |
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 ===== | ||
Line 87: | Line 282: | ||
<note> | <note> | ||
- | {{pm:prj2023:vstoica:sistem-alarma-cosor-mihai.zip| Sursa, diagrame, scheme, poze}} | + | {{pm:prj2023:vstoica:cosormihai332ca-pm.zip| Sursa, diagrame, scheme, poze}} |
</note> | </note> | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== |