- Zahtevane komponente
- Impulzni senzor SEN-11574
- Shema vezja za povezovanje impulznega senzorja z mikrokrmilnikom PIC
- Pojasnilo kode PIC16F877A za monitor srčnega utripa
Srčni utrip je najpomembnejši parameter pri spremljanju zdravja katere koli osebe. V sodobni dobi nosljivih naprav obstaja veliko naprav, ki lahko merijo srčni utrip, krvni tlak, stopinje, porabljene kalorije in veliko drugih stvari. Te naprave imajo v sebi pulzni senzor za zaznavanje utripa. Danes bomo za štetje srčnega utripa na minuto in Inter-Beat Interval uporabili tudi pulzni senzor z mikrokrmilnikom PIC, ki bodo te vrednosti nadalje prikazane na 16-krat značnem LCD-ju. V tem projektu bomo uporabili mikrokrmilnik PIC16F877A PIC. Pulzni senzor smo že povezali z Arduino za sistem za spremljanje pacientov.
Zahtevane komponente
- Mikrokrmilnik PIC16F877A
- Kristal 20 MHz
- 33pF kondenzator 2 kos
- 4.7k upor 1 kos
- LCD s 16 x 2 znaki
- 10K lonec za nadzor kontrasta LCD-ja
- SEN-11574 Impulzni senzor
- Velcro trak
- 5V napajalnik
- Breadboard in priključne žice
Impulzni senzor SEN-11574
Za merjenje srčnega utripa potrebujemo pulzni senzor. Tu smo izbrali impulzni senzor SEN-11574, ki je enostavno dostopen v spletnih trgovinah ali zunaj njih. Uporabili smo ta senzor, saj proizvajalca ponuja vzorčne kode, vendar je to koda Arduino. To kodo smo pretvorili v naš mikrokrmilnik PIC.
Senzor je res majhen in kot nalašč za branje srčnega utripa po ušesu ali na konici prsta. Z okrogle strani PCB ima premer 0,625 ”in debelino 0,125”.
Ta senzor zagotavlja analogni signal in senzor se lahko poganja s 3V ali 5V, trenutna poraba senzorja je 4 mA, kar je odlično za mobilne aplikacije. Senzor je opremljen s tremi žicami s 24-palčnim priključnim kablom in berg moškim priključkom na koncu. Poleg tega je senzor opremljen z Velcro prstnim trakom, ki ga nosi čez konico prsta.
Shemo impulznega senzorja zagotavlja tudi proizvajalec in je na voljo tudi na sparkfun.com.
Shema senzorja je sestavljena iz optičnega senzorja srčnega utripa, RC vezja za odpravo hrupa ali filtrov, kar je razvidno iz shematskega diagrama. R2, C2, C1, C3 in operacijski ojačevalnik MCP6001 se uporabljajo za zanesljiv ojačan analogni izhod.
Obstaja malo drugih senzorjev za nadzor srčnega utripa, vendar se pulzni senzor SEN-11574 pogosto uporablja v projektih elektronike.
Shema vezja za povezovanje impulznega senzorja z mikrokrmilnikom PIC
Tu smo impulzni senzor priključili na drugi zatič mikrokrmilne enote. Ker senzor zagotavlja analogne podatke, moramo analogne podatke pretvoriti v digitalni signal s potrebnimi izračuni.
Kristalni oscilator od 20MHz je povezan preko dveh OSC zatiči mikrokontrolerja enoto z dvema keramičnih 33pF kondenzatorjev. LCD je priključen preko RB pristanišču mikrokrmilniška.
Pojasnilo kode PIC16F877A za monitor srčnega utripa
Koda je za začetnike nekoliko zapletena. Proizvajalec je zagotovil vzorčne kode za senzor SEN-11574, vendar je bil napisan za platformo Arduino. Izračun moramo pretvoriti za naš mikročip, PIC16F877A. Popolna koda je podana na koncu tega projekta z demonstracijskim videom. Podporne datoteke C lahko prenesete od tukaj.
Naš pretok kode je razmeroma preprost in korake smo naredili z uporabo stikalnega ohišja. Glede na proizvajalca moramo podatke iz senzorja dobiti v vsaki 2 milisekundi. Torej, uporabili smo rutinsko servisno rutino, ki sproži funkcijo v vsaki 2 milisekundi.
Naš pretok kode v stavku switch bo potekal takole:
Primer 1: preberite ADC
Primer 2: Izračunajte srčni utrip in IBI
3. primer: na LCD-prikazovalniku prikažite srčni utrip in IBI
4. primer: PRAZNO (ne delajte ničesar)
Znotraj funkcije prekinitve časovnika spremenimo stanje programa v primer 1: preberite ADC na vsaki 2 milisekundi.
Tako smo v glavni funkciji definirali stanje programa in vse primere stikal .
void main () { system_init (); main_state = READ_ADC; while (1) { switch (main_state) { case READ_ADC: { adc_value = ADC_Read (0); // 0 je številka kanala main_state = CALCULATE_HEART_BEAT; odmor; } primer CALCULATE_HEART_BEAT: { izračunaj_srce_beat (adc_value); main_state = SHOW_HEART_BEAT; odmor; } primer SHOW_HEART_BEAT: { if (QS == true) {// Utrip je bil najden // BPM in IBI sta bila določena // Kvantificiran Self "QS" true, ko Arduino najde srčni utrip QS = false; // ponastavi zastavico kvantificiranega selfja za naslednjič // 0,9, ki se uporablja za pridobivanje boljših podatkov. dejansko se ne sme uporabljati BPM = BPM * 0,9; IBI = IBI / 0,9; lcd_com (0x80); lcd_puts ("BPM: -"); lcd_print_number (BPM); lcd_com (0xC0); lcd_puts ("IBI: -"); lcd_print_number (IBI); } } main_state = IDLE; odmor; IDLE ID: { odmor; } privzeto: { } } } }
Uporabljamo dve strojni periferni opremi PIC16F877A: Timer0 in ADC.
V datoteki timer0.c
TMR0 = (uint8_t) (tmr0_mask & (256 - (((2 * _XTAL_FREQ) / (256 * 4)) / 1000)));
Ta izračun zagotavlja prekinitev časovnika za 2 milisekundi. Formula za izračun je
// TimerCountMax - (((zakasnitev (ms) * Focs (hz)) / (PreScale_Val * 4)) / 1000)
Če vidimo funkcijo timer_isr , je-
void timer_isr () { main_state = READ_ADC; }
Pri tej funkciji se stanje programa spremeni v READ_ADC vsake 2 ms.
Nato je funkcija CALCULATE_HEART_BEAT prevzeta iz primera kode Arduino.
neveljavno izračunaj_srce_beat (int adc_value) { Signal = adc_value; sampleCounter + = 2; // sledimo času v mS s to spremenljivko int N = sampleCounter - lastBeatTime; // spremljamo čas od zadnjega utripa, da se izognemo hrupu // najdemo vrh in korito pulznega vala, če (Signal <thresh && N> (IBI / 5) * 3) {// izognemo se dikrotičnemu hrupu s čakanjem 3/5 zadnjega IBI, če je (Signal <T) {// T korito T = Signal; // sledimo najnižji točki pulznega vala } } …………. ………………………..
Poleg tega je spodaj navedena celotna koda, ki je dobro pojasnjena s komentarji. Podatke o senzorju srčnega utripa lahko še naprej naložite v oblak in jih po internetu spremljate od koder koli, zaradi česar je sistem Heart Beat Monitoring, ki temelji na IoT, sledite povezavi, če želite izvedeti več.
Od tu prenesite podporne datoteke C za ta projekt PIC impulznega senzorja.