This shows you the differences between two versions of the page.
|
pm:prj2026:alexandru.jipa2803:andreea.voinea1305 [2026/05/16 21:26] andreea.voinea1305 |
pm:prj2026:alexandru.jipa2803:andreea.voinea1305 [2026/05/25 10:48] (current) andreea.voinea1305 |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | |||
| - | |||
| - | |||
| - | Edit | ||
| - | |||
| - | |||
| - | Edit | ||
| - | |||
| - | |||
| - | Edit | ||
| - | |||
| - | |||
| - | e ok kit ul acesta? | ||
| - | |||
| - | asta e bun? | ||
| - | |||
| - | Edit | ||
| - | |||
| - | Imaginea arata cum ar arata proiectul tau pe breadboard folosind o banda WS2812B indoita in forma de inima, conectata la senzorul de puls, OLED si buzzer. | ||
| - | |||
| - | Daca vrei sa incerci alte directii, pot: | ||
| - | |||
| - | sa iti fac o schema exacta de wiring pentru toate componentele | ||
| - | |||
| - | sa iti desenez layout-ul optim pe breadboard | ||
| - | |||
| - | sa iti scriu lista finala de conexiuni pin-cu-pin pentru ATmega328P | ||
| - | |||
| - | |||
| - | si daca as vrea sa fac asa ce piese mi ar trb ? e complicat sa pun asta in carcasa? | ||
| - | |||
| - | 52bd39ef-3b3c-4d01-8af4-8073732f16d9.png | ||
| - | 7a2f42ac-adf3-4af7-86ae-33b8f8d77e9e.png | ||
| - | e buna? | ||
| - | |||
| - | |||
| - | pot sa iau asa si sa iau 3? | ||
| - | |||
| - | 771da4b0-3ffc-409d-8701-3b7ba720f540.png | ||
| - | 8b7dde87-4f3e-445c-bab5-984c5232390e.png | ||
| - | |||
| - | 90b2d07e-c70a-47f6-8ab3-5726fc1ea2f5.png | ||
| - | ededc456-2598-43c2-ac45-264301db7cba.png | ||
| - | |||
| - | |||
| - | Uita te doar la rezostente daca s ok | ||
| - | |||
| - | Deci, aici sunt două breadboard-uri lipite. Am pus LED-urile în formă de inimă, patru în A, B, C, D, E, deci deasupra șanțului și restul sub șanț, sunt nouă, în total. Bun, am legat fiecare pin cel mai lung al LED-ului la linia roșie, numai că pe primele de sus, deasupra șanțului, am legat la linia roșie de sus de pe breadboard și pe cele de jos, de sub șanț, le-am legat la linia roșie de sub șanț. E ok? | ||
| - | |||
| - | Nu inteleg nimic ce fac acum? Zi mi pasul 1 | ||
| - | |||
| - | Asa? | ||
| - | |||
| - | |||
| - | |||
| - | Pai aici e | ||
| - | |||
| - | |||
| - | Daca l asez asa e bn? | ||
| - | |||
| - | |||
| - | Are ceva daca am dat cele 2 lunii de la breadboard jos si le am unit? | ||
| - | |||
| - | |||
| - | Așa e bine, gen trag o rezistență de la pinul roșu în linia apoi un fir de la lung roșu pe linia albastră până în ground și apoi un ground de la ground-ul becului până pe linia roșie și din linia roșie un fir lung care merge în 5V pe placă. | ||
| - | |||
| - | S au aprins doua simulan cu 1k | ||
| - | |||
| - | Ledurile de sus nu merg daca le bag rezistenta tot sus, doar daca i bag jos | ||
| - | |||
| - | Cele de sus nu merg chiar daca le pun rezistenta | ||
| - | |||
| - | Acum merge unul in plus si atat | ||
| - | |||
| - | |||
| - | Le am testat cu rezistenta de 1k pot folosi 1k pe rosu si 220 pe verde? | ||
| - | |||
| - | E bine asa? | ||
| - | |||
| - | Nu se aprinde ala | ||
| - | |||
| - | S-a gândit timp de 13s | ||
| - | Ok. Pentru LED-ul ăla care nu se aprinde prin tranzistor, fă testul ăsta în ordine. Nu modifica restul. | ||
| - | |||
| - | Test 1: verifică dacă LED-ul + rezistența sunt bune | ||
| - | Scoate tranzistorul din ecuație temporar. | ||
| - | |||
| - | La LED-ul care nu merge, fă: | ||
| - | |||
| - | pin lung LED -> +5V | ||
| - | |||
| - | pin roșu LED -> rezistență 1kΩ -> GND | ||
| - | Adică exact cum îl aprindeai înainte, direct la GND. | ||
| - | |||
| - | Rezultat: | ||
| - | dacă se aprinde: LED-ul și rezistența sunt bune; | ||
| - | |||
| - | dacă nu se aprinde: problema e la LED / pin greșit / rezistență pusă greșit. | ||
| - | |||
| - | Test 2: verifică tranzistorul | ||
| - | Dacă LED-ul merge direct, atunci îl bagi iar prin BD139. | ||
| - | |||
| - | Schema trebuie să fie: | ||
| - | |||
| - | pin lung LED -> +5V | ||
| - | |||
| - | pin roșu LED -> rezistență 1kΩ -> C tranzistor | ||
| - | |||
| - | E tranzistor -> GND | ||
| - | |||
| - | B tranzistor -> rezistență 1kΩ -> +5V | ||
| - | Pentru BD139, cu scrisul spre tine: | ||
| - | |||
| - | stânga = E | ||
| - | mijloc = C | ||
| - | dreapta = B | ||
| - | Deci: | ||
| - | |||
| - | LED-ul intră în pinul din mijloc | ||
| - | GND intră în pinul din stânga | ||
| - | +5V prin rezistență intră în pinul din dreapta | ||
| - | Test 3: foarte important | ||
| - | Scoate rezistența care merge în B și atinge direct cu un fir prin rezistență de 1kΩ la +5V. | ||
| - | |||
| - | Adică: | ||
| - | |||
| - | B -> rezistență 1kΩ -> +5V | ||
| - | Dacă LED-ul nu se aprinde nici așa, ai una din astea: | ||
| - | |||
| - | E/C/B sunt inversate | ||
| - | rezistența LED-ului nu intră de fapt în C | ||
| - | E nu e conectat la GND real | ||
| - | pinul lung al LED-ului nu e la +5V | ||
| - | Cel mai probabil la tine | ||
| - | Din poză pare posibil ca tranzistorul să fie rotit sau să fi pus rezistența de comandă în pinul greșit. | ||
| - | |||
| - | Ține regula asta: | ||
| - | |||
| - | C = primește rezistența de la LED | ||
| - | E = merge la GND | ||
| - | B = merge la +5V prin rezistență | ||
| - | Nu conecta B direct la +5V fără rezistență. | ||
| - | |||
| - | |||
| - | Introducere | ||
| - | 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 amplifica semnalul de pe pinii microcontrollerului pentru a comanda cele 13 LED-uri RGB simultan | ||
| - | 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 catod comun x13 | ||
| - | Display OLED 0.96” SSD1306 I2C x1 | ||
| - | Buzzer pasiv 5V x1 | ||
| - | Buton tactil 12x12mm x1 | ||
| - | Tranzistor NPN BD139 x3 | ||
| - | Rezistente 220 ohm x39 (3 per LED x 13 LED-uri) | ||
| - | Rezistente 1K ohm x3 (pentru baza tranzistoarelor) | ||
| - | Rezistente 10K ohm x1 (pull-up buton) | ||
| - | Breadboard 830 puncte x2 | ||
| - | Fire jumper tata-tata si tata-mama | ||
| - | Conexiuni | ||
| - | LED-uri RGB (13 bucati, catod comun) | ||
| - | |||
| - | Toate LED-urile au pinii R, G, B conectati prin cate o rezistenta de 220 ohm la colectorul tranzistoarelor BD139 corespunzatoare. Pinii GND (catod comun) sunt legati impreuna la masa circuitului. Tranzistoarele BD139 sunt necesare deoarece 13 LED-uri depasesc curentul maxim suportat de un pin al microcontrollerului (20mA). Fiecare tranzistor are baza conectata printr-o rezistenta de 1K ohm la un pin digital PWM: | ||
| - | |||
| - | 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. | ||
| - | |||
| - | 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 | ||
| - | Pinul PD2 suporta intrerupere externa INT0 pentru detectarea apasarii cu debouncing. | ||
| - | |||
| - | Calcule consum | ||
| - | Consum per canal LED (cu rezistenta 220 ohm): I = (5V - 2V) / 220 = 13.6mA per LED | ||
| - | |||
| - | 13 LED-uri pe un canal: 13 x 13.6mA = 177mA | ||
| - | Display OLED: ~20mA | ||
| - | Senzor puls: ~4mA | ||
| - | Buzzer: ~30mA | ||
| - | ATmega328P: ~20mA | ||
| - | Total maxim (1 canal LED activ): ~251mA | ||
| - | Alimentare USB 5V / 500mA — consum in limite sigure. | ||
| - | |||
| - | Software Design | ||
| - | Mediu de dezvoltare: PlatformIO + VSCode, framework AVR, cod C cu avr-gcc. | ||
| - | |||
| - | Algoritmi si structuri planificate: | ||
| - | |||
| - | Citire ADC in mod Free Running pentru senzorul de puls | ||
| - | Detectare varfuri de semnal (peak detection) cu praguri UPPER si LOWER calibrate experimental | ||
| - | Calcul BPM in timp real: BPM = 60000 / intervalul dintre doua batai consecutive (in ms) | ||
| - | Timer0 si Timer2 genereaza PWM pe pinii PD5, PD6, PD3 pentru efectul de fade al LED-urilor | ||
| - | Timer1 genereaza frecventele sonore pe PB1 pentru sunetul lub-dub al buzzerului | ||
| - | Comunicatie I2C cu display-ul OLED SSD1306 folosind registrele TWI (TWBR, TWCR, TWSR, TWDR) | ||
| - | Intrerupere externa INT0 pe PD2 pentru buton cu debouncing software (~50ms) | ||
| - | Masina de stari: IDLE (LED-uri statice) → MEASURING (puls activ, LED-uri pulseaza, BPM pe display) → IDLE | ||
| - | Librarii 3rd-party planificate: | ||
| - | |||
| - | Librarie SSD1306 pentru OLED (adaptata pentru ATmega328P) | ||
| - | |||
| - | asta e ce am eu pe pagina proeictului, acum am 11 noturi, e ceva ce tre sa modific? sau nu e bn? | ||
| - | |||
| - | Thought for 12s | ||
| - | Da, trebuie să modifici. Acum pagina ta nu mai corespunde cu montajul real. | ||
| - | |||
| - | Cele mai importante greșeli: | ||
| - | |||
| - | 1. Ai scris „catod comun”, dar tu folosești anod comun | ||
| - | Schimbă peste tot: | ||
| - | |||
| - | LED-uri RGB 5mm catod comun | ||
| - | în: | ||
| - | |||
| - | LED-uri RGB 5mm anod comun | ||
| - | Și schimbă descrierea conexiunii. | ||
| - | |||
| - | Acum la tine corect este: | ||
| - | |||
| - | Pinul comun/anodul comun al fiecărui LED este conectat la +5V. | ||
| - | Pinii R, G, B sunt conectați prin rezistențe la colectoarele tranzistoarelor BD139. | ||
| - | Tranzistoarele comută conexiunea către GND. | ||
| - | Nu scrie că pinii comuni merg la GND, pentru că la tine merg la +5V. | ||
| - | |||
| - | 2. Ai 11 LED-uri, nu 13 | ||
| - | Schimbă peste tot: | ||
| - | |||
| - | 13 LED-uri RGB | ||
| - | în: | ||
| - | |||
| - | 11 LED-uri RGB | ||
| - | Lista de componente devine: | ||
| - | |||
| - | LED-uri RGB 5mm anod comun x11 | ||
| - | 3. Rezistențele nu mai sunt 39 pentru 13 LED-uri | ||
| - | Pentru 11 LED-uri RGB complete: | ||
| - | |||
| - | 11 LED-uri × 3 culori = 33 rezistențe | ||
| - | Deci schimbă: | ||
| - | |||
| - | Rezistente 220 ohm x39 (3 per LED x 13 LED-uri) | ||
| - | în una dintre variantele astea: | ||
| - | |||
| - | Dacă documentezi varianta finală ideală cu RGB complet: | ||
| - | Rezistente pentru LED-uri x33 (3 per LED x 11 LED-uri) | ||
| - | Dacă folosești valori diferite: | ||
| - | |||
| - | Rezistențe 1kΩ pentru canalul roșu x11 | ||
| - | Rezistențe 220Ω pentru canalele verde/albastru, după testare | ||
| - | Dar ca să fie simplu în proiect, eu aș scrie: | ||
| - | |||
| - | Rezistențe pentru LED-uri: 220Ω / 1kΩ, câte una pentru fiecare pin de culoare | ||
| - | 4. Descrierea BD139 trebuie modificată pentru anod comun | ||
| - | În loc de textul tău actual: | ||
| - | |||
| - | Toate LED-urile au pinii R, G, B conectati prin cate o rezistenta de 220 ohm la colectorul tranzistoarelor BD139 corespunzatoare. Pinii GND (catod comun) sunt legati impreuna la masa circuitului. | ||
| - | Scrie: | ||
| - | |||
| - | LED-urile RGB folosite sunt de tip anod comun. Pinii comuni ai LED-urilor sunt legați la +5V. Pentru fiecare culoare, pinii corespunzători R, G și B sunt conectați prin rezistențe individuale la câte un canal comun. Fiecare canal comun este conectat la colectorul unui tranzistor NPN BD139. Emitorul fiecărui tranzistor este conectat la GND, iar baza este comandată de un pin PWM al microcontrollerului printr-o rezistență de 1kΩ. | ||
| - | Asta este corect pentru schema ta. | ||
| - | |||
| - | 5. Calculele de consum trebuie refăcute | ||
| - | Tu ai calculat pentru 13 LED-uri cu 220Ω. Acum ai 11 LED-uri și pe roșu ai testat cu 1kΩ. | ||
| - | |||
| - | Pentru roșu cu 1kΩ: | ||
| - | |||
| - | I = (5V - 2V) / 1000Ω ≈ 3mA per LED | ||
| - | Pentru 11 LED-uri: | ||
| - | |||
| - | 11 × 3mA ≈ 33mA pe canalul roșu | ||
| - | Dacă pentru verde/albastru folosești 220Ω, poți păstra calcul aproximativ: | ||
| - | |||
| - | I = (5V - 2V) / 220Ω ≈ 13.6mA per LED | ||
| - | 11 × 13.6mA ≈ 150mA pe canal | ||
| - | Deci schimbă consumul: | ||
| - | |||
| - | 13 LED-uri pe un canal: 177mA | ||
| - | în: | ||
| - | |||
| - | 11 LED-uri pe un canal cu 220Ω: aproximativ 150mA | ||
| - | 11 LED-uri pe un canal cu 1kΩ: aproximativ 33mA | ||
| - | Totalul tău cu un canal activ devine aproximativ: | ||
| - | |||
| - | cu 220Ω: 150mA + 20mA OLED + 4mA senzor + 30mA buzzer + 20mA ATmega ≈ 224mA | ||
| - | cu 1kΩ pe roșu: 33mA + restul ≈ 107mA | ||
| - | 6. În schema din poză schimbă etichetele | ||
| - | În diagramă apare: | ||
| - | |||
| - | 13x LED RGB | ||
| - | Catod Comun | ||
| - | 220R | ||
| - | Trebuie să fie: | ||
| - | |||
| - | 11x LED RGB | ||
| - | Anod Comun | ||
| - | rezistențe individuale pe R/G/B | ||
| - | Și sus la LED-uri, comunul nu merge la GND. Trebuie să meargă la +5V. | ||
| - | |||
| - | Varianta corectată pentru secțiunea LED-uri | ||
| - | Poți pune asta direct: | ||
| - | |||
| - | LED-uri RGB (11 bucăți, anod comun) | ||
| - | |||
| - | LED-urile RGB sunt de tip anod comun. Pinii comuni ai LED-urilor sunt conectați la +5V. Pinii R, G și B ai fiecărui LED sunt conectați prin rezistențe individuale la câte un canal comun pentru fiecare culoare. Fiecare canal comun este comandat printr-un tranzistor NPN BD139. | ||
| - | |||
| - | Pentru fiecare tranzistor: | ||
| - | - colectorul este conectat la canalul de culoare corespunzător; | ||
| - | - emitorul este conectat la GND; | ||
| - | - baza este conectată printr-o rezistență de 1kΩ la un pin PWM al microcontrollerului. | ||
| - | |||
| - | Tranzistoarele sunt necesare deoarece toate LED-urile aprinse simultan pe un canal pot depăși curentul maxim suportat de un pin al microcontrollerului. | ||
| - | Concluzie | ||
| - | Nu e rău ce ai pe pagină, dar acum trebuie schimbate obligatoriu: | ||
| - | |||
| - | catod comun -> anod comun | ||
| - | 13 LED-uri -> 11 LED-uri | ||
| - | 39 rezistențe -> 33 rezistențe pentru RGB complet | ||
| - | pinii comuni la GND -> pinii comuni la +5V | ||
| - | calculul de consum pentru 11 LED-uri | ||
| - | schema hardware din imagine | ||
| - | Restul — senzor puls, OLED, buton, buzzer, pinii PWM — este ok ca idee. | ||
| - | |||
| - | |||
| - | da mi tu tot textul , fara diacritice | ||
| - | |||
| - | Thought for 14s | ||
| - | Mai jos ai textul corectat, fara diacritice, adaptat la varianta ta actuala cu 11 LED-uri RGB anod comun si tranzistoare BD139. | ||
| - | |||
| - | Introducere | ||
| - | 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 pulsului: verde pentru BPM normal, in intervalul 60-100 BPM, si rosu pentru BPM in afara intervalului. La apasarea butonului, masurarea porneste, iar 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 un semnal analogic catre ADC. | ||
| - | |||
| - | ATmega328P proceseaza semnalul, calculeaza BPM si controleaza celelalte module. | ||
| - | |||
| - | Tranzistoarele BD139 amplifica semnalul de pe pinii microcontrollerului pentru a comanda cele 11 LED-uri RGB simultan. | ||
| - | |||
| - | LED-urile RGB pulseaza in ritmul detectat si isi schimba culoarea in functie de BPM: verde pentru puls normal, rosu pentru puls 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 - 1 bucata | ||
| - | |||
| - | LED-uri RGB 5mm anod comun - 11 bucati | ||
| - | |||
| - | Display OLED 0.96” SSD1306 I2C - 1 bucata | ||
| - | |||
| - | Buzzer pasiv 5V - 1 bucata | ||
| - | |||
| - | Buton tactil 12x12mm - 1 bucata | ||
| - | |||
| - | Tranzistor NPN BD139 - 3 bucati | ||
| - | |||
| - | Rezistente pentru LED-uri - cate una pentru fiecare pin de culoare folosit | ||
| - | |||
| - | Rezistente 1k ohm - pentru baza tranzistoarelor | ||
| - | |||
| - | Rezistenta 10k ohm - pentru pull-up buton, daca nu se foloseste pull-up intern | ||
| - | |||
| - | Breadboard 830 puncte - 2 bucati | ||
| - | |||
| - | 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 al LED-urilor, astfel incat inima sa poata pulsa gradual. | ||
| - | |||
| - | 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 | ||
| - | Senzorul de puls trimite un semnal analogic catre microcontroller. Acesta este citit prin convertorul analog-digital al ATmega328P. | ||
| - | |||
| - | Conexiuni: | ||
| - | |||
| - | S / Semnal -> PC0 (ADC0) | ||
| - | VCC -> 5V | ||
| - | GND -> GND | ||
| - | Pinul PC0 a fost ales deoarece corespunde canalului ADC0 si permite citirea semnalului analogic de la senzor. | ||
| - | |||
| - | Display OLED 0.96” SSD1306 I2C | ||
| - | Display-ul OLED este folosit pentru afisarea valorii BPM in timp real. Comunicatia se face prin protocolul I2C. | ||
| - | |||
| - | Conexiuni: | ||
| - | |||
| - | 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 | ||
| - | Buzzerul pasiv este folosit pentru redarea unui sunet scurt de tip lub-dub la fiecare bataie detectata. | ||
| - | |||
| - | Conexiuni: | ||
| - | |||
| - | Pin pozitiv -> PB1 (OC1A) | ||
| - | Pin negativ -> GND | ||
| - | Pinul PB1 suporta PWM pe Timer1, ceea ce permite generarea frecventelor sonore necesare pentru buzzer. | ||
| - | |||
| - | Buton tactil | ||
| - | Butonul este folosit pentru pornirea si oprirea masurarii pulsului. | ||
| - | |||
| - | Conexiuni: | ||
| - | |||
| - | Un pin -> PD2 (INT0) | ||
| - | Celalalt pin -> GND | ||
| - | Se poate folosi o rezistenta externa de pull-up de 10k ohm intre PD2 si 5V sau pull-up-ul intern al microcontrollerului. Pinul PD2 a fost ales deoarece suporta intreruperea externa INT0, utila pentru detectarea apasarii butonului. | ||
| - | |||
| - | 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.6 mA | ||
| - | Pentru 11 LED-uri aprinse pe acelasi canal: | ||
| - | |||
| - | 11 x 13.6 mA = 149.6 mA | ||
| - | Deci un canal LED cu rezistente de 220 ohm consuma aproximativ 150 mA. | ||
| - | |||
| - | Pentru o rezistenta de 1k ohm, curentul aproximativ printr-un LED rosu este: | ||
| - | |||
| - | I = (5V - 2V) / 1000 ohm | ||
| - | I = 3V / 1000 ohm | ||
| - | I = 3 mA | ||
| - | Pentru 11 LED-uri aprinse pe acelasi canal: | ||
| - | |||
| - | 11 x 3 mA = 33 mA | ||
| - | Estimare consum total, cu un canal LED activ: | ||
| - | |||
| - | LED-uri, 11 bucati, canal cu 220 ohm: aproximativ 150 mA | ||
| - | OLED SSD1306: aproximativ 20 mA | ||
| - | Senzor puls: aproximativ 4 mA | ||
| - | Buzzer: aproximativ 30 mA | ||
| - | ATmega328P: aproximativ 20 mA | ||
| - | Total: aproximativ 224 mA | ||
| - | Alimentarea prin USB 5V / 500 mA este suficienta pentru aceasta configuratie, mai ales deoarece proiectul nu aprinde toate cele trei culori la intensitate maxima in acelasi timp. | ||
| - | |||
| - | Software Design | ||
| - | Mediu de dezvoltare: PlatformIO + VSCode, framework AVR, cod C cu avr-gcc. | ||
| - | |||
| - | Algoritmi si structuri planificate: | ||
| - | |||
| - | Citire ADC pentru senzorul de puls. | ||
| - | |||
| - | Detectare varfuri de semnal prin peak detection, folosind praguri calibrate experimental. | ||
| - | |||
| - | Calcul BPM in timp real cu formula: | ||
| - | |||
| - | BPM = 60000 / intervalul dintre doua batai consecutive in milisecunde | ||
| - | Timer0 si Timer2 genereaza PWM pe pinii PD5, PD6 si PD3 pentru efectul de fade al LED-urilor RGB. | ||
| - | |||
| - | Timer1 genereaza semnal PWM pe PB1 pentru sunetul buzzerului. | ||
| - | |||
| - | Comunicatie I2C cu display-ul OLED SSD1306 folosind interfata TWI a microcontrollerului. | ||
| - | |||
| - | Intrerupere externa INT0 pe PD2 pentru buton, cu debouncing software. | ||
| - | |||
| - | Masina de stari pentru functionarea proiectului: | ||
| - | |||
| - | IDLE -> MEASURING -> IDLE | ||
| - | In starea IDLE, masurarea este oprita. La apasarea butonului, sistemul intra in starea MEASURING. In aceasta stare, senzorul citeste pulsul, LED-urile pulseaza, buzzerul reda sunetul la fiecare bataie detectata, iar OLED-ul afiseaza BPM. La o noua apasare a butonului, sistemul revine in IDLE. | ||
| - | |||
| - | Librarii 3rd-party planificate | ||
| - | Librarie SSD1306 pentru display-ul OLED, adaptata pentru ATmega328P. | ||
| - | |||
| - | Eventual functii auxiliare pentru I2C/TWI si afisarea textului pe OLED. | ||
| - | |||
| - | Rezumat pini ATmega328P | ||
| - | PD5 (OC0B) -> tranzistor canal Rosu, PWM | ||
| - | PD6 (OC0A) -> tranzistor canal Verde, PWM | ||
| - | PD3 (OC2B) -> tranzistor canal Albastru, PWM | ||
| - | |||
| - | PC0 (ADC0) -> senzor puls | ||
| - | |||
| - | PC4 (SDA) -> OLED SDA | ||
| - | PC5 (SCL) -> OLED SCL | ||
| - | |||
| - | PD2 (INT0) -> buton tactil | ||
| - | |||
| - | PB1 (OC1A) -> buzzer pasiv, PWM | ||
| - | |||
| - | 5V -> alimentare LED-uri, OLED, senzor | ||
| - | GND -> masa comuna circuit | ||
| - | Observatii | ||
| - | LED-urile RGB sunt de tip anod comun, deci pinii comuni sunt conectati la +5V. Tranzistoarele BD139 sunt folosite ca switch-uri pe partea de GND, cate unul pentru fiecare canal de culoare. Astfel, microcontrollerul nu alimenteaza direct LED-urile, ci doar comanda tranzistoarele prin semnale PWM. | ||
| - | |||
| - | |||
| - | |||
| - | Pasted text.txt | ||
| - | Document | ||
| - | in formatul asta te rog | ||
| - | |||
| - | Thought for 14s | ||
| - | Da. Iti dau textul in acelasi format ca pagina ta, cu ====, *, link-uri etc. Am pastrat structura din fisierul tau si am corectat partea cu 11 LED-uri, anod comun, BD139. Am folosit formatul din pagina ta initiala. | ||
| - | |||
| - | |||
| ====== Inima Interactiva ====== | ====== Inima Interactiva ====== | ||
| - | |||
| - | Autor: Voinea Andreea, Grupa: 333CB | ||
| - | |||
| - | ===== Introducere ===== | ||
| 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. | 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. | ||
| Line 593: | Line 6: | ||
| ===== Descriere generala ===== | ===== Descriere generala ===== | ||
| - | {{:pm:prj2026:andreea.voinea:schema_generala.png}} | + | {{:pm:prj2026:alexandru.jipa2803:diagrama_fara_titlu.drawio.png?800|}} |
| Modulele proiectului si modul in care interactioneaza: | Modulele proiectului si modul in care interactioneaza: | ||
| Line 606: | Line 19: | ||
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| - | {{:pm:prj2026:andreea.voinea:schema_hardware.png?700}} | + | {{:pm:prj2026:alexandru.jipa2803:schema_electricaAV.png?800|}} |
| ==== Lista de componente ==== | ==== Lista de componente ==== | ||
| Line 622: | Line 35: | ||
| * Breadboard 830 puncte x2 | * Breadboard 830 puncte x2 | ||
| * Fire jumper tata-tata si tata-mama | * Fire jumper tata-tata si tata-mama | ||
| + | |||
| + | {{: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 688: | 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 = 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 = (5V - 2V) / 1000 ohm | ||
| Line 708: | Line 116: | ||
| I = 3mA | I = 3mA | ||
| - | Pentru 11 LED-uri aprinse pe acelasi canal: | + | Pentru 11 LED-uri rosii aprinse simultan: |
| - | 11 x 3mA = 33mA | + | I_total_rosu = 11 x 3mA |
| + | I_total_rosu = 33mA | ||
| - | Estimare consum total, cu un canal LED activ: | + | Deci canalul rosu consuma aproximativ 33mA. |
| - | * LED-uri, 11 bucati, canal cu 220 ohm: aproximativ 150mA | + | 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: |
| - | * 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. | + | I = (5V - 3V) / 220 ohm |
| + | I = 2V / 220 ohm | ||
| + | I = 9.1mA | ||
| - | ===== Software Design ===== | + | Pentru 11 LED-uri verzi aprinse simultan: |
| - | Mediu de dezvoltare: PlatformIO + VSCode, framework AVR, cod C cu avr-gcc. | + | I_total_verde = 11 x 9.1mA |
| + | I_total_verde = 100.1mA | ||
| - | Algoritmi si structuri planificate: | + | Deci canalul verde consuma aproximativ 100mA. |
| - | * Citire ADC pentru senzorul de puls | + | |
| - | * Detectare varfuri de semnal (peak detection) cu praguri UPPER si LOWER calibrate experimental | + | |
| - | * Calcul BPM in timp real: BPM = 60000 / intervalul dintre doua batai consecutive (in ms) | + | |
| - | * Timer0 si Timer2 genereaza PWM pe pinii PD5, PD6, PD3 pentru efectul de fade al LED-urilor | + | |
| - | * Timer1 genereaza frecventele sonore pe PB1 pentru sunetul lub-dub al buzzerului | + | |
| - | * Comunicatie I2C cu display-ul OLED SSD1306 folosind registrele TWI (TWBR, TWCR, TWSR, TWDR) | + | |
| - | * Intrerupere externa INT0 pe PD2 pentru buton cu debouncing software (~50ms) | + | |
| - | * Masina de stari: IDLE (LED-uri statice) -> MEASURING (puls activ, LED-uri pulseaza, BPM pe display) -> IDLE | + | |
| - | In starea IDLE, masurarea este oprita. La apasarea butonului, sistemul intra in starea MEASURING. In aceasta stare, senzorul citeste pulsul, LED-urile pulseaza, buzzerul reda sunetul la fiecare bataie detectata, iar OLED-ul afiseaza BPM. La o noua apasare a butonului, sistemul revine in IDLE. | + | 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. |
| - | Librarii 3rd-party planificate: | + | Estimare consum total, cu un canal LED activ: |
| - | * Librarie SSD1306 pentru OLED (adaptata pentru ATmega328P) | + | |
| - | ===== Rezultate Obtinute ===== | + | * 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 | ||
| + | * Senzor puls HW-827: aproximativ 4mA | ||
| + | * Buzzer pasiv: aproximativ 30mA | ||
| + | * ATmega328P: aproximativ 20mA | ||
| - | Pana in acest moment au fost testate individual componentele principale ale proiectului. LED-urile RGB au fost montate pe breadboard si testate pe canalul rosu, folosind rezistente de limitare a curentului. A fost verificata functionarea simultana a LED-urilor si a fost stabilita schema corecta pentru LED-uri RGB de tip anod comun. | + | Caz estimat cu rosu activ: |
| - | A fost testata si ideea de comanda prin tranzistor BD139, unde tranzistorul functioneaza ca un switch pe partea de GND. In aceasta configuratie, pinul comun al LED-ului este conectat la +5V, pinul de culoare trece printr-o rezistenta catre colectorul tranzistorului, emitorul este conectat la GND, iar baza este comandata printr-o rezistenta de 1K ohm. | + | 33mA + 20mA + 4mA + 30mA + 20mA = 107mA |
| - | ===== Concluzii ===== | + | Caz estimat cu verde activ: |
| - | Proiectul combina citirea unui semnal biologic simplu cu feedback vizual si sonor. Folosirea LED-urilor RGB permite reprezentarea intuitiva a starii pulsului, iar display-ul OLED ofera afisarea valorii BPM in timp real. Tranzistoarele BD139 sunt necesare pentru comanda simultana a mai multor LED-uri, deoarece pinii microcontrollerului nu pot furniza direct curentul necesar pentru toate LED-urile. | + | 100mA + 20mA + 4mA + 20mA = 144mA |
| - | O dificultate importanta a fost montarea LED-urilor RGB pe breadboard, deoarece fiecare LED are patru pini si trebuie respectata orientarea corecta a pinilor. De asemenea, a fost necesara conectarea corecta a liniilor de alimentare intre cele doua breadboard-uri. | + | Daca s-ar aprinde simultan rosu si verde, consumul LED-urilor ar fi: |
| - | ===== Download ===== | + | 33mA + 100mA = 133mA |
| + | Iar consumul total ar fi aproximativ: | ||
| - | ===== Jurnal ===== | + | 133mA + 20mA + 4mA + 30mA + 20mA = 207mA |
| - | * Saptamana 1: alegerea temei si documentare | + | 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. |
| - | * Saptamana 2: achizitie piese si testare componente individuale | + | |
| - | * Saptamana 3: testarea LED-urilor RGB pe breadboard si verificarea conexiunilor pentru anod comun | + | |
| - | * Saptamana 4: testarea comenzii canalului rosu prin tranzistor BD139 | + | |
| - | ===== Bibliografie/Resurse ===== | ||
| - | Resurse Hardware: | + | ===== Software Design ===== |
| - | * [[https://ww1.microchip.com/downloads/en/DeviceDoc/ATmega328P-datasheet.pdf|Datasheet ATmega328P]] | + | |
| - | * [[https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf|Datasheet SSD1306 OLED]] | + | |
| - | * [[https://pulsesensor.com/|Pulse Sensor - documentatie oficiala]] | + | |
| - | ====== Inima Interactiva ====== | + | 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. |
| - | Autor: Voinea Andreea, Grupa: 333CB | + | Implementarea este organizata pe stari, pentru ca fiecare etapa a functionarii sa fie separata clar. Starile folosite sunt: |
| - | ===== Introducere ===== | + | * 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. | ||
| - | 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. | + | ==== Initializarea sistemului ==== |
| - | ===== Descriere generala ===== | + | 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. | ||
| - | {{:pm:prj2026.jipa2803.drawio.png}} | + | Timer0 este folosit pentru functia de timp de tip millis(), care permite masurarea duratelor fara a depinde doar de delay-uri software. |
| - | Modulele proiectului si modul in care interactioneaza: | + | ==== Citirea senzorului de puls ==== |
| - | Senzorul de puls citeste bataile inimii de pe deget si trimite semnal analogic catre ADC | + | Senzorul HW-827 este conectat la ADC0 / PC0. Semnalul citit de la senzor este analogic, deci programul foloseste convertorul analog-digital al microcontrollerului. |
| - | ATmega328P proceseaza semnalul, calculeaza BPM si controleaza celelalte module | + | Functia adc_read() selecteaza canalul ADC dorit, porneste conversia si asteapta finalizarea acesteia. Valoarea rezultata este intre 0 si 1023. |
| - | Tranzistoarele BD139 amplifica semnalul de pe pinii microcontrollerului pentru a comanda cele 13 LED-uri RGB simultan | + | 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. |
| - | LED-urile RGB pulseaza in ritmul detectat si isi schimba culoarea in functie de BPM (verde = normal, rosu = in afara intervalului) | + | Aceasta filtrare este necesara deoarece senzorul este sensibil la lumina ambientala, la pozitia degetului si la miscarea firelor. |
| - | Display-ul OLED afiseaza BPM in timp real prin protocolul I2C | + | ==== Detectarea prezentei degetului ==== |
| - | Butonul porneste/opreste masurarea prin intrerupere externa INT0 | + | In varianta finala a codului, senzorul este folosit in principal pentru detectarea prezentei degetului. Programul foloseste doua praguri cu histerezis: |
| - | Buzzerul reda sunetul lub-dub la fiecare bataie detectata prin PWM | + | * 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. | ||
| - | ===== Hardware Design ===== | + | Folosirea a doua praguri diferite evita trecerile rapide intre starile „deget pus” si „deget luat” atunci cand semnalul oscileaza in jurul unei singure valori. |
| - | {{:pm:prj2026.jipa2803.png?700}} | + | 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. |
| - | ==== Lista de componente ==== | + | ==== Generarea batailor si calculul BPM ==== |
| - | ATmega328P Xplained Mini - unitatea de procesare | + | 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. |
| - | Senzor de puls cardiac (Pulse Sensor) x1 | + | 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. |
| - | LED-uri RGB 5mm catod comun x13 | + | Formula folosita pentru intervalul dintre doua batai este: |
| - | Display OLED 0.96" SSD1306 I2C x1 | + | interval = 60000 / BPM |
| - | Buzzer pasiv 5V x1 | + | unde intervalul este exprimat in milisecunde. |
| - | Buton tactil 12x12mm x1 | + | 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; | ||
| + | * buzzerul reda sunetul de tip lub-dub; | ||
| + | * display-ul actualizeaza numarul de batai afisat. | ||
| - | Tranzistor NPN BD139 x3 | + | Astfel, valoarea afisata la BPM creste sincronizat cu sunetul buzzerului si cu pulsatia LED-urilor rosii. |
| - | Rezistente 220 ohm x39 (3 per LED x 13 LED-uri) | + | ==== Masurarea timpului ==== |
| - | Rezistente 1K ohm x3 (pentru baza tranzistoarelor) | + | 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(). |
| - | Rezistente 10K ohm x1 (pull-up buton) | + | Display-ul afiseaza timpul ramas pana la finalul masurarii. Cronometrul se actualizeaza o data pe secunda. |
| - | Breadboard 830 puncte x2 | + | Pe ecran sunt afisate: |
| + | * TIME - timpul ramas din sesiunea de masurare; | ||
| + | * BPM - numarul curent de batai generate pana in acel moment; | ||
| + | * o inima langa valoarea BPM. | ||
| - | Fire jumper tata-tata si tata-mama | + | La finalul celor 60 de secunde, sistemul opreste masurarea si afiseaza rezultatul final. |
| - | ==== Conexiuni ==== | + | ==== Afisarea pe OLED ==== |
| - | LED-uri RGB (13 bucati, catod comun) | + | 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. |
| - | Toate LED-urile au pinii R, G, B conectati prin cate o rezistenta de 220 ohm la colectorul tranzistoarelor BD139 corespunzatoare. Pinii GND (catod comun) sunt legati impreuna la masa circuitului. Tranzistoarele BD139 sunt necesare deoarece 13 LED-uri depasesc curentul maxim suportat de un pin al microcontrollerului (20mA). Fiecare tranzistor are baza conectata printr-o rezistenta de 1K ohm la un pin digital PWM: | + | 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. |
| - | PD5 (OC0B) → rezistenta 1K → baza BD139 → canal Rosu | + | 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. | ||
| - | PD6 (OC0A) → rezistenta 1K → baza BD139 → canal Verde | + | ==== Controlul LED-urilor si al buzzerului ==== |
| - | PD3 (OC2B) → rezistenta 1K → baza BD139 → canal Albastru | + | LED-urile sunt controlate prin pinii PD5 si PD6: |
| - | Pinii PWM au fost alesi pentru a permite efectul de fade (puls) al LED-urilor. | + | * PD5 controleaza canalul rosu; |
| + | * PD6 controleaza canalul verde. | ||
| - | Senzor puls cardiac (Pulse Sensor) | + | 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. |
| - | Pinul S (semnal) → PC0 (ADC0) | + | 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. | ||
| - | VCC → 5V | + | 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. | ||
| - | GND → GND | + | ==== Butonul ==== |
| - | Pinul ADC0 a fost ales deoarece senzorul ofera un semnal analogic citit prin convertorul analog-digital. | + | |
| - | Display OLED 0.96" SSD1306 | + | 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. |
| - | SDA → PC4 (SDA) | + | Programul detecteaza tranzitia de la neapasat la apasat si foloseste un debounce software de 50 ms. La apasarea butonului: |
| + | * daca sistemul este in OFF, porneste secventa de calibrare; | ||
| + | * daca sistemul este in alta stare, se opreste si revine la OFF. | ||
| - | SCL → PC5 (SCL) | + | ==== Fluxul final al programului ==== |
| - | VCC → 5V | + | Fluxul de functionare al programului este: |
| - | GND → GND | + | 1. Sistemul porneste in starea OFF. |
| - | Pinii PC4 si PC5 sunt pinii hardware dedicati protocolului I2C (TWI) pe ATmega328P. | + | 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. | ||
| - | Buzzer pasiv | ||
| - | Pin pozitiv → PB1 (OC1A) | + | ==== Integrarea functionalitatilor din laborator ==== |
| - | Pin negativ → GND | + | Proiectul integreaza mai multe concepte studiate la laborator: |
| - | Pinul PB1 suporta PWM pe Timer1, necesar pentru generarea frecventelor sonore lub-dub. | + | |
| - | Buton tactil | + | * 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. | ||
| - | Un pin → PD2 (INT0) | + | ==== Fluxul de functionare ==== |
| - | Celalalt pin → GND | + | Fluxul principal al programului este: |
| - | Rezistenta pull-up 10K ohm intre PD2 si 5V | + | 1. Sistemul porneste in starea IDLE si afiseaza OFF. |
| - | Pinul PD2 suporta intrerupere externa INT0 pentru detectarea apasarii cu debouncing. | + | 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. | ||
| - | ==== Calcule consum ==== | + | ==== Calibrarea si reglarea senzorului ==== |
| - | Consum per canal LED (cu rezistenta 220 ohm): I = (5V - 2V) / 220 = 13.6mA per LED | + | 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. |
| - | 13 LED-uri pe un canal: 13 x 13.6mA = 177mA | + | Pentru calibrare au fost realizate teste in Serial Monitor: |
| - | Display OLED: ~20mA | + | * testarea pinului A0 direct la GND; |
| + | * testarea pinului A0 direct la 5V; | ||
| + | * testarea senzorului fara deget; | ||
| + | * testarea senzorului acoperit; | ||
| + | * testarea senzorului tinut intre degete. | ||
| - | Senzor puls: ~4mA | + | 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. |
| - | Buzzer: ~30mA | + | Pentru reducerea detectiilor false au fost folosite: |
| - | ATmega328P: ~20mA | + | * filtrare prin medii rapide si lente; |
| + | * prag relativ fata de baseline; | ||
| + | * timp minim intre doua batai detectate; | ||
| + | * pornirea masurarii doar dupa stabilizarea semnalului. | ||
| - | Total maxim (1 canal LED activ): ~251mA | + | ===== Rezultate Obtinute ===== |
| - | Alimentare USB 5V / 500mA — consum in limite sigure. | + | |
| - | ===== Software Design ===== | + | 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. |
| - | Mediu de dezvoltare: PlatformIO + VSCode, framework AVR, cod C cu avr-gcc. | + | 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. |
| - | Algoritmi si structuri planificate: | + | 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. |
| - | Citire ADC in mod Free Running pentru senzorul de puls | + | 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. |
| - | Detectare varfuri de semnal (peak detection) cu praguri UPPER si LOWER calibrate experimental | + | 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. |
| - | Calcul BPM in timp real: BPM = 60000 / intervalul dintre doua batai consecutive (in ms) | + | ===== Concluzii ===== |
| - | Timer0 si Timer2 genereaza PWM pe pinii PD5, PD6, PD3 pentru efectul de fade al LED-urilor | + | 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. |
| - | Timer1 genereaza frecventele sonore pe PB1 pentru sunetul lub-dub al buzzerului | + | 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. |
| - | Comunicatie I2C cu display-ul OLED SSD1306 folosind registrele TWI (TWBR, TWCR, TWSR, TWDR) | + | 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. |
| - | Intrerupere externa INT0 pe PD2 pentru buton cu debouncing software (~50ms) | ||
| - | Masina de stari: IDLE (LED-uri statice) → MEASURING (puls activ, LED-uri pulseaza, BPM pe display) → IDLE | + | ==== Video demonstrativ ==== |
| - | Librarii 3rd-party planificate: | + | https://youtube.com/shorts/KqERROrqigY?feature=share |
| - | Librarie SSD1306 pentru OLED (adaptata pentru ATmega328P) | + | ==== GitHub ==== |
| - | ===== Rezultate Obtinute ===== | + | https://github.com/AndreeaV13/Proiect_PM_2026/tree/main |
| - | + | ||
| - | ===== Concluzii ===== | + | |
| - | + | ||
| - | ===== Download ===== | + | |
| - | + | ||
| - | ===== Jurnal ===== | + | |
| - | + | ||
| - | Saptamana 1: alegerea temei si documentare | + | |
| - | + | ||
| - | Saptamana 2: achizitie piese si testare componente individuale | + | |
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| Resurse Hardware: | Resurse Hardware: | ||
| + | * [[https://ww1.microchip.com/downloads/en/DeviceDoc/ATmega328P-datasheet.pdf|Datasheet ATmega328P]] | ||
| + | * [[https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf|Datasheet SSD1306 OLED]] | ||
| + | * [[https://pulsesensor.com/|Pulse Sensor - documentatie oficiala]] | ||
| - | [[https://ww1.microchip.com/downloads/en/DeviceDoc/ATmega328P-datasheet.pdf|Datasheet ATmega328P]] | + | Resurse Software: |
| - | + | * [[https://ww1.microchip.com/downloads/en/DeviceDoc/ATmega328P-Data-Sheet-40002061A.pdf|ATmega328P Datasheet]] | |
| - | [[https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf|Datasheet SSD1306 OLED]] | + | * [[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://pulsesensor.com/|Pulse Sensor - documentatie oficiala]] | + | * [[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]] | |
| - | Close | + | * [[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]] | ||