Table of Contents

Stetoscop Digital

Ștefania-Delia Manea 335CC

Introducere

Proiectul propune realizarea unui stetoscop digital, capabil să capteze sunetele corpului uman prin intermediul unui microfon de înaltă sensibilitate. Utilizatorul va putea începe sau opri înregistrarea prin intermediul unui buton, iar starea va fi indicată de un led RGB. Cât timp înregistrarea este pornită, pe ecranul OLED va fi afișată reprezentarea grafică a semnalului captat de microfon.

Semnalul audio va fi amplificat și filtrat utilizând configurații specifice de filtre, în scopul îmbunătățirii clarității și calității sunetelor percepute. Redarea sunetului se va realiza printr-un difuzor conectat la un amplificator audio, iar volumul va putea fi ajustat cu ajutorul unui potențiometru rotativ.

Descriere generală

Arduino Nano reprezintă centrul de control al proiectului, ocupându-se de colectarea datelor, procesarea semnalelor și gestionarea interfeței cu utilizatorul. La acesta sunt conectate următoarele module:

 | center

Hardware Design

Funcționalitatea generală HW

Sistemul hardware este format dintr-un microfon MAX4466 care captează sunetul din mediu și trimite semnalul analogic rezultat către Arduino Nano pe pinul A0 pentru analiză și afișare. Microfonul este alimentat la 5V și GND. Afișajul OLED afișează în timp real forma de undă a semnalului audio, fiind conectat la pinii A4 (SDA) și A5 (SCL) ai Arduino-ului prin protocol I²C. Arduino Nano funcționează ca unitate centrală de control, citind semnalul de la microfon, gestionând afișajul, LED-urile, difuzorul și stările logice ale sistemului. Două butoane conectate la pinii D2 și D3 sunt utilizate pentru a iniția și opri înregistrarea, fiecare fiind conectat la GND prin rezistențe de pull-down. Feedback-ul vizual este oferit de un LED RGB cu anod comun, al cărui segment verde (pe D5) indică starea de repaus, iar segmentul roșu (pe D4) pâlpâie în timpul înregistrării. Controlul volumului este realizat printr-un potențiometru montat între ieșirea de semnal și amplificatorul audio PAM8403, care reglează tensiunea de intrare și permite ajustarea sunetului perceput în difuzor. Amplificatorul este alimentat la 5V și transmite semnalul audio amplificat către difuzor pentru redare clară.

Listă de piese
Conectare componente
Componentă Pin Motivație
Microfon A0 Folosit pentru afișaj
Microfon A1 Folosit pentru transmitere la difuzor
Display OLED A4(SDA), A5(SCL) Comunicare I2C Arduino-Display
Potențiometru A0 Reglează semnalul primit de la microfon și îl trimite la amplificator
Amplificator Semnal potențiometru Trimite semnal audio amplificat către difuzor
Difuzor A1 Controlează alimentarea pozitivă a amplificatorului
LED RGB D4 (Red), D5 (Green) Feedback de stare vizual
Buton 1 D2 Start înregistrare
Buton 2 D3 Oprire și revenire la starea inițială

 | center

 | center

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.

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.

Î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:

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

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ă

Acesta este punctul de intrare al programului. Are rolul de a inițializa hardware-ul și de a coordona logica programului bazată pe stări.

Apelează funcțiile de inițializare:

Configurează ecranul OLED cu display.begin() Rulează o buclă while(1) care alternează între două stări:

Integrează controlul LED-urilor și speaker-ului în funcție de starea aplicației. Gestionează afișarea semnalului de puls și menține numărul de bătăi.

init.hpp – Inițializarea componentelor hardware

Acest fișier definește funcții pentru a configura perifericele microcontroller-ului.

Funcții definite:

gpio_init()

Configurează:

adc_init()

timer0_init()

vars.hpp – Configurări globale și definiri

Fișierul definește variabile și constante globale necesare în întregul proiect.

Include:

screen.hpp – Afișare grafică și gestionare LED-uri

Acest fișier conține funcțiile de afișare și de interpretare a rezultatelor măsurării.

Funcții principale

ISR(TIMER0_COMPA_vect)

time_millies()

begin_screen()

result_screen(bpm, duration, beatCount)

Afișează rezultatele înregistrării:

Setează LED-urile în funcție de nivelul ritmului cardiac:

libs.hpp – Include-uri și biblioteci

Fișier folosit pentru a centraliza toate bibliotecile necesare.

Include

AVR standard (pentru control hardware):

Display OLED:

heart.hpp – Resurse grafice (bitmap-uri inimă)

Conține două array-uri `PROGMEM` (plasate în memoria flash) cu bitmap-uri:

Acestea sunt desenate alternativ pe ecran în result_screen() pentru a simula o inimă care pulsează.

Rezultate obținute

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.

| 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.

Download

Repository Github