This shows you the differences between two versions of the page.
|
pm:prj2025:vstoica:stefania.manea [2025/05/21 19:43] stefania.manea |
pm:prj2025:vstoica:stefania.manea [2025/05/22 12:14] (current) stefania.manea |
||
|---|---|---|---|
| Line 63: | Line 63: | ||
| | | ||
| ===Software Design=== | ===Software Design=== | ||
| + | |||
| + | ==Flow-ul programului== | ||
| + | |||
| + | Programul funcționează pe o mașină de stări (`State currentState = BEGIN/RECORD`), în care logica principală este împărțită în două stări esențiale: **BEGIN** și **RECORD**. | ||
| + | |||
| + | * Starea **BEGIN** – Așteptare | ||
| + | |||
| + | Această stare este activă imediat după pornirea sistemului. În acest moment, dispozitivul se află în repaus și așteaptă interacțiunea utilizatorului. LED-ul roșu este aprins pentru a semnala starea pasivă, iar LED-ul verde este stins. Speaker-ul este dezactivat. Pe ecranul OLED este afișat un mesaj care îi spune utilizatorului cum să înceapă înregistrarea: //Apasă B1 pentru înregistrare//. | ||
| + | |||
| + | La apăsarea butonului 1, sistemul inițiază tranziția către starea de înregistrare (RECORD). În acest moment sunt resetate variabilele relevante: //beatCount// este setat la 0, iar //beatDetected// este resetat pentru a permite o detecție corectă a următoarelor bătăi. Se pornește cronometrul intern (recordStartTime = time_millies()), iar ecranul este curățat pentru a începe afișarea semnalului cardiac. | ||
| + | |||
| + | * Starea **RECORD** – Înregistrare activă | ||
| + | |||
| + | În această stare, dispozitivul începe efectiv procesul de monitorizare a bătăilor inimii. LED-ul verde este stins, în timp ce LED-ul roșu clipește la fiecare 500ms, indicând activitatea înregistrării. | ||
| + | |||
| + | În bucla principală a acestei stări, sistemul citește valoarea analogică de la microfonul conectat pe pinul ADC0. Această valoare este convertită într-o poziție verticală y, utilizată pentru desenarea unui grafic asemănător unei electrocardiograme. Dacă valoarea semnalului depășește pragul //PEAK_THRESHOLD//, sistemul consideră că a fost detectată o bătaie a inimii și incrementează //beatCount//, cu condiția să nu fi fost deja detectată o bătaie în momentul anterior (evitând astfel detecțiile duble). | ||
| + | |||
| + | Semnalul este desenat în timp real pe display, iar coloanele sunt curățate și desenate continuu. | ||
| + | |||
| + | Înregistrarea poate fi oprită prin apăsarea butonului 2. În acest caz, dispozitivul revine în starea **BEGIN**. Speaker-ul este dezactivat, iar sistemul calculează automat durata înregistrării și valoarea ritmului cardiac exprimată în BPM, folosind formulele: | ||
| + | |||
| + | * duration = (time_millies() - recordStartTime) / 1000 | ||
| + | |||
| + | * BPM = (beatCount * 60) / duration | ||
| + | |||
| + | Datele obținute sunt transmise funcției result_screen(bpm, duration, beatCount), care se ocupă de afișarea rezultatelor și animația cu inima care pulsează. | ||
| ==Structura și rolul fiecărui fișier== | ==Structura și rolul fiecărui fișier== | ||
| + | |||
| + | |||
| + | Proiectul este structurat în mai multe fișiere sursă, fiecare având un rol specific în funcționarea generală a sistemului. În continuare voi descrie în detaliu fiecare fișier: | ||
| ==main.cpp - Fluxul programului și logica de bază== | ==main.cpp - Fluxul programului și logica de bază== | ||
| Line 78: | Line 107: | ||
| * **RECORD**: Citește semnalul de la microfon, detectează bătăi, desenează semnalul pe ecran și calculează BPM la oprirea înregistrării (prin butonul 2). | * **RECORD**: Citește semnalul de la microfon, detectează bătăi, desenează semnalul pe ecran și calculează BPM la oprirea înregistrării (prin butonul 2). | ||
| Integrează controlul LED-urilor și speaker-ului în funcție de starea aplicației. | Integrează controlul LED-urilor și speaker-ului în funcție de starea aplicației. | ||
| - | Găzduiește logica de afișare dinamică (semnalul de puls) și contabilizează numărul de bătăi. | + | Gestionează afișarea semnalului de puls și menține numărul de bătăi. |
| == init.hpp – Inițializarea componentelor hardware == | == init.hpp – Inițializarea componentelor hardware == | ||
| Line 163: | Line 192: | ||
| Acestea sunt desenate alternativ pe ecran în //result_screen()// pentru a simula o inimă care pulsează. | Acestea sunt desenate alternativ pe ecran în //result_screen()// pentru a simula o inimă care pulsează. | ||
| + | |||
| + | ===Rezultate obținute=== | ||
| + | |||
| + | [[https://www.youtube.com/watch?v=QOGykQ_T8kw|Demo proiect]] | ||
| + | |||
| + | |||
| + | Rezultatele obținute în urma testării arată că proiectul simulează detectarea bătăilor inimii și le contorizează în timp real. Informațiile afișate pe ecranul OLED, mai exact BPM-ul, durata înregistrării și numărul de bătăi, sunt clare și ușor de înțeles, iar animația inimii contribuie la o experiență interactivă și intuitivă pentru utilizator. | ||
| + | Aceste elemente fac ca proiectul să fie nu doar funcțional, ci și accesibil și prietenos pentru utilizatori. | ||
| + | |||
| + | {{ :pm:prj2025:vstoica:poza1.jpg?300|}} | ||
| + | {{ :pm:prj2025:vstoica:poza2.jpg?300|}} | ||
| + | {{ :pm:prj2025:vstoica:poza3.jpg?300|}} | ||
| + | {{ :pm:prj2025:vstoica:poza4.jpg?300|}} | ||
| + | {{ :pm:prj2025:vstoica:poza5.jpg?450 || center}} | ||
| + | |||
| + | |||
| + | |||
| + | ===Concluzie=== | ||
| + | |||
| + | Proiectul **Stetoscop Digital** pune în evidență un mod practic și eficient de a construi un sistem embedded care răspunde la interacțiuni reale. Utilizarea resurselor hardware precum ADC, GPIO, timer și interfața I2C pentru display-ul OLED a permis construirea unei aplicații care combină interacțiunea fizică (butoane, LED-uri, speaker) cu o interfață grafică intuitivă. Această combinație de componente oferă un rezultat vizual și funcțional. | ||
| + | |||
| + | Codul este clar structurat, iar funcționalitatea este împărțită logic, ceea ce face ca proiectul să fie ușor de înțeles și de testat. | ||