Differences

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

Link to this comparison view

pm:prj2025:ccristi:valentin.carauleanu [2025/05/23 16:30]
valentin.carauleanu [Funcții Master Arduino]
pm:prj2025:ccristi:valentin.carauleanu [2025/05/28 09:45] (current)
valentin.carauleanu [Hardware Design]
Line 70: Line 70:
   * LCD-ul afișează promptul pentru introducerea codului.   * LCD-ul afișează promptul pentru introducerea codului.
   * Utilizatorul introduce codul PIN pe tastatură.   * Utilizatorul introduce codul PIN pe tastatură.
-  * Codul este verificat: dacă este corect: servomotorul deschide dulapul, LED-ul se aprinde, apare mesajul "​Access Granted";​ dacă este greșit: ​buzzer-ul emite un sunet scurt; după 3 încercări greșite, buzzer-ul rămâne pornit. +  * Codul este verificat: dacă este corect: servomotorul deschide dulapul, LED-ul se aprinde, apare mesajul "​Access Granted";​ dacă este greșit: ​apare un mesaj sugestiv; după 3 încercări greșite, buzzer-ul rămâne pornit. 
-  * Se apasă `B` pentru a reloca dulapul.+  * Se apasă `B` pentru a rebloca sieful, `A` pentru a schimba cifrul.
  
 ==== 2. Setarea sau schimbarea codului de securitate ==== ==== 2. Setarea sau schimbarea codului de securitate ====
Line 122: Line 122:
 ===== Hardware Design ===== ===== Hardware Design =====
  
 +Sistemul este alcătuit din două plăci de dezvoltare Arduino Uno, care comunică între ele prin magistrala I2C în configurație Master–Slave. Partea de Master controlează afișajul LCD 1602 cu interfață I2C, un servo-motor SG90 pentru închiderea fizică a seifului, o tastatură matricială 4x4 pentru introducerea codului PIN, un buzzer pentru semnalizare acustică și un LED de stare. Placa Slave este echipată cu senzori de mediu: un DHT11 pentru temperatură și umiditate, un senzor de sunet KY-037 pentru detecția zgomotului ambiental, un modul de timp real RTC DS1302 pentru afișarea orei curente și un senzor de înclinare SW-520D, conectat la o întrerupere externă pentru semnalizarea mișcărilor neautorizate. Întregul ansamblu este alimentat prin USB, fiind gândit să funcționeze într-un sistem închis și compact, ideal pentru securizarea unui obiect fizic.
  
 **Bill of Materials**:​ **Bill of Materials**:​
Line 166: Line 167:
 {{ :​pm:​prj2025:​ccristi:​ez_box_schema.png?​500 |}} {{ :​pm:​prj2025:​ccristi:​ez_box_schema.png?​500 |}}
  
-** Version 1 ** 
  
 {{ :​pm:​prj2025:​ccristi:​img_5139.jpeg?​300 |}} {{ :​pm:​prj2025:​ccristi:​img_5139.jpeg?​300 |}}
  
 {{ :​pm:​prj2025:​ccristi:​img_5144.jpeg?​300 |}} {{ :​pm:​prj2025:​ccristi:​img_5144.jpeg?​300 |}}
 +
 +{{ :​pm:​prj2025:​ccristi:​final.jpg?​300 |}}
 ===== Software Design ===== ===== Software Design =====
  
 Software-ul utilizat: Software-ul utilizat:
- 
-ZIP: 
-{{:​pm:​prj2025:​ccristi:​software_master.zip|}} 
-{{:​pm:​prj2025:​ccristi:​software_slave.zip|}} 
  
 GITHUB: GITHUB:
Line 228: Line 226:
 <​code>​ <​code>​
 // custom structs, enums // custom structs, enums
-enum LockedPhase { +enum LockedPhase { PHASE_IDLE, PHASE_WAIT_INPUT,​ PHASE_VERIFY, ​PHASE_NOTIFICATION }; 
-  ​PHASE_IDLE, +enum UnlockedPhase { PHASE_UNLOCK_IDLEPHASE_UNLOCK_OPTIONS,​ PHASE_NEW_CODE_SETUP }; 
-  ​PHASE_WAIT_INPUT,​ +enum CodeSubPhase { CODE_ENTER, CODE_CONFIRM ​};
-  ​PHASE_VERIFY,​ +
-  ​PHASE_GRANTED+
-  ​PHASE_DENIED +
-};+
  
-enum UnlockedPhase { 
-  PHASE_UNLOCK_IDLE,​ 
-  PHASE_UNLOCK_OPTIONS,​ 
-  PHASE_NEW_CODE_ENTER,​ 
-  PHASE_NEW_CODE_CONFIRM,​ 
-  PHASE_CODE_SUCCESS,​ 
-  PHASE_CODE_FAIL,​ 
-  PHASE_RELOCK 
-}; 
  
 struct SensorPacket { struct SensorPacket {
Line 260: Line 245:
  
 </​code>​ </​code>​
 +
  
 ===== Funcții Master Arduino ===== ===== Funcții Master Arduino =====
Line 265: Line 251:
 === Inițializare și configurare === === Inițializare și configurare ===
  
-<code cpp> void setup() ​ // Inițializează LCD-ul, servo-ul, senzorii, buzzerul, LED-ul, ​I²C, etc. // Afișează mesajul „Welcome” și setează sistemul ca fiind blocat/deblocat în funcție de starea salvată. ​ </​code>​ <code cpp> void resetScreenState() ​ // Golește ecranul și resetează ​toți indicatorii interni și codurile introduse. // Este apelată după o perioadă lungă de inactivitate ​sau după eroare </​code>​+<code cpp> 
 +void setup() 
 +// Inițializează LCD-ul, servo-ul, senzorii, buzzerul, LED-ul, ​I2C, etc. 
 +// Afișează mesajul „Welcome” și setează sistemul ca fiind blocat ​sau deblocat în funcție de starea salvată. 
 +</​code>​ 
 + 
 +<code cpp> 
 +void resetScreenState() 
 +// Golește ecranul și resetează indicatorii interni și codurile introduse. 
 +// Este apelată după o perioadă lungă de inactivitate. 
 +</​code>​ 
 === Comunicare cu Arduino Slave === === Comunicare cu Arduino Slave ===
  
-<code cpp> void requestSensorData() ​ // Trimite o solicitare ​I²C către slave (adresă definită) pentru a primi structura SensorPacket. // Aceasta include ​ora, temperatura,​ umiditatea, ​sunetul ​și detectarea de mișcare (tilt). ​ </​code>​+<code cpp> 
 +void requestSensorData() 
 +// Trimite o solicitare ​I2C către slave (adresă definită) pentru a primi structura SensorPacket. 
 +// Conține ​ora, temperatura,​ umiditatea, ​nivelul de sunet și detectarea de mișcare (tilt). 
 +</​code>​ 
 === Control fizic: Blocare și Deblocare === === Control fizic: Blocare și Deblocare ===
  
-<code cpp> void lock() ​ // Mută servomotorul în poziția de blocare și oprește LED-ul ​intern </​code> ​<code cpp> void unlock() ​ // Mută servomotorul în poziția de deblocare și aprinde LED-ul pentru a semnala deschiderea. ​ </​code>​ <code cpp> bool isUserClose() ​ // Trimite un puls prin TRIG și măsoară timpul până la recepție cu ECHO. // Dacă distanța este sub un prag, consideră că un utilizator este în apropiere. ​ </​code>​ +<code cpp> 
-=== Faze când sistemul este blocat ===+void lock() 
 +// Mută servomotorul în poziția de blocare și oprește LED-ul. 
 +</​code>​
  
-<code cpp> void safeLockedLogicStep()  // Selectează și apelează funcția corespunzătoare fazei active ​de blocare (Idle, Input, Verificare, Grant/​Deny). ​ </​code>​ <code cpp> void handlePhaseIdle() ​ // Afișează senzorii pe LCD (temp, umiditate, sunet), simbolul de lacăt ​și pregătește introducerea codului// Dacă este detectat tilt, activează alarma.  ​</​code> ​<code cpp> void handlePhaseWaitInput() ​ // Citește caractere de la tastatură până se introduc 4 cifre. Afișează * pe ecran pentru fiecare. ​ </​code>​ <code cpp> void handlePhaseVerify() ​ // Verifică codul introdus. Dacă este corect, se deblochează. Dacă nu, crește contorul de eșec. // La 3 încercări eșuate, activează buzzerul. ​ </​code>​ <code cpp> void handlePhaseGrantOrDeny() ​ // După succes sau eșec, așteaptă 1.5 secunde și revine la starea inițială. ​ </​code>​ +<code cpp> 
-=== Faze când sistemul este deblocat ===+void unlock() 
 +// Mută servomotorul în poziția de deblocare ​și aprinde LED-ul. 
 +</​code>​
  
-<code cpp> ​void safeUnlockedLogicStep()  // Selectează și apelează funcția corespunzătoare fazei active de unlocked (Idle, New code, Confirmare etc).  </​code>​ <code cpp> void handleUnlockIdle() ​ // Afișează opțiunile: apăsarea „A” pentru schimbare cod, „B” pentru blocare. ​ </​code>​ <code cpp> void handleUnlockOptions() ​ // Primește comanda utilizatorului pentru ​începe schimbarea codului sau a bloca. ​ </​code>​ <code cpp> void handleNewCodeEnter()  ​// Permite introducerea noului cod (4 cifre), afișând * </code> <code cpp> void handleNewCodeConfirm()  ​// Solicită confirmarea codului introdus. ​Dacă se potrivește, ​este salvat ca noul cod.  </​code>​ <code cpp> void handleCodeSuccessOrFail() ​ // După setarea codului sau în caz de eroareașteaptă și revine în meniul unlocked. ​ </​code>​ <code cpp> void handleRelock() ​ // Activează servo pentru a închide fizic și revine ​în starea blocată </​code>​ +<code cpp> 
-===  Bucla principală ===+bool isUserClose() 
 +// Măsoară distanța cu senzorul ultrasonic ​(TRIG/ECHO). 
 +// Dacă este sub un prag predefinitconsideră că utilizatorul este în apropiere. 
 +</​code>​
  
-<code cpp> void loop()  // Verifică periodic proximitatea utilizatorului. // Cere date de la slave, verifică tilt. // Apelează logica ​pentru ​starea curentă (locked/unlocked) doar dacă utilizatorul este prezent. ​ </​code>​+=== Afișare și notificări === 
 + 
 +<code cpp> 
 +void showNotification(const String& msg, bool isLockedPhase) 
 +// Afișează un mesaj centrat pe LCD și setează automat faza următoare în funcție de context (locked/​unlocked). 
 +</code> 
 + 
 +<code cpp> 
 +void displaySensorSummary(bool locked) 
 +// Afișează temperatura,​ umiditatea, sunetul, ora și simbolul de lacăt (închis/​deschis) pe ecran. 
 +</​code>​ 
 + 
 +=== Faze când sistemul este blocat (Locked) === 
 + 
 +<code cpp> 
 +void safeLockedLogicStep() 
 +// Selectează și apelează funcția corespunzătoare fazei curente de blocare. 
 +</​code>​ 
 + 
 +<code cpp> 
 +void handleLockedIdle() 
 +// Solicită ​date de la slave, verifică tilt, afișează senzorii și pregătește ecranul pentru introducerea codului. 
 +</code> 
 + 
 +<code cpp> 
 +void handleLockedWaitInput() 
 +// Citește codul PIN de la tastatură și afișează * pentru ​fiecare cifră
 +</​code>​ 
 + 
 +<code cpp> 
 +void handleLockedNotification(
 +// După succes sau eșec, așteaptă 1.5 secunde și revine în faza inițială. 
 +</​code>​ 
 + 
 +=== Faze când sistemul este deblocat (Unlocked=== 
 + 
 +<code cpp> 
 +void safeUnlockedLogicStep() 
 +// Selectează și apelează funcția corespunzătoare fazei curente de deblocare. 
 +</​code>​ 
 + 
 +<code cpp> 
 +void handleUnlockIdle() 
 +// Afișează opțiunile: „A” pentru schimbare cod, „B” pentru blocare. 
 +</​code>​ 
 + 
 +<code cpp> 
 +void handleUnlockOptions() 
 +// Procesează apăsarea tastelor A sau B pentru a intra în faza de configurare sau de blocare. 
 +</​code>​ 
 + 
 +<code cpp> 
 +void handleNewCodeSetup() 
 +// Permite introducerea unui cod nou și confirmarea acestuia într-o singură funcție. 
 +// Dacă cele două coduri coincid, noul cod este salvat. 
 +</​code>​ 
 + 
 +=== Bucla principală === 
 + 
 +<code cpp> 
 +void loop() 
 +// Verifică la intervale regulate proximitatea utilizatorului. 
 +// Solicită date de la slave și verifică senzorul de înclinare (tilt). 
 +// Apelează logica de blocare sau deblocare ​doar dacă utilizatorul este prezent. 
 +</​code>​
  
 ===== Functii Arduino Slave ===== ===== Functii Arduino Slave =====
Line 289: Line 362:
 === Funcții de întrerupere și comunicare === === Funcții de întrerupere și comunicare ===
  
-<code cpp> void onRequest() ​ // Este apelată automat de Arduino Master prin I²C. // Trimite structura SensorPacket către Master. // Dacă în acest moment tiltDetected este true, se trimite ca atare și apoi se resetează. ​ </​code>​ <code cpp> void onTilt() ​ // Funcție apelată la declanșarea întreruperii externe de la senzorul SW-520. // Setează flag-ul tiltDetected pe true.  </​code>​+<code cpp> void onRequest() ​ // Este apelată automat de Arduino Master prin I2C. // Trimite structura SensorPacket către Master. // Dacă în acest moment tiltDetected este true, se trimite ca atare și apoi se resetează. ​ </​code>​ <code cpp> void onTilt() ​ // Funcție apelată la declanșarea întreruperii externe de la senzorul SW-520. // Setează flag-ul tiltDetected pe true.  </​code>​
 === Bucla principală (loop) === === Bucla principală (loop) ===
  
 <code cpp> void loop() ​ // Citește data și ora curente de la modulul RTC și actualizează packet // Citește temperatura și umiditatea de la senzorul DHT11 // Citește semnalul analogic de la microfonul KY-037 și îl transformă într-un procent // Copiază flag-ul tilt în packet și apoi îl resetează // Așteaptă 250ms înainte de următoarea lectură (pentru eficiență) ​ </​code>​ <code cpp> void loop() ​ // Citește data și ora curente de la modulul RTC și actualizează packet // Citește temperatura și umiditatea de la senzorul DHT11 // Citește semnalul analogic de la microfonul KY-037 și îl transformă într-un procent // Copiază flag-ul tilt în packet și apoi îl resetează // Așteaptă 250ms înainte de următoarea lectură (pentru eficiență) ​ </​code>​
-Dacă vrei, pot crea și o versiune PDF sau Markdown cu această documentație ori o pot adăuga într-un fișier extern. Spune-mi și dacă dorești o diagramă UML completă pentru structura SensorPacket sau fluxul de comunicație Master ↔ Slave. 
  
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
-<note tip> +  * Sistemul de acces a fost implementat cu succes, permițând blocarea/​deblocarea fizică prin introducerea unui cod PIN pe tastatura matricială. 
-Care au fost rezultatele obţinute ​în urma realizării proiectului vostru+  * Informațiile despre temperatură,​ umiditate, sunet și înclinare sunt colectate ​în timp real de Arduino Slave și transmise cu succes către Arduino Master prin I²C
-</​note>​+  * Ecranul LCD afișează datele ambientale și oferă interfață intuitivă pentru utilizator. 
 +  * În cazul unei tentative de manipulare a sistemului (detectare de tilt), sistemul reacționează prin activarea buzzerului de alarmă și blochează accesul. 
 +  * LED-ul montat indică vizual starea de blocare a seifului (ON = deblocat).
  
 ===== Concluzii ===== ===== Concluzii =====
  
 +  * Comunicarea Master–Slave prin I2C s-a dovedit stabilă și eficientă.
 +  * Utilizarea întreruperilor pentru senzorul de înclinare permite reacții imediate la tentative de manipulare.
 +  * Arhitectura modulară (separare Master–Slave) permite extinderea sistemului cu ușurință ​
 +  * Proiectul oferă un exemplu funcțional de integrare între senzori digitali/​analogici,​ module RTC și controlere multiple într-un sistem embedded.
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
pm/prj2025/ccristi/valentin.carauleanu.1748007018.txt.gz · Last modified: 2025/05/23 16:30 by valentin.carauleanu
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