This is an old revision of the document!


Inima Interactiva

Proiectul consta intr-o inima formata din LED-uri RGB pe breadboard care pulseaza in ritmul batailor reale ale utilizatorului. Utilizatorul isi pune degetul pe senzorul de puls, care masoara BPM-ul in timp real. LED-urile pulseaza in ritmul detectat, iar display-ul OLED afiseaza valoarea BPM. Culoarea LED-urilor indica starea: verde pentru BPM normal (60-100 BPM), rosu pentru BPM in afara intervalului. La apasarea butonului masurarea porneste, la o noua apasare se opreste. La fiecare bataie detectata, buzzerul reda un sunet scurt de tip lub-dub.

Descriere generala

Modulele proiectului si modul in care interactioneaza:

  • Senzorul de puls citeste bataile inimii de pe deget si trimite semnal analogic catre ADC
  • ATmega328P proceseaza semnalul, calculeaza BPM si controleaza celelalte module
  • Tranzistoarele BD139 comanda cele 11 LED-uri RGB simultan, fara ca pinii microcontrollerului sa alimenteze direct toate LED-urile
  • LED-urile RGB pulseaza in ritmul detectat si isi schimba culoarea in functie de BPM (verde = normal, rosu = in afara intervalului)
  • Display-ul OLED afiseaza BPM in timp real prin protocolul I2C
  • Butonul porneste/opreste masurarea prin intrerupere externa INT0
  • Buzzerul reda sunetul lub-dub la fiecare bataie detectata prin PWM

Hardware Design

Lista de componente

  • ATmega328P Xplained Mini - unitatea de procesare
  • Senzor de puls cardiac (Pulse Sensor) x1
  • LED-uri RGB 5mm anod comun x11
  • Display OLED 0.96” SSD1306 I2C x1
  • Buzzer pasiv 5V x1
  • Buton tactil 12x12mm x1
  • Tranzistor NPN BD139 x3
  • Rezistente pentru LED-uri: cate una pentru fiecare pin de culoare folosit
  • Rezistente 1K ohm x3 (pentru baza tranzistoarelor)
  • Rezistenta 10K ohm x1 (pull-up buton, daca nu se foloseste pull-up intern)
  • Breadboard 830 puncte x2
  • Fire jumper tata-tata si tata-mama

Conexiuni

LED-uri RGB (11 bucati, anod comun)

LED-urile RGB folosite sunt de tip anod comun. Pinul comun al fiecarui LED este conectat la +5V. Pinii R, G si B ai fiecarui LED sunt conectati prin rezistente individuale la cate un canal comun pentru fiecare culoare.

Fiecare canal comun este comandat printr-un tranzistor NPN BD139:

  • canalul rosu este conectat la colectorul tranzistorului BD139 pentru rosu
  • canalul verde este conectat la colectorul tranzistorului BD139 pentru verde
  • canalul albastru este conectat la colectorul tranzistorului BD139 pentru albastru

Pentru fiecare tranzistor BD139:

  • colectorul este conectat la canalul de culoare corespunzator
  • emitorul este conectat la GND
  • baza este conectata printr-o rezistenta de 1K ohm la un pin PWM al microcontrollerului

Tranzistoarele sunt necesare deoarece 11 LED-uri aprinse simultan pe acelasi canal pot depasi curentul maxim suportat de un pin al microcontrollerului. Astfel, pinii microcontrollerului comanda doar baza tranzistoarelor, iar curentul pentru LED-uri trece prin tranzistoare.

Pinii PWM folositi pentru LED-uri sunt:

  • PD5 (OC0B) → rezistenta 1K → baza BD139 → canal Rosu
  • PD6 (OC0A) → rezistenta 1K → baza BD139 → canal Verde
  • PD3 (OC2B) → rezistenta 1K → baza BD139 → canal Albastru

Pinii PWM au fost alesi pentru a permite efectul de fade (puls) al LED-urilor.

Schema logica pentru un canal de culoare este:

  • +5V → pin comun LED RGB
  • pin culoare LED → rezistenta → canal comun culoare → colector BD139
  • emitor BD139 → GND
  • baza BD139 → rezistenta 1K → pin PWM microcontroller

Senzor puls cardiac (Pulse Sensor)

  • Pinul S (semnal) → PC0 (ADC0)
  • VCC → 5V
  • GND → GND

Pinul ADC0 a fost ales deoarece senzorul ofera un semnal analogic citit prin convertorul analog-digital.

Display OLED 0.96” SSD1306

  • SDA → PC4 (SDA)
  • SCL → PC5 (SCL)
  • VCC → 5V
  • GND → GND

Pinii PC4 si PC5 sunt pinii hardware dedicati protocolului I2C (TWI) pe ATmega328P.

Buzzer pasiv

  • Pin pozitiv → PB1 (OC1A)
  • Pin negativ → GND

Pinul PB1 suporta PWM pe Timer1, necesar pentru generarea frecventelor sonore lub-dub.

Buton tactil

  • Un pin → PD2 (INT0)
  • Celalalt pin → GND
  • Rezistenta pull-up 10K ohm intre PD2 si 5V sau pull-up intern activat software

Pinul PD2 suporta intrerupere externa INT0 pentru detectarea apasarii cu debouncing.

Calcule consum

Pentru LED-urile RGB se foloseste cate o rezistenta pentru fiecare pin de culoare. Curentul depinde de valoarea rezistentei folosite.

Pentru o rezistenta de 220 ohm, curentul aproximativ printr-un LED rosu este:

I = (5V - 2V) / 220 ohm
I = 3V / 220 ohm
I = 13.6mA

Pentru 11 LED-uri aprinse pe acelasi canal:

11 x 13.6mA = 149.6mA

Deci un canal LED cu rezistente de 220 ohm consuma aproximativ 150mA.

Pentru o rezistenta de 1K ohm, curentul aproximativ printr-un LED rosu este:

I = (5V - 2V) / 1000 ohm
I = 3V / 1000 ohm
I = 3mA

Pentru 11 LED-uri aprinse pe acelasi canal:

11 x 3mA = 33mA

Estimare consum total, cu un canal LED activ:

  • LED-uri, 11 bucati, canal cu 220 ohm: aproximativ 150mA
  • OLED SSD1306: aproximativ 20mA
  • Senzor puls: aproximativ 4mA
  • Buzzer: aproximativ 30mA
  • ATmega328P: aproximativ 20mA
  • Total maxim estimat: aproximativ 224mA

Alimentarea prin USB 5V / 500mA este suficienta pentru aceasta configuratie, mai ales deoarece proiectul nu aprinde toate cele trei culori la intensitate maxima in acelasi timp.

Software Design

Firmware-ul proiectului implementeaza functiile principale necesare pentru functionarea inimii interactive:

  • citirea semnalului analogic de la senzorul de puls prin ADC0;
  • filtrarea software a semnalului pentru reducerea zgomotului;
  • detectarea varfurilor semnalului asociate batailor inimii;
  • numararea batailor detectate intr-o fereastra de 60 de secunde;
  • afisarea pe display-ul OLED a timpului ramas si a numarului de batai detectate;
  • semnalizarea fiecarei batai prin aprinderea scurta a LED-urilor rosii si activarea buzzerului;
  • afisarea rezultatului final si semnalizarea prin LED-uri: verde pentru BPM normal, rosu pentru BPM in afara intervalului.

Programul este organizat pe stari, pentru ca fiecare etapa a functionarii sa fie separata clar:

  • IDLE - sistemul este oprit, display-ul afiseaza OFF, iar LED-urile si buzzerul sunt oprite;
  • WAIT_FINGER - sistemul asteapta stabilizarea semnalului de la senzor dupa apasarea butonului;
  • MEASURING - sistemul numara bataile detectate timp de 60 de secunde;
  • RESULT - sistemul afiseaza BPM-ul final si aprinde verde sau rosu in functie de rezultat.

Masurarea este pornita de la buton. Dupa pornire, utilizatorul tine senzorul intre degete, iar programul incepe masurarea dupa ce semnalul citit devine suficient de stabil. In timpul masurarii, la fiecare bataie detectata, LED-urile rosii pulseaza si buzzerul reda un sunet scurt. Numarul afisat pe OLED creste sincronizat cu aceste impulsuri.

Module software implementate

Codul este impartit logic in mai multe module functionale:

  • modul GPIO - configureaza si controleaza pinii pentru LED-uri, buzzer si buton;
  • modul ADC - citeste semnalul analogic de la senzorul de puls conectat pe ADC0;
  • modul TWI/I2C - transmite comenzi si date catre display-ul OLED SSD1306;
  • modul OLED - initializeaza display-ul si afiseaza mesajele proiectului;
  • modul de detectie a pulsului - filtreaza semnalul si detecteaza varfurile relevante;
  • modul de stare - controleaza tranzitia intre IDLE, WAIT_FINGER, MEASURING si RESULT.

Citirea senzorului de puls

Senzorul de puls este conectat la pinul PC0 / ADC0. Semnalul oferit de senzor este analogic, deci este citit folosind convertorul analog-digital al microcontrollerului ATmega328P.

Initializarea ADC-ului foloseste AVCC ca tensiune de referinta si un prescaler potrivit pentru o citire stabila. La fiecare esantionare, programul selecteaza canalul ADC0, porneste conversia si asteapta finalizarea acesteia. Valoarea rezultata este un numar intre 0 si 1023.

Semnalul senzorului a fost testat separat in Serial Monitor. Au fost verificate mai multe situatii:

  • A0 conectat direct la GND - valorile au fost apropiate de 0, confirmand ca ADC-ul citeste corect masa;
  • A0 conectat direct la 5V - valorile au fost apropiate de 1023, confirmand ca ADC-ul citeste corect alimentarea;
  • senzor conectat fara deget - valorile au fost instabile daca senzorul era expus la lumina;
  • senzor acoperit sau tinut intre degete - semnalul a devenit mai stabil si a putut fi folosit pentru detectie.

Aceasta testare a aratat ca pozitia degetului si lumina ambientala influenteaza mult semnalul senzorului.

Filtrarea semnalului

Semnalul analogic primit de la senzor poate avea zgomot si variatii false. Din acest motiv, programul foloseste doua valori filtrate:

  • avgValue - o medie rapida, care urmareste mai repede schimbarile semnalului;
  • avgSlow - o medie lenta, care reprezinta nivelul de baza al semnalului.

Media rapida este calculata astfel incat sa urmareasca varfurile semnalului, iar media lenta se modifica mai greu, oferind un baseline. O bataie este considerata valida atunci cand semnalul rapid trece printr-un varf si este suficient de mult peste media lenta.

Aceasta metoda reduce detectiile false, deoarece nu se foloseste o valoare absoluta fixa, ci o diferenta fata de nivelul de baza al semnalului.

Detectarea batailor

Pentru detectarea unei batai, programul verifica trei conditii:

  • semnalul filtrat a fost in crestere si apoi incepe sa scada, ceea ce indica un varf;
  • valoarea filtrata este mai mare decat media lenta cu cel putin PEAK_DELTA;
  • a trecut un timp minim de la ultima bataie detectata, definit prin REFRACTORY_MS.

Timpul minim dintre doua batai este necesar pentru a evita numararea aceleiasi batai de mai multe ori. De exemplu, daca REFRACTORY_MS este 600 ms, programul nu poate detecta doua batai la un interval mai mic de 600 ms. Acest lucru elimina o parte din zgomot si valorile imposibile.

La fiecare bataie detectata:

  • contorul de batai este incrementat;
  • LED-urile rosii se aprind scurt;
  • buzzerul reda un sunet scurt;
  • display-ul actualizeaza numarul de batai afisat.

Calculul BPM

Masurarea se face pe o durata de 60 de secunde. In aceasta perioada, programul numara cate batai au fost detectate. Deoarece fereastra de masurare este exact de un minut, BPM-ul final este egal cu numarul de batai detectate:

BPM = numar_batai_detectate_in_60_secunde

Pe display, in timpul masurarii, este afisat timpul ramas si numarul curent de batai. La final, sistemul compara BPM-ul cu intervalul normal ales pentru proiect:

  • daca BPM este intre 60 si 100, sistemul afiseaza OK si aprinde LED-urile verzi;
  • daca BPM este sub 60, sistemul afiseaza LOW si aprinde LED-urile rosii;
  • daca BPM este peste 100, sistemul afiseaza HIGH si aprinde LED-urile rosii.

Afisarea pe OLED

Display-ul OLED SSD1306 este controlat prin interfata I2C/TWI, folosind pinii PC4 pentru SDA si PC5 pentru SCL. Codul nu foloseste biblioteci externe pentru OLED, ci trimite direct comenzi si date catre display.

Pentru afisare a fost implementat un font minimal 5×7, suficient pentru caracterele folosite in proiect. Pentru a face textul mai vizibil, unele caractere sunt afisate marit prin dublarea pixelilor.

In timpul functionarii, display-ul poate afisa:

  • OFF - sistemul este oprit;
  • WAIT - sistemul asteapta pozitionarea senzorului;
  • TIME: xx - timpul ramas din masurare;
  • BPM xx - numarul de batai detectate pana in acel moment;
  • OK - puls in interval normal;
  • LOW - puls sub intervalul normal;
  • HIGH - puls peste intervalul normal.

O inima este afisata langa valoarea BPM pentru a indica vizual faptul ca numarul se refera la bataile inimii.

Semnalizare vizuala si sonora

LED-urile RGB sunt controlate prin doua canale folosite in proiect: rosu si verde. Deoarece LED-urile sunt de tip anod comun, pinii comuni sunt conectati la +5V, iar canalele de culoare sunt comandate pe partea de GND prin tranzistoare BD139.

La fiecare bataie detectata:

  • canalul rosu este activat scurt;
  • buzzerul reda un sunet scurt;
  • contorul BPM de pe display creste.

La finalul masurarii:

  • verde indica BPM normal;
  • rosu indica BPM prea mic sau prea mare.

Rolul butonului

Butonul este conectat la PD2 si foloseste pull-up intern. Astfel:

  • cand butonul nu este apasat, pinul citeste 1 logic;
  • cand butonul este apasat, pinul este conectat la GND si citeste 0 logic.

Programul detecteaza tranzitia de la neapasat la apasat si schimba starea sistemului. Prima apasare porneste masurarea, iar o alta apasare poate opri sistemul si reveni in starea IDLE.

Integrarea functionalitatilor din laborator

Proiectul integreaza mai multe concepte studiate la laborator:

  • GPIO - controlul LED-urilor, buzzerului si citirea butonului;
  • ADC - citirea semnalului analogic de la senzorul de puls;
  • I2C/TWI - comunicatia cu display-ul OLED SSD1306;
  • temporizari software - generarea impulsurilor pentru buzzer si LED-uri;
  • filtrare software - stabilizarea semnalului citit de la senzor;
  • masina de stari - organizarea programului in IDLE, WAIT_FINGER, MEASURING si RESULT.

Fluxul de functionare

Fluxul principal al programului este:

1. Sistemul porneste in starea IDLE si afiseaza OFF.
2. Utilizatorul apasa butonul.
3. Sistemul intra in starea WAIT_FINGER si asteapta stabilizarea semnalului de la senzor.
4. Dupa detectarea unui semnal valid, sistemul intra in MEASURING.
5. Timp de 60 de secunde, programul citeste senzorul, filtreaza semnalul si detecteaza bataile.
6. La fiecare bataie detectata, LED-urile rosii pulseaza si buzzerul suna.
7. Display-ul afiseaza timpul ramas si numarul de batai detectate.
8. La finalul celor 60 de secunde, BPM-ul este evaluat.
9. Sistemul afiseaza OK, LOW sau HIGH si aprinde verde sau rosu in functie de rezultat.

Calibrarea si reglarea senzorului

O etapa importanta a proiectului a fost calibrarea senzorului de puls. Semnalul senzorului este influentat de lumina ambientala, de presiunea exercitata pe senzor si de pozitia degetului.

Pentru calibrare au fost realizate teste in Serial Monitor:

  • testarea pinului A0 direct la GND;
  • testarea pinului A0 direct la 5V;
  • testarea senzorului fara deget;
  • testarea senzorului acoperit;
  • testarea senzorului tinut intre degete.

Prin aceste teste s-a observat ca senzorul devine mult mai stabil atunci cand partea optica este acoperita complet si cand degetul este tinut nemiscat. Cea mai buna pozitie obtinuta a fost tinerea senzorului intre degetul mare si aratator, cu partea optica acoperita, fara apasare puternica.

Pentru reducerea detectiilor false au fost folosite:

  • filtrare prin medii rapide si lente;
  • prag relativ fata de baseline;
  • timp minim intre doua batai detectate;
  • pornirea masurarii doar dupa stabilizarea semnalului.

Rezultate Obtinute

Pana in acest moment au fost testate principalele componente hardware si software ale proiectului.

LED-urile RGB au fost testate pe canalul rosu si pe canalul verde. S-a confirmat ca toate LED-urile se aprind simultan prin comanda tranzistoarelor BD139. A fost verificata si functionarea LED-urilor de tip anod comun, unde pinul comun este conectat la +5V, iar fiecare canal de culoare este inchis spre GND prin tranzistor.

Buzzerul a fost testat impreuna cu LED-urile rosii. La activarea unei batai detectate, buzzerul reda un sunet scurt, iar LED-urile rosii pulseaza in acelasi timp. Astfel, feedback-ul vizual si sonor este sincronizat.

Display-ul OLED SSD1306 a fost testat separat prin afisarea unor mesaje simple si apoi integrat in proiect. Acesta afiseaza starea sistemului, timpul ramas din masurare si numarul de batai detectate. Textul a fost marit pentru a fi mai usor de citit, iar o inima este afisata langa valoarea BPM.

Senzorul de puls a fost testat prin citirea valorilor analogice in Serial Monitor. Testele A0-GND si A0-5V au confirmat functionarea corecta a ADC-ului. Ulterior, senzorul a fost testat in mai multe pozitii pentru a observa diferentele dintre semnalul fara deget, semnalul acoperit si semnalul cu deget. S-a observat ca semnalul este sensibil la lumina si la miscare, motiv pentru care au fost introduse filtrare software si praguri relative.

In forma curenta, sistemul poate porni masurarea de la buton, poate afisa informatii pe OLED, poate detecta varfuri ale semnalului de puls si poate semnaliza fiecare bataie prin LED-uri rosii si buzzer. La finalul masurarii, sistemul afiseaza valoarea BPM obtinuta si indica starea prin LED verde sau rosu.

Concluzii

Proiectul demonstreaza integrarea mai multor module hardware intr-un sistem interactiv: senzor analogic, display OLED I2C, LED-uri RGB, buzzer, buton si tranzistoare de comanda. Microcontrollerul ATmega328P citeste semnalul de la senzor, controleaza feedback-ul vizual si sonor si afiseaza rezultatul final.

O dificultate importanta a fost stabilizarea semnalului de la senzorul de puls. Valorile citite depind mult de pozitia degetului, de lumina ambientala si de miscarea firelor. Pentru a reduce aceste probleme, semnalul este filtrat software, iar detectarea batailor se face pe baza unui prag relativ fata de media semnalului, nu doar pe baza unei valori fixe.

Tranzistoarele BD139 s-au dovedit necesare pentru comanda simultana a mai multor LED-uri RGB, deoarece pinii microcontrollerului nu pot alimenta direct toate LED-urile. Display-ul OLED ofera feedback clar utilizatorului, iar buzzerul face interactiunea mai intuitiva prin sincronizarea sunetului cu fiecare bataie detectata.

Proiectul poate fi extins prin imbunatatirea algoritmului de filtrare, prin calibrare automata mai avansata a senzorului si prin salvarea istoricului BPM. Chiar si in forma actuala, proiectul evidentiaza folosirea practica a conceptelor de ADC, GPIO, I2C, filtrare software si control al starilor intr-un sistem embedded.

Video demonstrativ

Bibliografie/Resurse

pm/prj2026/alexandru.jipa2803/andreea.voinea1305.1779584473.txt.gz · Last modified: 2026/05/24 04:01 by andreea.voinea1305
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