Differences

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

Link to this comparison view

pm:prj2025:iotelea:emilian.horduna [2025/05/15 00:29]
emilian.horduna [Hardware Design]
pm:prj2025:iotelea:emilian.horduna [2025/05/27 19:22] (current)
emilian.horduna [Bibliografie/Resurse]
Line 35: Line 35:
 - blocarea automată a ușii. - blocarea automată a ușii.
  
-{{:​pm:​prj2025:​iotelea:​emi-schema-bloc_1_.png?700}}+{{:​pm:​prj2025:​iotelea:​emi-schema-bloc2.drawio.png?700|}} 
 + 
 +Actor → Keypad 4x4 → Arduino UNO R3: 
 +Utilizatorul introduce un cod PIN folosind tastatura matricială 4x4. Tastatura este conectată la 8 pini digitali ai plăcii Arduino și transmite caracterele tastate către microcontroler pentru validare. 
 + 
 +Arduino UNO R3 → LCD 1602: 
 +Pe ecranul LCD sunt afișate mesaje precum „Introduceți codul”, „Acces permis” sau „Cod greșit”. LCD-ul este conectat prin interfața I2C la pinii A4 (SDA) și A5 (SCL). 
 + 
 +Arduino UNO R3 → Buzzer pasiv: 
 +Buzzerul pasiv este utilizat pentru a oferi feedback sonor (sunet scurt pentru cod corect, ton de eroare pentru cod greșit etc.). Este comandat prin semnal generat cu funcția tone() și conectat pe un pin digital (D10). 
 + 
 +Arduino UNO R3 → LED roșu + LED verde: 
 +Cele două LED-uri indică starea sistemului: LED-ul roșu este aprins când seiful este blocat, iar LED-ul verde când este deblocat. Ambele LED-uri sunt conectate pe pini digitali și sunt comandați prin semnal simplu GPIO. 
 + 
 +Arduino UNO R3 → Servomotor → Zăvor ușă: 
 +Servomotorul SG90 este folosit pentru acționarea mecanică a zăvorului ușii seifului. În urma unui cod corect, Arduino trimite un semnal PWM pe pinul D11 către servomotor, care deblochează mecanismul. După 5 secunde, un timer software (implementat prin millis()) declanșează automat reînchiderea ușii prin rotirea servo-ului în poziția de blocare.
  
 ===== Hardware Design ===== ===== Hardware Design =====
Line 70: Line 85:
 | 6 | LED roșu | GPIO (Digital Output) | D13 | | 6 | LED roșu | GPIO (Digital Output) | D13 |
 | 7 | LED verde | GPIO (Digital Output) | D12 | | 7 | LED verde | GPIO (Digital Output) | D12 |
 +
 +{{:​pm:​prj2025:​iotelea:​unfinished-safe-front.jpg?​700|}}
 +
 +{{:​pm:​prj2025:​iotelea:​unfinished-safe-rear.jpg?​700|}}
 +
 +{{:​pm:​prj2025:​iotelea:​whatsapp_image_2025-05-27_at_16.26.55_4555e98c.jpg?​700|}}
  
 ===== Software Design ===== ===== Software Design =====
  
 +Mediul de dezvoltare utilizat pentru implementarea firmware-ului a fost Arduino IDE, cu suport pentru platforma AVR-GCC, țintind microcontrolerul ATmega328P de pe placa Arduino UNO R3. În cadrul proiectului,​ s-a optat pentru o implementare low-level a protocoalelor,​ pentru o înțelegere mai profundă a funcționării hardware-ului.
  
-<note tip> +| **Platformă** ​     | **Detalii** ​                                                          | 
-Descrierea codului aplicaţiei (firmware): +| IDE            | Arduino IDE                                                       | 
-  * mediu de dezvoltare ​(if any) (e.g. AVR Studio, CodeVisionAVR+| Microcontroler | ATmega328P ​(pe placa Arduino UNO R3                             | 
-  * librării şi surse 3rd-party (e.g. Procyon AVRlib+| Compilator ​    | AVR-GCC (implicit prin Arduino Toolchain                        | 
-  * algoritmi şi structuri pe care plănuiţi să le implementaţi +| Programare ​    | În limbaj C/C++ cu acces direct la registre ​                      | 
-  * (etapa 3surse şi funcţii implementate +| Biblioteci ​    | Fără librării externe ​(implementare manuală a I2C, PWM, GPIO, Timere|
-</​note>​+
  
-===== Rezultate Obţinute ===== 
  
-<note tip+====Elemente software implementate până în acest moment==== 
-Care au fost rezultatele ​obţinute în urma realizării proiectului vostru+ 
-</​note>​+• Control tastatură matricială 4x4 (scanare + debouncing software) 
 + 
 +• Verificare PIN + contor de greșeli 
 + 
 +• Blocare automată a seifului după 10 secunde de la deschidere (millis() – non-blocking) 
 + 
 +• Servomotor acționat manual pentru deschiderea/​zăvorârea ușii 
 + 
 +• LED-uri pentru semnalizare vizuală (GPIO) 
 + 
 +• Buzzer cu secvențe sonore diferite pentru stări (corect, greșit, autodistrugere) 
 + 
 +• Afișare mesaje pe LCD I2C controlat prin TWI 
 + 
 +====Corelare cu laboratoare==== 
 + 
 +^ Laborator ^ Concept ​             ^ Aplicație în proiect ​                         ^ 
 +| Lab 0     | GPIO                 | Tastatură matricială,​ LED-uri de stare        | 
 +| Lab 3     | PWM & Timere ​       | Servomotor (PWM manual), buzzer (tonuri) ​     | 
 +| Lab 6     | I2C (fără librării) | Comunicare low-level cu LCD 1602 prin TWI     | 
 + 
 + 
 +==== Implementarea logicii ====   
 + 
 + 
 +Programul începe prin apelarea funcțiilor de inițializare: ​  
 + 
 + 
 +- `initializePins()` configurează LED-urile (roșu și verde), buzzer-ul, pinul de control pentru servomotor și pinii pentru tastatura matricială (ca output pentru rânduri și input cu pull-up pentru coloane). ​  
 + 
 + 
 +- `lcd_init()` și `twi_init()` pregătesc interfața LCD 1602 și inițializează comunicația I2C la nivel de registre TWI.   
 + 
 + 
 +- `setServoPosition(1500)` setează servomotorul în poziția de blocare (90°), la pornirea sistemului. ​  
 + 
 + 
 +- Variabilele globale precum `isUnlocked`,​ `enteredCode`,​ `unlockTime` sunt resetate la valori inițiale. ​  
 + 
 + 
 +După inițializare,​ programul intră în bucla principală: ​  
 + 
 + 
 +1. Se apelează `scanKeypad()` pentru a detecta apăsări pe tastatura 4×4.   
 + 
 + 
 +2. Dacă utilizatorul apasă `*`, codul introdus este resetat și se afișează mesajul “Enter PIN”. ​  
 + 
 + 
 +3. Dacă se apasă o cifră/​caracter,​ acesta este adăugat la `enteredCode`,​ care este afișat pe LCD.   
 + 
 + 
 +4. Când lungimea `enteredCode` este egală cu `correctCode`,​ se compară valorile: ​    
 + 
 + A) Dacă codul este corect: ​  
 + 
 +     • Se apelează `unlockSystem()` – servomotorul deschide zăvorul, se aprinde LED-ul verde și buzzerul emite un ton pozitiv. ​  
 + 
 +     • Se salvează `unlockTime` și se setează `isUnlocked = true`. ​  
 + 
 + 
 + B) Dacă codul este greșit: ​  
 + 
 +     • Se crește contorul `failedAttempts`. ​  
 + 
 +     • Se afișează mesaj de eroare, se apelează `playToneSequence()` cu tonuri triste. ​  
 + 
 +     • Dacă `failedAttempts ​>= 3`, se apelează `handleSelfDestructSequence()` – o secvență cu mesaj animat, countdown, sunet de "​alarmă"​ și flashuri LED.  ​ 
 + 
 + 
 +În timpul în care sistemul este deblocat: ​  
 + 
 + 
 +- Se afișează un countdown pe LCD ("​Auto-lock in: X"​). ​  
 + 
 + 
 +- Dacă au trecut 10 secunde (`millis() - unlockTime > autoLockDelay`),​ se apelează `lockSystem()` și sistemul revine în starea de așteptare. ​  
 + 
 + 
 +====Funcții auxiliare==== ​  
 + 
 + 
 +- `scanKeypad()` ​  
 + 
 +  Scanează rândurile tastaturii 4x4, setează LOW câte un rând pe rând și citește coloanele. Debouncing software este realizat cu millis(). ​  
 + 
 + 
 +- `setServoPosition(uint16_t position)` ​  
 + 
 +  Trimite un număr de impulsuri (până la 100) pentru a comanda un servomotor standard SG90, fără folosirea bibliotecii `Servo.h`. ​  
 + 
 + 
 +- `playTone(uint16_t freq, uint16_t duration)` ​  
 + 
 +  Generează semnale sonore de frecvență variabilă prin toggling manual al pinului pentru buzzer (fără PWM hardware). ​  
 + 
 + 
 +- `lcd_init()` ​  
 + 
 + 
 +  Inițializează LCD-ul în mod 4-bit, 2 rânduri, folosind comenzi standard trimise prin I2C cu funcții low-level (`twi_write()`). ​  
 + 
 + 
 +- `handleSelfDestructSequence()` ​  
 + 
 +  Afișează un mesaj animat derulant pe LCD, urmat de un countdown și un efect vizual/​auditiv (flash LED + sunet de alarmă), apoi revine la `lockSystem()`. ​  
 + 
 + 
 +Validarea funcțională a fost realizată fizic, cu testarea tuturor scenariilor: ​  
 + 
 + 
 +- cod corect → deblocare + ton pozitiv + LED verde   
 + 
 + 
 +- cod greșit → mesaj eroare + ton negativ + LED roșu   
 + 
 + 
 +- 3 greșeli → secvență specială de autodistrugere ​  
 + 
 + 
 +- blocare automată → verificat după 10 secunde inactivitate ​  
 + 
 + 
 +Toate modulele funcționează sincron, fără blocări sau conflicte, datorită utilizării `millis()` pentru temporizări non-blocante și a organizării logice clare între stări (locked/​unlocked). ​  
 +
 + 
 +^ Componentă ​          ^ Metodă de calibrare ​                                                      ^ Rezultat / Valoare finală ​                ^ 
 +| Servomotor ​          | Testare empirică a impulsurilor PWM manuale ​                             | 600 µs = deblocat (0°), 1500 µs = blocat (90°) | 
 +| Tastatură 4×4        | Debounce software ajustat folosind `millis()` ​                           | Timp de debounce: 50 ms                     | 
 +| LCD 1602 I2C         | Ajustare timpi între comenzi și date, conform datasheet ​                 | Funcționare stabilă, fără caractere corupte | 
 +| Buzzer piezoelectric | Reglare durată și frecvență pentru sunete clare și diferențiate ​         | Ton pozitiv: 262–330 Hz, eroare: 262–175 Hz | 
 + 
 + 
 +===== Rezultate ​obținute ===== 
 + 
 +• Sistemul funcționează stabil și complet automatizat. ​  
 + 
 +• Codul PIN este verificat corect, cu feedback audio-vizual. ​  
 + 
 +• Servomotorul acționează zăvorul precis, fără librării externe  
 + 
 +• LCD-ul comunică prin I2C low-level (fără Wire.h). ​  
 + 
 +• Blocarea automată funcționează corect cu temporizare non-blocantă. ​  
 + 
 +• Secvența de autodistrugere este declanșată după 3 greșeli. ​  
 + 
 +• Toate componentele au fost testate fizic, cu rezultate conforme.  ​
  
 ===== Concluzii ===== ===== Concluzii =====
  
-===== Download =====+Proiectul a reușit să integreze cu succes conceptele studiate în laborator, precum GPIO, PWM și I2C, într-un sistem embedded funcțional și bine organizat. Abordarea low-level, fără librării externe, a permis un control complet asupra hardware-ului și o înțelegere aprofundată a comunicației între componente.  ​
  
-<note warning>​ +Sunt fericit că am reușit să implementez de la zero un seif inteligent folosind Arduino, parcurgând toate etapele esențialeplanificarea logiciicăutarea și achiziția componentelordocumentarea din surse online și vizionarea de tutoriale video pe YouTube  
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectuluisurseschemeetcUn fişier READMEun ChangeLogun script de compilare şcopiere automată pe uC crează întotdeauna o impresie bună ;-).+ 
 +Experiența a fost una practicăeducativă și motivantășm-a ajutat să înțeleg mai bine cum se dezvoltă un proiect embedded cap-coadă 
  
-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>​ 
  
 ===== Jurnal ===== ===== Jurnal =====
  
-<note tip> +- 26 Aprilie – Alegerea temei proiectului ​ 
-Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul ​proiectului+
-</​note>​+
  
 +- 1, 2 Mai – Brainstorming pentru alegerea componentelor  ​
 +
 +- 3 Mai – Comandarea componentelor hardware  ​
 +
 +- 6 Mai – Construirea circuitului electronic în Tinkercad (simulare)  ​
 +
 +- 8 Mai – Recepționarea componentelor fizice  ​
 +
 +- 10 Mai – Completarea Milestone 1  ​
 +
 +- 12 Mai – Asamblarea circuitului real  ​
 +
 +- 12 Mai – Implementarea unui cod funcțional high-level (cu librării)  ​
 +
 +- 17 Mai – Prezentarea Milestone 2  ​
 +
 +- 24 Mai – Convertirea codului high-level în cod low-level (fără librării)  ​
 +
 +- 25 Mai – Finalizarea și prezentarea Milestone 3  ​
 +
 +- 28 Mai – Participarea la PM Fair 
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
 <​note>​ <​note>​
-Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**.+[[https://​github.com/​Emilian953/​Smart-Safe-Box| Pagina de GitHub]] 
 + 
 +[[https://​drive.google.com/​file/​d/​12_EX6L4X6f8X2gsXAWvi_QgrKrP5VBlj/​view?​usp=drive_link|Demo-Video in development]] 
 + 
 +[[https://​drive.google.com/​file/​d/​1xmLwBL_BmBSYDKec8ba2yeDeOBSv0kOU/​view?​usp=sharing|Demo-Video fully built]]
 </​note>​ </​note>​
  
 <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​ <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​
  
pm/prj2025/iotelea/emilian.horduna.1747258144.txt.gz · Last modified: 2025/05/15 00:29 by emilian.horduna
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