This shows you the differences between two versions of the page.
pm:prj2022:sionescu:rfidparking [2022/05/24 16:38] razvan.vilciu [Software Design] |
pm:prj2022:sionescu:rfidparking [2022/05/24 18:38] (current) razvan.vilciu [Concluzii] |
||
---|---|---|---|
Line 39: | Line 39: | ||
</note> | </note> | ||
- | ===== Software Design ===== | + | ===== Software Design, Detalii Implementare ===== |
- | + | ||
- | + | ||
<note tip> | <note tip> | ||
- | ==== Detalii Implementare ==== | ||
- | |||
Am folosit bibliotecile | Am folosit bibliotecile | ||
- | ``` | + | |
- | #include <SPI.h> - RFID communication | + | #include <SPI.h> - RFID communication |
- | #include <MFRC522.h> - RFID | + | #include <MFRC522.h> - RFID |
- | #include <Servo.h> | + | #include <Servo.h> |
- | #include <Wire.h> | + | #include <Wire.h> |
- | #include <LiquidCrystal_I2C.h> | + | #include <LiquidCrystal_I2C.h> |
- | #include <string.h> | + | #include <string.h> |
- | ``` | + | |
- | Am pornit din exemplul _DumpInfo_ din biblioteca MFRC522, care afiseaza datele unui tag detectat, din care am selectat UID-ul acestuia. De acolo am creat vectorul (strings) de taguri acceptate, vectorul de masini in parcare, logica acceptarii in parcare, interactiunea/oferirea de informatii prin intermediul display-ului, buzzer-ului, semaforului. | + | Am pornit din exemplul **DumpInfo** din biblioteca MFRC522, care afiseaza datele unui tag detectat, din care am selectat UID-ul acestuia. De acolo am creat vectorul (de strings) de taguri acceptate, vectorul de masini in parcare, logica acceptarii in parcare, interactiunea/oferirea de informatii prin intermediul display-ului, buzzer-ului, semaforului. |
Functia de loop: | Functia de loop: | ||
- | ``` | + | void loop() |
- | void loop() | + | { |
- | { | + | lcd.createChar(0, smiley); |
- | lcd.createChar(0, smiley); | + | lcd.createChar(1, frown); |
- | lcd.createChar(1, frown); | + | |
+ | if(getPresentCars() == CAPACITY ) | ||
+ | display_fullMessage(); | ||
+ | else | ||
+ | display_WelcomeCounter(); | ||
| | ||
- | if(getPresentCars() == CAPACITY ) | + | lightsRed(); // by default the gate is lowered |
- | display_fullMessage(); | + | |
- | else | + | |
- | display_WelcomeCounter(); | + | |
- | + | ||
- | lightsRed(); // by default the gate is lowered | + | |
| | ||
- | // Look for new cards | + | // Look for new cards |
- | if ( ! mfrc522.PICC_IsNewCardPresent()) | + | if ( ! mfrc522.PICC_IsNewCardPresent()) |
- | return; | + | return; |
- | + | ||
- | // Select one of the cards | + | |
- | if ( ! mfrc522.PICC_ReadCardSerial()) | + | |
- | return; | + | |
| | ||
- | String tag = getTagID(); | + | // Select one of the cards |
+ | if ( ! mfrc522.PICC_ReadCardSerial()) | ||
+ | return; | ||
| | ||
- | // accepted tag and free slots in the parking area | + | |
- | if (validTag(tag) && (getPresentCars() != CAPACITY || is_carPresent(tag)) ) | + | String tag = getTagID(); |
- | { | + | |
+ | // accepted tag and free slots in the parking area | ||
+ | if (validTag(tag) && (getPresentCars() != CAPACITY || is_carPresent(tag)) ) | ||
+ | { | ||
| | ||
- | if (!is_carPresent(tag)) | + | if (!is_carPresent(tag)) |
addCar(tag); | addCar(tag); | ||
- | else | + | else |
removeCar(tag); | removeCar(tag); | ||
| | ||
- | lightsYellow(); | + | lightsYellow(); |
| | ||
- | tone(BUZZER_PIN, 6644, 250); // acceptance okay-ish sound | + | tone(BUZZER_PIN, 6644, 250); // acceptance okay-ish sound |
- | raiseGate(); | + | raiseGate(); |
- | lightsGreen(); | + | lightsGreen(); |
| | ||
- | delay(2500); | + | delay(2500); |
| | ||
- | lightsYellow(); | + | lightsYellow(); |
- | lowerGate(); | + | lowerGate(); |
- | } | + | } |
- | + | | |
- | else { | + | else { |
- | lightsFail(); | + | lightsFail(); |
- | buzzerFail(); | + | buzzerFail(); |
- | delay(3000); | + | delay(3000); |
- | } | + | } |
- | } | + | } |
- | ``` | + | |
+ | Implementarea functiilor din loop poate fi vazuta in fisiserul //parking.ino// din arhiva aflata in sectiunea **Download**. | ||
+ | |||
+ | * 1. Se verifica numarul de masini prezente in parcare si se afiseaza mesajul corespunzator | ||
+ | {{:pm:prj2022:sionescu:free_slots.jpeg?300|}} {{:pm:prj2022:sionescu:no_slots.jpeg?300|}} | ||
- | 1. Se verifica numarul de masini prezente in parcare si se afiseaza mesajul corespunzator | ||
- |   | ||
- | 2. By default, bariera este data jos, deci si semaforul ar trebui sa aiba lumina rosie aprinsa | + | * 2. By default, bariera este data jos, deci si semaforul ar trebui sa aiba lumina rosie aprinsa |
- | 3. Se verifica daca exista un tag prezent si daca se poate citi. Daca nu este unul prezent se returneaza pentru optimizare | + | * 3. Se verifica daca exista un tag prezent si daca se poate citi. Daca nu este unul prezent se returneaza pentru optimizare |
- | 4. Daca exista, atunci se identifica UID-ul acestuia | + | * 4. Daca exista, atunci se identifica UID-ul acestuia |
- | 1. Daca este un card valid (*) ridicam bariera, scoatem un sunet de OK, schimbam culoarea semaforului. Dupa un timp se coboara bariera, se schimba culoarea semaforului iarasi si actualizam numarul de masini prezente din parcare, lucru ce va fi afisat si pe ecran. | + | * 4.1. Daca este un card valid **(*)** ridicam bariera, scoatem un sunet de OK, schimbam culoarea semaforului. Dupa un timp se coboara bariera, se schimba culoarea semaforului iarasi si actualizam numarul de masini prezente din parcare, lucru ce va fi afisat si pe ecran. |
- | 2. Daca nu este un card valid, semaforul va palpai rosu, iar buzzer-ul va scoate un sunet de eroare | + | * 4.2. Daca nu este un card valid, semaforul va palpai rosu, iar buzzer-ul va scoate un sunet de eroare |
- | _(*) - In realitate nu se verifica doar daca este un tag valid. Verificam de asemenea si daca masina doreste sa iasa din parcare sau sa intre. Daca masina vrea sa iasa se va ridica bariera si aici se termina acest caz, dar daca masina vrea sa intre intai trebuie sa fie indeajuns de multe locuri disponibile in parcare, altfel se trece in rutina de fail precizata la 4.2._ | + | //**(*)** - In realitate nu se verifica doar daca este un tag valid. Verificam de asemenea si daca masina doreste sa iasa din parcare sau sa intre. Daca masina vrea sa iasa se va ridica bariera si aici se termina acest caz, dar daca masina vrea sa intre intai trebuie sa fie indeajuns de multe locuri disponibile in parcare, altfel se trece in rutina de fail precizata la 4.2.// |
</note> | </note> | ||
- | ===== Rezultate Obţinute ===== | + | ===== Rezultate Obţinute, Video Demo ===== |
<note tip> | <note tip> | ||
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
+ | Pentru vizualizarea unui exemplu de utilizare se poate apasa pe imagine (link spre youtube). In exemplu se poate observa rutina urmatoare: | ||
+ | - tag invalid | ||
+ | - primul tag valid | ||
+ | - al doilea tag valid (parcarea este plina acum) | ||
+ | - tag valid X(care nu este in parcare), dar parcarea este plina -> fail | ||
+ | - tag valid care este in parcare -> parcarea nu mai este plina | ||
+ | - tag valid X care poate intra acum (exista loc in parcare) | ||
+ | |||
+ | [[https://youtube.com/shorts/jZHgwupQuRk?feature=share|{{:pm:prj2022:sionescu:click-here-button.jpg?200}}]] | ||
+ | |||
</note> | </note> | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Desi pare simplist, proiectul poate avea o grad de utilitate destul de mare, prin parcarile private, rezidentiale etc. Pentru a fi folosite in aceste spatii ar fi nevoie totusi de un motor cu putere mult mai mare pentru a putea misca barierele/portile. | ||
===== Download ===== | ===== Download ===== | ||
<note warning> | <note warning> | ||
- | 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:prj2022:sionescu:smart-parking.rar|}} |
- | + | ||
- | 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 Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | + | |
</note> | </note> | ||