Differences

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

Link to this comparison view

pm:prj2025:avaduva:ioana.boari [2025/05/18 14:46]
ioana.boari [Hardware Design]
pm:prj2025:avaduva:ioana.boari [2025/05/24 12:19] (current)
ioana.boari [Bibliografie/Resurse]
Line 114: Line 114:
     * GND → **GND**     * GND → **GND**
   * Configurat ca: `INPUT_PULLUP` → logică activă pe LOW.   * Configurat ca: `INPUT_PULLUP` → logică activă pe LOW.
-  * Motivatie: Pinul D2 este unul dintre puținii pini de pe Arduino UNO care suportă întreruperi externe (INT0). Permite reacție imediată fără ​polling.+  * Motivatie: Pinul D2 este unul dintre puținii pini de pe Arduino UNO care suportă întreruperi externe (INT0). Permite reacție imediată fără ​busy waiting.
  
 7. **Breadboard + cabluri jumper** 7. **Breadboard + cabluri jumper**
Line 126: Line 126:
  
 ===== Software Design ===== ===== Software Design =====
 +
 +==== Mediu de dezvoltare ====
 +  * **Arduino IDE** (versiunea 2.3.6)
 +  * Microcontroller:​ **Arduino UNO**
 +
 +==== Descrierea codului aplicației (firmware) ====
 +
 +Proiectul a fost dezvoltat folosind mediul de dezvoltare **Arduino IDE**, în limbajul **C++**, și utilizează funcționalități precum: comunicație I2C, UART, semnal PWM, GPIO și întreruperi externe.
 +
 +Sistemul are trei stări:
 +  - **0 - activ**: sistemul monitorizează vibrațiile.
 +  - **1 - alertă**: se declanșează alarma prin buzzer, LED-uri si mesaj pe ecranul LCD.
 +  - **2 - standby**: sistemul este oprit până la reactivare prin apăsarea butonului.
 +
 +Trecerea între stări se realizează folosind o variabilă globală `systemState` și un flag `buttonPressed` setat printr-o întrerupere externă.
 +
 +==== Biblioteci utilizate ====
 +  * `Wire.h` – pentru comunicația I2C cu senzorul MPU6050 și ecranul LCD.
 +  * `LiquidCrystal_I2C.h` – pentru controlul LCD-ului 1602 prin I2C.
 +
 +==== Algoritmi și structuri implementate ====
 +  * **Calibrare automată**:​ la fiecare pornire sau repornire, se preiau 100 de citiri de la senzor și se calculează media pentru fiecare axă:
 +    <​code>​
 +    accX_ref = sumX / 100;
 +    accY_ref = sumY / 100;
 +    accZ_ref = sumZ / 100;
 +    </​code>​
 +    * **Monitorizarea vibrațiilor**:​ în `loop()`, diferențele dintre valorile actuale și cele calibrate sunt comparate cu un prag:
 +    <​code>​
 +    int deltaX = abs(accX - accX_ref);
 +    if (deltaX > threshold) {
 +      // declanșează alerta
 +    }
 +    </​code>​
 +  * **Serial Plotter pentru vizualizare live**:
 +    <​code>​
 +    Serial.print(accX);​
 +    Serial.print("​\t"​);​
 +    Serial.print(accY);​
 +    Serial.print("​\t"​);​
 +    Serial.println(accZ);​
 +    </​code>​
 +  * **Gestionarea stărilor**:​ folosind `systemState`,​ sistemul comută între monitorizare,​ alertă și standby.
 +  * **Gestionarea unui buton cu întrerupere externă**: pentru resetarea sau reactivarea sistemului fără polling:
 +    <​code>​
 +    attachInterrupt(digitalPinToInterrupt(buttonPin),​ onButtonPress,​ FALLING);
 +    </​code>​
 +
 +==== Funcții implementate ====
 +  * `setup()` – inițializează pinii, senzorii, LCD-ul, Serial și I2C.
 +  * `loop()` – logica principală bazată pe `systemState`.
 +  * `readAccel()` – citește valorile X, Y, Z de la senzor.
 +  * `calibreazaSistemul()` – afișează countdown și efectuează calibrarea.
 +  * `playStartupTone()`,​ `playShutdownTone()` – semnale sonore PWM.
 +  * `stopAlarm()` – oprește alarma și LED-urile.
 +  * `onButtonPress()` – handler pentru întreruperea butonului.
 +
 +==== Validare funcționalități ====
 +  * Sistemul a fost testat în mai multe scenarii prin lovirea suprafeței de sprijin.
 +  * **Serial Monitor** și **Serial Plotter** oferă confirmare în timp real.
 +  * Comportamentul sistemului corespunde așteptărilor:​
 +    - Alerta se declanșează la vibrații.
 +    - Sistemul poate fi oprit și repornit.
 +    - Mesajele sunt afișate corect pe LCD.
 +
 +==== Elemente de noutate ====
 +  * **Vizualizare live în Serial Plotter** a valorilor de accelerare.
 +  * **Calibrare în timp real** în paralel cu afișarea countdown-ului.
 +  * **Semnalizare diversă**: luminoasă, sonoră, textuală.
 +
 +==== Calibrarea senzorului ====
 +  * Se face automat la pornire sau reset.
 +  * În timpul afișării countdown-ului de 5 secunde pe LCD, se fac 100 de citiri:
 +    <​code>​
 +    for (int j = 0; j < 20; j++) {
 +      readAccel();​
 +      sumX += accX;
 +      delay(50);
 +    }
 +    </​code>​
 +  * Media valorilor se folosește ca punct de referință pentru detecția vibrațiilor ulterioare.
 +
 +==== Optimizări realizate ====
 +  * Folosirea delay-urilor precise în `calibreazaSistemul()` pentru preluare distribuită a datelor.
 +  * Evitarea polling-ului prin folosirea unei întreruperi pentru buton.
 +  * Funcții separate pentru fiecare responsabilitate logică - **modularizare**.
  
  
-<note tip> 
-Descrierea codului aplicaţiei (firmware): 
-  * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) 
-  * librării şi surse 3rd-party (e.g. Procyon AVRlib) 
-  * algoritmi şi structuri pe care plănuiţi să le implementaţi 
-  * (etapa 3) surse şi funcţii implementate 
-</​note>​ 
  
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
Line 163: Line 242:
 ===== Download ===== ===== Download =====
  
-<note warning>​ +{{:pm:prj2025:avaduva:detector_de_vibratii_in_cutremure.zip|}}
-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ă ;-). +
- +
-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>​+
  
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
-<​note>​ +**Resurse ​Hardware** 
-Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe **Resurse ​Software** şi **Resurse ​Hardware**. +  * [[https://​www.optimusdigital.ro/​ro/​|Optimus Digital]] – magazin online pentru componente electronice 
-</note>+  * [[https://​www.emag.ro/​modul-giroscop-mpu-6050-gy-521-accelerometru-arduino-3-axe-2-1-cm-x-1-1-cm-x-0-3-cm-albastru-c7/​pd/​DL3G1QYBM/​|Modul MPU6050 (eMAG)]] – senzor accelerometru + giroscop folosit în proiect 
 + 
 +**Resurse ​Software** 
 +  * [[https://​www.arduino.cc/​en/​software|Arduino IDE]] – mediu de dezvoltare folosit pentru scrierea și încărcarea codului 
 +  * [[https://​docs.arduino.cc/​libraries/​liquidcrystal/​|LiquidCrystal_I2C Library]] – afișare mesaje pe LCD cu interfață I2C 
 +  * [[https://​www.arduino.cc/​en/​reference/​wire|Wire Library]] – pentru comunicația I2C între Arduino și senzorul MPU6050
  
 <​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/avaduva/ioana.boari.1747568816.txt.gz · Last modified: 2025/05/18 14:46 by ioana.boari
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