This shows you the differences between two versions of the page.
pm:prj2024:sseverin:alexandru.vladut02 [2024/05/17 10:32] alexandru.vladut02 [Hardware Design] |
pm:prj2024:sseverin:alexandru.vladut02 [2024/05/27 17:11] (current) alexandru.vladut02 [Descriere generală] |
||
---|---|---|---|
Line 12: | Line 12: | ||
- **Inițierea monitorizării**: Utilizatorul pornește sesiunea de monitorizare a pulsului apăsând butonul conectat la Arduino. Acest moment marchează începutul perioadei de activitate fizică. | - **Inițierea monitorizării**: Utilizatorul pornește sesiunea de monitorizare a pulsului apăsând butonul conectat la Arduino. Acest moment marchează începutul perioadei de activitate fizică. | ||
- | - **Colectarea datelor**: Îndată ce sesiunea este inițiată, senzorul de puls începe să înregistreze ritmul cardiac al utilizatorului prin intermediul unor LED-uri cu infraroșu și a unui fotodetector, și transmite aceste date la placa Arduino în timp real. De asemenea, un LED RGB va semnala utilizatorului daca pulsul nu are o valoare optima. | + | - **Colectarea datelor**: Îndată ce sesiunea este inițiată, senzorul de puls începe să înregistreze ritmul cardiac al utilizatorului prin intermediul unor LED-uri cu infraroșu și a unui fotodetector, și transmite aceste date la placa Arduino în timp real. De asemenea, un LED RGB va semnala fiecare bătaie a inimii înregistrată. |
- **Procesarea și stocarea datelor**: Datele de la senzor sunt colectate și procesate continuu de Arduino pe durata activității. | - **Procesarea și stocarea datelor**: Datele de la senzor sunt colectate și procesate continuu de Arduino pe durata activității. | ||
- **Încheierea monitorizării**: Utilizatorul finalizează sesiunea de monitorizare apăsând din nou butonul. Acest lucru indică sfârșitul perioadei de activitate și inițiază procesul de afișare a datelor. | - **Încheierea monitorizării**: Utilizatorul finalizează sesiunea de monitorizare apăsând din nou butonul. Acest lucru indică sfârșitul perioadei de activitate și inițiază procesul de afișare a datelor. | ||
- | - **Afișarea statisticilor**: În momentul încheierii sesiunii, Arduino procesează datele finale și le afișează pe display-ul LCD prin intermediul adaptorului I2C. Statisticile afișate includ ritmul cardiac minim/mediu/maxim, durata totală a sesiunii sau HRV (variabilitatea ritmului cardiac). Aceste informații oferă utilizatorului o perspectivă detaliată asupra performanței sale cardiace pe durata activității. | + | - **Afișarea statisticilor**: În momentul încheierii sesiunii, Arduino procesează datele finale și le afișează pe display-ul LCD prin intermediul adaptorului I2C. Statisticile afișate includ ritmul cardiac minim/mediu/maxim sau durata totală a sesiunii. Aceste informații oferă utilizatorului o perspectivă detaliată asupra performanței sale cardiace pe durata activității. |
{{ :pm:prj2024:sseverin:alexandru-vladut_2_.png?750 |}} | {{ :pm:prj2024:sseverin:alexandru-vladut_2_.png?750 |}} | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
- | Listă de piese: | + | **Lista pieselor și modul de conectare:** |
- | * Arduino UNO | + | - Arduino UNO |
- | * Display LCD 20x4 + Adaptor I2C | + | - Display LCD 20x4 + Adaptor I2C |
- | * VCC -> 5V | + | * //VCC -> 5V// |
- | * GND -> GND | + | * //GND -> GND// |
- | * SDA -> A4 | + | * //SDA -> A4// |
- | * SCL -> A5 | + | * //SCL -> A5// |
- | * Senzor Pulsoximetru MAX30102 | + | - Senzor Pulsoximetru MAX30102 |
- | * VCC -> 5V | + | * //VCC -> 5V// |
- | * GND -> GND | + | * //GND -> GND// |
- | * SDA -> A4 | + | * //SDA -> A4// |
- | * SCL -> A5 | + | * //SCL -> A5// |
- | * LED RGB | + | - LED RGB |
- | * Red -> Digital Pin 7 | + | * //Red -> Digital Pin 7// |
- | * Anod comun -> 5V | + | * //Anod comun -> 5V// |
- | * Blue -> Digital Pin 6 | + | * //Blue -> Digital Pin 6// |
- | * Green -> Digital Pin 5 | + | * //Green -> Digital Pin 5// |
- | * Push button | + | - Push button |
- | * GND | + | * //GND// |
- | * Digital Pin 2 | + | * //Digital Pin 2// |
- | * Powerbank | + | - Powerbank |
- | * Breadboard | + | - Breadboard |
- | * Jumper wires | + | - Jumper wires |
- | * Rezistente | + | - Rezistente |
<note tip> | <note tip> | ||
- | În următoarele scheme, senzorul MAX30102 este reprezentat printr-un LED roșu și un fototranzistor (gruparea de pe partea stângă a breadboard-ului). | + | În circuit și schematic, senzorul MAX30102 este reprezentat printr-un LED roșu și un fototranzistor (gruparea de pe partea stângă a breadboard-ului). |
</note> | </note> | ||
- | Model Tinkercad: | + | **Circuit:** |
- | {{ :pm:prj2024:sseverin:alex_vladut_tinkercad.png?600 |}} | + | {{:pm:prj2024:sseverin:alex_vladut_tinkercad.png?600|}} |
- | Schematic: | + | \\ |
+ | **Schematic:** | ||
- | {{ :pm:prj2024:sseverin:alex_vladut_schematic.png?600 |}} | + | {{:pm:prj2024:sseverin:alex_vladut_schematic.png?600|}} |
- | Stadiu curent: | + | \\ |
+ | **Stadiu curent:** | ||
- | {{ :pm:prj2024:sseverin:alex_vladut_circuit.jpeg?600 |}} | + | {{:pm:prj2024:sseverin:alex_vladut_circuit.jpeg?600|}} |
===== Software Design ===== | ===== Software Design ===== | ||
+ | === Biblioteci folosite === | ||
+ | * **Wire.h** - bibliotecă standard care facilitează comunicarea I2C între Arduino și alte dispozitive I2C. | ||
+ | * **SparkFun_MAX3010x_Sensor_Library** - conține toate metodele de configurare/utilizare a senzorilor din gama MAX3010x a celor de la SparkFun, dintre care am avut nevoie de următoarele: | ||
+ | * **MAX30105.h** - conține metode de configurare a senzorului (control on/off, setarea parametrilor de funcționare, etc.). | ||
+ | * **heartRate.h** - conține metode specifice colectării de date referitoare la puls. | ||
+ | * **LiquidCrystal_I2C.h** - facilitează afișarea datelor pe ecranul LCD. | ||
+ | * **displayMethods.h** - biblioteca creată de mine, pentru separarea logicii programului de definirea metodelor de afișare pe ecranul LCD. | ||
- | <note tip> | + | === Laboratoare folosite === |
- | Descrierea codului aplicaţiei (firmware): | + | * Laborator 1: **UART** → folosit pentru a afișa informații de debug. |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | * Laborator 2: **Întreruperi** → apăsarea butonului acționează o întrerupere pe INT0. |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | * Laborator 3: **PWM** → folosit pentru a controla intensitatea led-ului RGB. |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | * Laborator 6: **I2C** → senzorul de puls MAX30102 și LCD-ul folosesc I2C pentru comunicarea cu Arduino. |
- | * (etapa 3) surse şi funcţii implementate | + | |
- | </note> | + | === Descrierea logicii și metodelor folosite === |
+ | * **//setup()//**: folosită pentru initializarea următoarelor componente: | ||
+ | * Serial Monitor cu Baud Rate 115200 - pentru debug, în special pentru senzorul de puls | ||
+ | * ecranul LCD | ||
+ | * butonul cu rezistență internă de pull-up și întrerupere atașată:<code cpp>attachInterrupt(digitalPinToInterrupt(2), buttonISR, CHANGE); | ||
+ | pinMode(2, INPUT_PULLUP);</code> | ||
+ | * Led RGB cu anod comun, setat pe 255 (OFF) cu **//analogWrite()//**. | ||
+ | * senzorul de puls cu led IR (necesar colectării datelor despre puls) și Red (pentru a simboliza statusul on/off) active. | ||
+ | |||
+ | * **//buttonISR()//**: rutina de tratatre a întreruperii, care setează valoarea flag-ului //buttonPressed// pe //TRUE// în cazul unei apăsări complete de buton (press & release). Înglobează și o tehnică de **debouncing** pentru filtrarea noise-ului. | ||
+ | * **//loop()//**: | ||
+ | * verifică dacă butonul a fost apăsat (//buttonPressed//), caz în care resetează valoarea flag-ului pe //FALSE// și inversează valoarea flag-ului //isMonitoring// (pentru a putea face switch între starea de monitorizare a pulsului și cea de afișare a rezultatelor). Resetarea flag-ului //buttonPressed// pe //FALSE// permite executarea instrucțiunilor interioare o singură dată, la apăsarea butonului. | ||
+ | * verifică dacă ne aflăm în starea de monitorizare, caz în care apelează metoda **//monitorHeartbeat()//**. În acest caz, monitorizarea se va executa la fiecare apel al funcției **//loop()//**, cât timp flag-ul //isMonitoring// este //TRUE//. | ||
+ | |||
+ | * **//monitorHeartbeat()//**: | ||
+ | * obține valoarea returnată de fotodetector apelând funcția **//getIR()//** din biblioteca **MAX30105.h**. | ||
+ | * o valoare sub //50 000// indică absența degetului pe senzor, caz în care utilizatorul este îndrumat să puna degetul pe el. | ||
+ | * altfel, folosesc metoda **//checkForBeat()//** din biblioteca **heartRate.h** pentru a detecta o bătaie a inimii. BPM-ul este determinat pe baza duratei de timp dintre bătăi, formula fiind aplicată de funcția auxiliară **//getBPM()//**. Pentru fiecare bătaie a inimii de pe timpul monitorizării, led-ul RGB va clipoci, cu efect de fade-out. | ||
+ | <note tip>Pentru a **calibra** valorile obținute, utilizatorului îi vor fi afișate informațiile folosind următorul algoritm: BPM-ul afișat (calibrat) va reprezenta **media** ultimelor 6 valori raw obținute. Prin urmare, până la obținerea primelor 6 valori, //Heart Rate Monitor// se va afla într-o stare de **warm up**.</note> | ||
+ | |||
+ | * **//computeStats()//**: apelată în **//loop()//** în momentul în care este apăsat butonul și flag-ul //isMonitoring// e setat pe //FALSE//, metoda calculează statisticile afișate utilizatorului la finalul perioadei de monitorizare. | ||
+ | |||
+ | <note>Codul și alte resurse folosite se pot găsi pe [[https://github.com/alexandru-vladut/Heart-Rate-Monitor|GitHub]].</note> | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | **Pornirea //Heart Rate Monitor//** |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | |
- | ===== Concluzii ===== | + | {{:pm:prj2024:sseverin:alex_vladut_1.jpeg?600|}} |
- | ===== Download ===== | + | \\ |
+ | **Starea de monitorizare**, în care LED-ul clipocește în culoarea roșie la fiecare bătaie a inimii. | ||
- | <note warning> | + | {{:pm:prj2024:sseverin:alex_vladut_2.jpeg?600|}} |
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | |
- | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | + | \\ |
- | </note> | + | **Afișarea rezultatelor**, moment în care LED-ul este aprins static în diferite culori, în funcție de BPM. |
- | ===== Jurnal ===== | + | {{:pm:prj2024:sseverin:alex_vladut_3.jpeg?600|}} |
+ | ===== Concluzii ===== | ||
- | <note tip> | + | Senzorii de puls sunt foarte pretențioși, din mai multe puncte de vedere: |
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | * În primul rând, cei de tip **HW-827** nu s-au dovedit a fi cei mai funcționali, în cazul meu cel puțin. După folosirea eșuată a 2 senzori de acest tip, am trecut la **MAX30102** (o replică a pulsoximetrului făcut de SparkFun). |
- | </note> | + | * În al doilea rând, senzorul de puls are nevoie de o presiune constantă a degetului pentru a oferi valori accurate continuu. Oricât am crede noi, ca oameni, că aplicam aceasta presiune constant, cu siguranță nu reușim (informație găsită și în documentația senzorului). Prin urmare, am atașat senzorul unei benzi cu scai reglabile, simulând un inel, însă nici acest lucru nu a adus o funcționare perfectă a senzorului (ocazional omite unele bătăi ale inimii). |
+ | ===== Download ===== | ||
+ | |||
+ | {{:pm:prj2024:sseverin:vladut_alexandru-nicolae_332ca.zip|}} | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | <note> | + | **Resurse Software:** |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | * https://github.com/johnrickman/LiquidCrystal_I2C |
- | </note> | + | * https://github.com/sparkfun/SparkFun_MAX3010x_Sensor_Library |
+ | * https://docs.arduino.cc/learn/microcontrollers/digital-pins/ | ||
+ | * https://docs.arduino.cc/learn/microcontrollers/analog-input/ | ||
+ | * https://docs.arduino.cc/learn/microcontrollers/analog-output/ | ||
+ | * https://ocw.cs.pub.ro/courses/pm/lab/lab1-2023 | ||
+ | * https://ocw.cs.pub.ro/courses/pm/lab/lab2-2023 | ||
+ | * https://ocw.cs.pub.ro/courses/pm/lab/lab3-2023-2024 | ||
+ | * https://ocw.cs.pub.ro/courses/pm/lab/lab6-2023-2024 | ||
+ | |||
+ | **Resurse Hardware:** | ||
+ | * https://www.handsontec.com/dataspecs/I2C_2004_LCD.pdf | ||
+ | * https://cdn.sparkfun.com/assets/f/e/9/4/1/MAX30101.pdf | ||
+ | * https://learn.sparkfun.com/tutorials/max30105-particle-and-pulse-ox-sensor-hookup-guide/all | ||
+ | \\ | ||
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||