This shows you the differences between two versions of the page.
|
pm:prj2026:alexandru.jipa2803:andreea.voinea1305 [2026/05/24 04:01] andreea.voinea1305 |
pm:prj2026:alexandru.jipa2803:andreea.voinea1305 [2026/05/25 10:48] (current) andreea.voinea1305 |
||
|---|---|---|---|
| Line 36: | Line 36: | ||
| * Fire jumper tata-tata si tata-mama | * Fire jumper tata-tata si tata-mama | ||
| - | {{:pm:prj2026:alexandru.jipa2803:project.jpeg?800|}} | + | {{:pm:prj2026:alexandru.jipa2803:project.jpeg?600|}} |
| + | {{:pm:prj2026:alexandru.jipa2803:pm1.jpeg?600|}} | ||
| + | {{:pm:prj2026:alexandru.jipa2803:macheta1.jpeg?600|}} | ||
| + | {{:pm:prj2026:alexandru.jipa2803:macheta2.jpeg?600|}} | ||
| + | {{:pm:prj2026:alexandru.jipa2803:inside.jpeg?600|}} | ||
| ==== Conexiuni ==== | ==== Conexiuni ==== | ||
| Line 103: | Line 108: | ||
| ==== Calcule consum ==== | ==== Calcule consum ==== | ||
| - | Pentru LED-urile RGB se foloseste cate o rezistenta pentru fiecare pin de culoare. Curentul depinde de valoarea rezistentei folosite. | + | Pentru LED-urile RGB se foloseste cate o rezistenta de limitare a curentului pentru fiecare pin de culoare folosit. In proiect sunt utilizate doua canale de culoare: rosu si verde. LED-urile sunt de tip anod comun, deci pinul comun este conectat la +5V, iar fiecare canal este comandat spre GND printr-un tranzistor BD139. |
| - | Pentru o rezistenta de 220 ohm, curentul aproximativ printr-un LED rosu este: | + | Pentru canalul rosu s-au folosit rezistente de 1K ohm. Considerand o cadere de tensiune aproximativa de 2V pe LED-ul rosu, curentul printr-un LED este: |
| - | I = (5V - 2V) / 220 ohm | + | I = (5V - 2V) / 1000 ohm |
| - | I = 3V / 220 ohm | + | I = 3V / 1000 ohm |
| - | I = 13.6mA | + | I = 3mA |
| - | Pentru 11 LED-uri aprinse pe acelasi canal: | + | Pentru 11 LED-uri rosii aprinse simultan: |
| - | 11 x 13.6mA = 149.6mA | + | I_total_rosu = 11 x 3mA |
| + | I_total_rosu = 33mA | ||
| - | Deci un canal LED cu rezistente de 220 ohm consuma aproximativ 150mA. | + | Deci canalul rosu consuma aproximativ 33mA. |
| - | Pentru o rezistenta de 1K ohm, curentul aproximativ printr-un LED rosu este: | + | Pentru canalul verde s-au folosit rezistente de 220 ohm. Considerand o cadere de tensiune aproximativa de 3.0V pe LED-ul verde, curentul printr-un LED este: |
| - | I = (5V - 2V) / 1000 ohm | + | I = (5V - 3V) / 220 ohm |
| - | I = 3V / 1000 ohm | + | I = 2V / 220 ohm |
| - | I = 3mA | + | I = 9.1mA |
| + | |||
| + | Pentru 11 LED-uri verzi aprinse simultan: | ||
| + | |||
| + | I_total_verde = 11 x 9.1mA | ||
| + | I_total_verde = 100.1mA | ||
| - | Pentru 11 LED-uri aprinse pe acelasi canal: | + | Deci canalul verde consuma aproximativ 100mA. |
| - | 11 x 3mA = 33mA | + | In proiect, LED-urile rosii si verzi nu sunt folosite permanent la intensitate maxima in acelasi timp. Canalul rosu pulseaza scurt la fiecare bataie detectata/simulata, iar canalul verde se aprinde la final daca BPM-ul este in intervalul normal. |
| Estimare consum total, cu un canal LED activ: | Estimare consum total, cu un canal LED activ: | ||
| - | * LED-uri, 11 bucati, canal cu 220 ohm: aproximativ 150mA | + | * LED-uri rosii, 11 bucati, cu rezistente de 1K ohm: aproximativ 33mA |
| + | * LED-uri verzi, 11 bucati, cu rezistente de 220 ohm: aproximativ 100mA | ||
| * OLED SSD1306: aproximativ 20mA | * OLED SSD1306: aproximativ 20mA | ||
| - | * Senzor puls: aproximativ 4mA | + | * Senzor puls HW-827: aproximativ 4mA |
| - | * Buzzer: aproximativ 30mA | + | * Buzzer pasiv: aproximativ 30mA |
| * ATmega328P: aproximativ 20mA | * 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. | + | Caz estimat cu rosu activ: |
| + | 33mA + 20mA + 4mA + 30mA + 20mA = 107mA | ||
| - | ===== Software Design ===== | + | Caz estimat cu verde activ: |
| - | Firmware-ul proiectului implementeaza functiile principale necesare pentru functionarea inimii interactive: | + | 100mA + 20mA + 4mA + 20mA = 144mA |
| - | * citirea semnalului analogic de la senzorul de puls prin ADC0; | + | Daca s-ar aprinde simultan rosu si verde, consumul LED-urilor ar fi: |
| - | * filtrarea software a semnalului pentru reducerea zgomotului; | + | |
| - | * detectarea varfurilor semnalului asociate batailor inimii; | + | 33mA + 100mA = 133mA |
| - | * numararea batailor detectate intr-o fereastra de 60 de secunde; | + | |
| - | * afisarea pe display-ul OLED a timpului ramas si a numarului de batai detectate; | + | Iar consumul total ar fi aproximativ: |
| - | * 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. | + | 133mA + 20mA + 4mA + 30mA + 20mA = 207mA |
| + | |||
| + | Alimentarea prin USB 5V / 500mA este suficienta pentru aceasta configuratie. In plus, in functionarea normala, canalul rosu pulseaza doar pentru perioade scurte, iar canalul verde este folosit ca stare finala, deci sistemul nu functioneaza constant la consumul maxim estimat. | ||
| + | |||
| + | |||
| + | ===== Software Design ===== | ||
| - | Programul este organizat pe stari, pentru ca fiecare etapa a functionarii sa fie separata clar: | + | Partea software a proiectului este implementata in limbaj C pentru microcontrollerul ATmega328P Xplained Mini, fara utilizarea framework-ului Arduino. Programul foloseste direct registrele microcontrollerului pentru configurarea pinilor GPIO, a convertorului analog-digital, a comunicatiei I2C/TWI si a temporizarii prin Timer0. |
| - | * IDLE - sistemul este oprit, display-ul afiseaza OFF, iar LED-urile si buzzerul sunt oprite; | + | Implementarea este organizata pe stari, pentru ca fiecare etapa a functionarii sa fie separata clar. Starile folosite sunt: |
| - | * 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. | + | * STATE_OFF - sistemul este oprit, LED-urile si buzzerul sunt dezactivate, iar pe display apare mesajul OFF; |
| + | * STATE_CALIB - sistemul intra intr-o scurta etapa de calibrare dupa apasarea butonului; | ||
| + | * STATE_WAIT_FINGER - sistemul asteapta detectarea degetului pe senzor; | ||
| + | * STATE_MEASURING - sistemul afiseaza timpul ramas, numarul de batai si activeaza LED-urile/buzzerul sincronizat; | ||
| + | * RESULT - rezultatul este afisat prin valoarea BPM si prin culoarea LED-urilor. | ||
| - | ==== Module software implementate ==== | + | ==== Initializarea sistemului ==== |
| - | Codul este impartit logic in mai multe module functionale: | + | La pornire, programul initializeaza toate modulele necesare: |
| + | * pinii pentru LED-urile rosii si verzi sunt configurati ca iesiri; | ||
| + | * pinul pentru buzzer este configurat ca iesire; | ||
| + | * pinul butonului este configurat ca intrare cu rezistenta pull-up interna; | ||
| + | * ADC-ul este initializat pentru citirea semnalului analogic de la senzorul de puls conectat pe ADC0 / PC0; | ||
| + | * interfata TWI/I2C este initializata pentru comunicatia cu display-ul OLED SSD1306; | ||
| + | * Timer0 este configurat in mod CTC pentru a genera un contor de timp in milisecunde. | ||
| - | * modul GPIO - configureaza si controleaza pinii pentru LED-uri, buzzer si buton; | + | Timer0 este folosit pentru functia de timp de tip millis(), care permite masurarea duratelor fara a depinde doar de delay-uri software. |
| - | * 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 ==== | ==== 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. | + | Senzorul HW-827 este conectat la ADC0 / PC0. Semnalul citit de la senzor este analogic, deci programul foloseste convertorul analog-digital al microcontrollerului. |
| - | 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. | + | Functia adc_read() selecteaza canalul ADC dorit, porneste conversia si asteapta finalizarea acesteia. Valoarea rezultata este intre 0 si 1023. |
| - | Semnalul senzorului a fost testat separat in Serial Monitor. Au fost verificate mai multe situatii: | + | Pentru a evita valori complet eronate, citirea senzorului nu se face dintr-o singura proba, ci prin functia citeste_filtrat(). Aceasta citeste 16 valori consecutive, elimina valorile considerate invalide si returneaza media valorilor valide. Daca toate citirile sunt considerate glitch-uri, functia intoarce valoarea speciala 0xFFFF. |
| - | * A0 conectat direct la GND - valorile au fost apropiate de 0, confirmand ca ADC-ul citeste corect masa; | + | Aceasta filtrare este necesara deoarece senzorul este sensibil la lumina ambientala, la pozitia degetului si la miscarea firelor. |
| - | * 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. | + | ==== Detectarea prezentei degetului ==== |
| - | ==== Filtrarea semnalului ==== | + | In varianta finala a codului, senzorul este folosit in principal pentru detectarea prezentei degetului. Programul foloseste doua praguri cu histerezis: |
| - | Semnalul analogic primit de la senzor poate avea zgomot si variatii false. Din acest motiv, programul foloseste doua valori filtrate: | + | * PRAG_DEGET_SUS - daca valoarea filtrata trece peste acest prag, sistemul considera ca degetul a fost pus pe senzor; |
| + | * PRAG_DEGET_JOS - daca valoarea scade sub acest prag, sistemul considera ca degetul a fost ridicat. | ||
| - | * avgValue - o medie rapida, care urmareste mai repede schimbarile semnalului; | + | Folosirea a doua praguri diferite evita trecerile rapide intre starile „deget pus” si „deget luat” atunci cand semnalul oscileaza in jurul unei singure valori. |
| - | * 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. | + | Dupa apasarea butonului, sistemul intra in starea CALIB, apoi in STATE_WAIT_FINGER. In aceasta stare, display-ul afiseaza mesajul FINGER si sistemul asteapta ca senzorul sa indice prezenta degetului. Cand valoarea filtrata depaseste pragul PRAG_DEGET_SUS, sistemul trece in starea STATE_MEASURING. |
| - | Aceasta metoda reduce detectiile false, deoarece nu se foloseste o valoare absoluta fixa, ci o diferenta fata de nivelul de baza al semnalului. | + | ==== Generarea batailor si calculul BPM ==== |
| - | ==== Detectarea batailor ==== | + | Din cauza instabilitatii semnalului analogic al senzorului, varianta finala foloseste senzorul pentru detectarea degetului, iar bataile sunt generate software pe baza unei valori BPM alese pseudo-aleator. |
| - | Pentru detectarea unei batai, programul verifica trei conditii: | + | La momentul detectarii degetului, programul alege o valoare BPM intre BPM_MIN si BPM_MAX. Aceasta valoare este generata cu un generator pseudo-aleator simplu, initializat cu momentul atingerii senzorului, astfel incat valoarea sa varieze de la o masurare la alta. |
| - | * semnalul filtrat a fost in crestere si apoi incepe sa scada, ceea ce indica un varf; | + | Formula folosita pentru intervalul dintre doua batai este: |
| - | * 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. | + | interval = 60000 / BPM |
| - | La fiecare bataie detectata: | + | unde intervalul este exprimat in milisecunde. |
| - | * contorul de batai este incrementat; | + | In timpul starii MEASURING, programul verifica permanent daca a trecut intervalul corespunzator BPM-ului ales. Cand intervalul a trecut: |
| + | * contorul de batai creste; | ||
| * LED-urile rosii se aprind scurt; | * LED-urile rosii se aprind scurt; | ||
| - | * buzzerul reda un sunet scurt; | + | * buzzerul reda sunetul de tip lub-dub; |
| * display-ul actualizeaza numarul de batai afisat. | * display-ul actualizeaza numarul de batai afisat. | ||
| - | ==== Calculul BPM ==== | + | Astfel, valoarea afisata la BPM creste sincronizat cu sunetul buzzerului si cu pulsatia LED-urilor rosii. |
| - | 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: | + | ==== Masurarea timpului ==== |
| - | BPM = numar_batai_detectate_in_60_secunde | + | Durata unei sesiuni este de 60 de secunde, definita prin constanta MEASURE_SECONDS. La intrarea in starea MEASURING, programul salveaza momentul de start al sesiunii. Apoi calculeaza timpul scurs folosind functia millis(). |
| - | 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: | + | Display-ul afiseaza timpul ramas pana la finalul masurarii. Cronometrul se actualizeaza o data pe secunda. |
| - | * daca BPM este intre 60 si 100, sistemul afiseaza OK si aprinde LED-urile verzi; | + | Pe ecran sunt afisate: |
| - | * daca BPM este sub 60, sistemul afiseaza LOW si aprinde LED-urile rosii; | + | * TIME - timpul ramas din sesiunea de masurare; |
| - | * daca BPM este peste 100, sistemul afiseaza HIGH si aprinde LED-urile rosii. | + | * BPM - numarul curent de batai generate pana in acel moment; |
| + | * o inima langa valoarea BPM. | ||
| + | |||
| + | La finalul celor 60 de secunde, sistemul opreste masurarea si afiseaza rezultatul final. | ||
| ==== Afisarea pe OLED ==== | ==== 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. | + | Display-ul OLED SSD1306 este controlat prin protocolul I2C/TWI, folosind pinii PC4 pentru SDA si PC5 pentru SCL. In implementare nu sunt folosite biblioteci externe pentru display. Programul trimite direct comenzile si datele necesare catre controlerul SSD1306. |
| - | Pentru afisare a fost implementat un font minimal 5x7, suficient pentru caracterele folosite in proiect. Pentru a face textul mai vizibil, unele caractere sunt afisate marit prin dublarea pixelilor. | + | Pentru afisare este implementat un font minimal 5x7, stocat in memoria program prin PROGMEM. Sunt definite doar caracterele necesare pentru mesajele proiectului: cifre, literele folosite in OFF, CALIB, FINGER, TIME, BPM, OK si ANORMAL. |
| - | In timpul functionarii, display-ul poate afisa: | + | Display-ul poate afisa urmatoarele ecrane: |
| + | * OFF - sistem oprit; | ||
| + | * CALIB - etapa scurta de calibrare; | ||
| + | * FINGER - asteptarea pozitionarii degetului pe senzor; | ||
| + | * TIME si BPM - masurare in curs; | ||
| + | * BPM si OK / ANORMAL - rezultat final. | ||
| - | * OFF - sistemul este oprit; | + | ==== Controlul LED-urilor si al buzzerului ==== |
| - | * 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. | + | LED-urile sunt controlate prin pinii PD5 si PD6: |
| + | * PD5 controleaza canalul rosu; | ||
| + | * PD6 controleaza canalul verde. | ||
| - | ==== Semnalizare vizuala si sonora ==== | + | Acesti pini nu alimenteaza direct LED-urile, ci comanda tranzistoarele BD139. Tranzistoarele functioneaza ca switch-uri pe partea de GND, permitand aprinderea simultana a mai multor LED-uri fara a depasi curentul maxim suportat de pinii microcontrollerului. |
| - | 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 generata: |
| + | * LED-urile rosii se aprind scurt; | ||
| + | * buzzerul reda un sunet scurt de tip lub-dub; | ||
| + | * LED-urile rosii se sting dupa impuls. | ||
| - | La fiecare bataie detectata: | + | La final: |
| + | * daca BPM-ul ales este intre 60 si 100, se aprind LED-urile verzi; | ||
| + | * daca BPM-ul este in afara intervalului, se aprind LED-urile rosii si se afiseaza ANORMAL. | ||
| - | * canalul rosu este activat scurt; | + | ==== Butonul ==== |
| - | * buzzerul reda un sunet scurt; | + | |
| - | * contorul BPM de pe display creste. | + | |
| - | La finalul masurarii: | + | Butonul este conectat la PD2 si foloseste pull-up intern. In repaus, pinul citeste nivel logic 1, iar la apasare este conectat la GND si citeste nivel logic 0. |
| - | * verde indica BPM normal; | + | Programul detecteaza tranzitia de la neapasat la apasat si foloseste un debounce software de 50 ms. La apasarea butonului: |
| - | * rosu indica BPM prea mic sau prea mare. | + | * daca sistemul este in OFF, porneste secventa de calibrare; |
| + | * daca sistemul este in alta stare, se opreste si revine la OFF. | ||
| - | ==== Rolul butonului ==== | + | ==== Fluxul final al programului ==== |
| - | Butonul este conectat la PD2 si foloseste pull-up intern. Astfel: | + | Fluxul de functionare al programului este: |
| - | * cand butonul nu este apasat, pinul citeste 1 logic; | + | 1. Sistemul porneste in starea OFF. |
| - | * cand butonul este apasat, pinul este conectat la GND si citeste 0 logic. | + | 2. Utilizatorul apasa butonul. |
| + | 3. Sistemul intra in CALIB si citeste senzorul pentru o scurta perioada. | ||
| + | 4. Sistemul intra in FINGER si asteapta pozitionarea degetului pe senzor. | ||
| + | 5. Cand este detectat degetul, se alege o valoare BPM pseudo-aleatoare. | ||
| + | 6. Sistemul intra in MEASURING si porneste cronometrul de 60 de secunde. | ||
| + | 7. La fiecare interval corespunzator BPM-ului ales, LED-urile rosii pulseaza si buzzerul suna. | ||
| + | 8. Display-ul actualizeaza timpul ramas si numarul de batai. | ||
| + | 9. La finalul celor 60 de secunde, sistemul afiseaza BPM-ul final. | ||
| + | 10. Daca BPM-ul este intre 60 si 100, LED-urile verzi indica o stare normala. | ||
| + | 11. Daca BPM-ul este in afara intervalului, LED-urile rosii indica o stare anormala. | ||
| - | 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 ==== | ==== Integrarea functionalitatilor din laborator ==== | ||
| Line 315: | Line 346: | ||
| ===== Rezultate Obtinute ===== | ===== 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. | 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. | ||
| Line 335: | Line 364: | ||
| 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. | 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. | ||
| Line 342: | Line 369: | ||
| https://youtube.com/shorts/KqERROrqigY?feature=share | https://youtube.com/shorts/KqERROrqigY?feature=share | ||
| + | |||
| + | ==== GitHub ==== | ||
| + | |||
| + | https://github.com/AndreeaV13/Proiect_PM_2026/tree/main | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| Line 349: | Line 380: | ||
| * [[https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf|Datasheet SSD1306 OLED]] | * [[https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf|Datasheet SSD1306 OLED]] | ||
| * [[https://pulsesensor.com/|Pulse Sensor - documentatie oficiala]] | * [[https://pulsesensor.com/|Pulse Sensor - documentatie oficiala]] | ||
| + | |||
| + | Resurse Software: | ||
| + | * [[https://ww1.microchip.com/downloads/en/DeviceDoc/ATmega328P-Data-Sheet-40002061A.pdf|ATmega328P Datasheet]] | ||
| + | * [[https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf|SSD1306 OLED Controller Datasheet]] | ||
| + | * [[https://www.nongnu.org/avr-libc/user-manual/|AVR Libc User Manual]] | ||
| + | * [[https://www.nongnu.org/avr-libc/user-manual/group__avr__io.html|AVR Libc - avr/io.h]] | ||
| + | * [[https://www.nongnu.org/avr-libc/user-manual/group__util__delay.html|AVR Libc - util/delay.h]] | ||
| + | * [[https://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html|AVR Libc - avr/interrupt.h]] | ||
| + | * [[https://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html|AVR Libc - avr/pgmspace.h]] | ||
| + | * [[https://docs.platformio.org/en/latest/platforms/atmelavr.html|PlatformIO - Atmel AVR Platform]] | ||