Differences

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

Link to this comparison view

pm:prj2025:ccristi:valentin.carauleanu [2025/05/27 13:48]
valentin.carauleanu [Software Design]
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 ​I²C în configurație Master–Slave. Partea de Master controlează afișajul LCD 1602 cu interfață ​I²C, 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.+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 245: Line 245:
  
 </​code>​ </​code>​
 +
  
 ===== Funcții Master Arduino ===== ===== Funcții Master Arduino =====
Line 250: 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 274: 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) ===
  
Line 289: Line 377:
 ===== Concluzii ===== ===== Concluzii =====
  
-  * Comunicarea Master–Slave prin I²C s-a dovedit stabilă și eficientă.+  * 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.   * 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ță ​   * Arhitectura modulară (separare Master–Slave) permite extinderea sistemului cu ușurință ​
pm/prj2025/ccristi/valentin.carauleanu.1748342929.txt.gz · Last modified: 2025/05/27 13:48 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