This shows you the differences between two versions of the page.
pm:prj2022:avaduva:alexandru.necula01 [2022/04/21 14:18] alexandru.necula01 [Hardware Design] |
pm:prj2022:avaduva:alexandru.necula01 [2022/04/30 19:02] (current) alexandru.necula01 [Jurnal] |
||
---|---|---|---|
Line 19: | Line 19: | ||
Pentru a afisa informatiile, degetul trebuie pus pe senzor, iar dupa | Pentru a afisa informatiile, degetul trebuie pus pe senzor, iar dupa | ||
- | cateva secunde, vor fi afisate informatii iar LED-ul si buzzer-ul se vor activa cu fiecare bataie a inimii. | + | cateva secunde, vor fi afisate informatii, semnalate prin LED-ul si buzzer-ul care se vor activa cu fiecare bataie a inimii. |
Culoarea LED-ului RGB va fi schimbata in functie de nivelul pulsului | Culoarea LED-ului RGB va fi schimbata in functie de nivelul pulsului | ||
- | * VERDE: puls < 80 | + | * <color green>VERDE</color>: puls < 100 |
- | * GABLEN: 80 < puls < 100 | + | * <color orange>GABLEN</color>: puls < 120 |
- | * ROSU: puls > 100 | + | * <color red>ROSU</color>: puls > 120 |
+ | * ALB: puls in curs de calcul | ||
+ | |||
+ | ==== Schema bloc ==== | ||
{{:pm:prj2022:avaduva:diagrama.png?600|}} | {{:pm:prj2022:avaduva:diagrama.png?600|}} | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
- | ==== Componente ==== | + | ==== Lista componente ==== |
- | ^ Nume ^ Număr Piese ^ | + | ^ Nume ^ Număr Piese ^ |
- | | Arduino UNO R3 |1 | | + | | Arduino UNO R3 | 1 | |
- | | Breadboard | 1 | | + | | Breadboard | 1 | |
- | | Ecran TFT ST7789 | 1| | + | | Ecran TFT ST7789 1.3" 240x240 | 1 | |
- | |Senzor puls MAX30100 |1 | | + | | Senzor puls MAX30100 | 1 | |
- | |LED rosu |1 | | + | | LED rosu | 1 | |
- | |LED RGB |1 | | + | | LED RGB | 1 | |
- | |Buzzer |1 | | + | | Buzzer | 1 | |
- | |Rezistor |? | | + | | Rezistor 1kΩ | 5 | |
- | |Jumper |? | | + | | Rezistor 460Ω | 4 | |
+ | | Rezistor 330Ω | 4 | | ||
+ | | Jumper | 18| | ||
+ | |||
+ | ==== Schema electrica ==== | ||
+ | |||
+ | {{:pm:prj2022:avaduva:schematic_heartmonitor.png?700|}} | ||
+ | <note> | ||
+ | Placuta comandata care include senzorul are o problema de design, respectiv | ||
+ | liniile de SDA si SCL sunt HIGH la tensiunea de 1.8V, si nu 3.3V, astfel incat | ||
+ | Arduino UNO nu poate comunica cu senzorul ((https://how2electronics.com/interfacing-max30100-pulse-oximeter-sensor-arduino/)). Am modificat placuta printr-un jumper | ||
+ | astfel incat SDA si SCL sunt alimentate de la 3.3V. | ||
+ | </note> | ||
+ | |||
+ | <note> | ||
+ | Display-ul TFT nu este compatibil cu tensiunea de 5V a pinilor de la Arduino UNO. | ||
+ | Pe pinii folositi de SPI am instalat un divizor de tensiune folosind rezistori de | ||
+ | 460Ω si 1kΩ, astfel incat tensiunea finala este de aproximativ 3.3V | ||
+ | ((https://simple-circuit.com/arduino-st7789-ips-tft-display-example/)) | ||
+ | </note> | ||
===== Software Design ===== | ===== Software Design ===== | ||
- | <note tip> | + | ==== Mediul de dezvoltare ==== |
- | Descrierea codului aplicaţiei (firmware): | + | |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | * **Visual Studio Code + extensia PlatformIO ** → dezvoltarea codului și încărcarea acestuia pe Arduino |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | * **Autodesk Eagle** → realizarea schemei electrice |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | * **LucidChart** → realizarea schemei bloc |
- | * (etapa 3) surse şi funcţii implementate | + | |
+ | ==== Biblioteci folosite ==== | ||
+ | |||
+ | * **SPI** ((https://www.arduino.cc/en/reference/SPI)) | ||
+ | * **Wire** (I2C communication) ((https://www.arduino.cc/en/reference/Wire)) | ||
+ | * **MAX30100** (pulse sensor) ((https://github.com/oxullo/Arduino-MAX30100)) | ||
+ | * **Adafruit GFX** (core graphics) ((https://github.com/adafruit/Adafruit-GFX-Library)) | ||
+ | * **Adafruit BusIO** (I2C communication) ((https://github.com/adafruit/Adafruit_BusIO)) | ||
+ | * **Adafruit ST7789** (specific TFT driver) ((https://github.com/cbm80amiga/Arduino_ST7789_Fast)) | ||
+ | |||
+ | ==== Structura codului ==== | ||
+ | |||
+ | Senzorul de puls are 3 stari: | ||
+ | * **WAITING** → degetul nu se afla pe senzor; se afiseaza mesajul "Rest your finger on the sensor" | ||
+ | * **INITIALIZING** → frecventa cardiaca este in curs de calcul; se afiseaza mesajul "Please wait..." | ||
+ | * **WORKING** → display-ul afiseaza datele colectate; se afiseaza pulsul si oxigenarea sangelui pe display | ||
+ | |||
+ | **Initializari** - inainte de orice functie, initializam urmatoarele variabile: | ||
+ | * //pox// → clasa care defineste senzorul de puls-oximetru | ||
+ | * //tft// → clasa care defineste display-ul tft | ||
+ | * //lastState// → initializat cu WAITING, folosita pentru a tine cont cand actualizam display-ul | ||
+ | * //prevHeartRate// → initializat cu 0, folosita pentru a determina daca calculul pulsului este stabil | ||
+ | * //tsLastReport// → initializat cu 0, folosita pentru a actualiza display-ul la intervale determinate | ||
+ | |||
+ | <note> | ||
+ | Senzorul puls-oximetru trebuie interogat cat mai rapid, altfel datele din buffer-ul sau se pierd. | ||
+ | Conform bibliotecii utilizate, actualizarea ar trebui facuta la aproximativ 100Hz. | ||
+ | De aceea, in majoritatea functiilor implementate am apelat //pox.update()// | ||
</note> | </note> | ||
+ | |||
+ | **Functii** | ||
+ | * //setup()// → initializarea pinilor pentru buzzer si LED-uri, initializarea display-ului TFT, initializarea senzorului de puls, inregistrarea functie de callback pentru fiecare puls | ||
+ | * //loop()// → logica principala a programului: apeleaza //pox.update()//; la fiecare 2 secunde calculeaza pulsul si SpO2 si afiseaza informatii relevante pe display in functie de aceste valori | ||
+ | * //RGB_color(red, green, blue)// → seteaza pinii LED-ului RGB cu valorile date ca parametri | ||
+ | * //setRGBColor(spO2, heartRate)// → apeleaza //RGB_color// cu valori in functie de puls si SpO2 | ||
+ | * //onBeatDetected()// → functie callBack; porneste buzzer-ul si LED-ul rosu de fiecare data cand detectam un puls | ||
+ | * //printOnDisplay(x, y, whatToPrint)// -> afiseaza pe display mesajul/valoarea dorita; deoarece aceasta operatie dureaza mai mult timp, apeleaza //pox.update()// | ||
+ | * //clearDisplay()// → diferit de implementarea din biblioteca Adafruit, pentru a permite interogarea senzorului de puls; printeaza cate un spatiu pe ecran pentru a sterge continutul anterior | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | ==== Circuit final ==== |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | {{:pm:prj2022:avaduva:img_0781.jpeg?600|}} |
+ | {{:pm:prj2022:avaduva:img_0780.jpeg?600|}} | ||
+ | |||
+ | ==== Demo ==== | ||
+ | |||
+ | [[https://youtu.be/Jzwkv7RFvvs|YouTube link]] | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
- | ===== Download ===== | + | Acest proiect m-a facut sa invat mai multe despre cum pot crea un dispozitiv |
+ | cu utilitate practica folosind un microcontroller si cum pot programa un ansamblu | ||
+ | de piese pentru a ajunge la rezultatul dorit. | ||
- | <note warning> | + | De asemenea, am invatat ca este foarte important sa citesti cu atentie |
- | 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ă ;-). | + | datasheet-ul componentelor pe care doresti sa le comanzi pentru a te asigura |
+ | ca sunt compatibile cu microcontroller-ul folosit. In cazul meu, a fost nevoie de pasi | ||
+ | suplimentari pentru a asigura compatibilitatea, respectiv divizorul de tensiune pentru | ||
+ | LCD si jumper-ul lipit pe senzorul de puls. | ||
- | 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**. | + | ===== Download ===== |
- | </note> | + | |
+ | {{:pm:prj2022:avaduva:mobile_heart_rate_monitor.zip|}} | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
Line 71: | Line 141: | ||
* **15.04.2022**: comanda piese | * **15.04.2022**: comanda piese | ||
* **21.04.2022**: publicare descriere wiki | * **21.04.2022**: publicare descriere wiki | ||
+ | * **29.04.2022**: finalizare software si asamblare hardware | ||
+ | * **30.04.2022**: finalizare wiki, publicare documentatie completa | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | |||
- | * [[https://www.smart-prototyping.com/Pulse-Oximeter-and-Heart-Rate-Sensor-MAX30100|Sensor puls]] | ||
- | * [[https://github.com/oxullo/Arduino-MAX30100|Librarie Arduino puls]] | ||
- | * [[https://simple-circuit.com/arduino-st7789-ips-tft-display-example/|Display ST7789]] | ||
<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> | ||