- Componente necesare
- Senzor de impuls SEN-11574
- Schema circuitului pentru interfața senzorului de impuls cu microcontrolerul PIC
- PIC16F877A Explicație privind codul pentru monitorul ritmului cardiac
Ritmul ritmului cardiac este cel mai important parametru în monitorizarea stării de sănătate a oricărei persoane. În era modernă a dispozitivelor purtabile, există o mulțime de dispozitive care pot măsura bătăile inimii, tensiunea arterială, pașii, caloriile arse și multe alte lucruri. Aceste dispozitive au senzor de impuls în interiorul lor pentru a detecta rata pulsului. Astăzi vom folosi, de asemenea, un senzor de impulsuri cu microcontroler PIC pentru a număra bătăile inimii pe minut și Intervalul de bătăi, aceste valori vor fi afișate în continuare pe ecranul LCD de 16x2 caractere. Vom folosi microcontrolerul PIC16F877A PIC în acest proiect. Am interfațat deja senzorul de impuls cu Arduino pentru sistemul de monitorizare a pacientului.
Componente necesare
- Microcontroler PIC16F877A
- Cristal de 20 Mhz
- Condensator 33pF 2 buc
- 4.7k rezistor 1 buc
- 16x2 caractere LCD
- Oală de 10K pentru controlul contrastului ecranului LCD
- SEN-11574 Senzor de impulsuri
- Curea cu velcro
- Adaptor de alimentare 5V
- Cablu și fire de conectare
Senzor de impuls SEN-11574
Pentru a măsura bătăile inimii avem nevoie de un senzor de puls. Aici am selectat senzorul de impuls SEN-11574 care este ușor disponibil în magazinele online sau offline. Am folosit acest senzor deoarece există exemple de coduri furnizate de producător, dar acesta este un cod Arduino. Am convertit acel cod pentru microcontrolerul nostru PIC.
Senzorul este foarte mic și perfect pentru citirea bătăilor inimii pe lobul urechii sau pe vârful degetului. Are 0,625 ”în diametru și 0,125” grosime față de partea rotundă a PCB-ului.
Acest senzor oferă un semnal analogic, iar senzorul poate fi acționat cu 3V sau 5V, consumul curent al senzorului este de 4 mA, ceea ce este excelent pentru aplicațiile mobile. Senzorul vine cu trei fire cu cablu de conectare lung de 24 ”și antet masculin Berg la capăt. De asemenea, senzorul vine cu curea degetului Velcro pentru a-l purta peste vârful degetelor.
Schema senzorului de impuls este, de asemenea, furnizată de producător și disponibilă și pe sparkfun.com.
Schema senzorului constă în senzori optici de ritm cardiac, circuite RC de anulare a zgomotului sau filtre, care pot fi văzute în schema schematică. R2, C2, C1, C3 și un amplificator operațional MCP6001 sunt utilizate pentru o ieșire analogică amplificată fiabilă.
Există puțini alți senzori pentru monitorizarea bătăilor inimii, dar senzorul de impuls SEN-11574 este utilizat pe scară largă în proiectele electronice.
Schema circuitului pentru interfața senzorului de impuls cu microcontrolerul PIC
Aici am conectat senzorul de impuls pe un al doilea pin al unității de microcontroler. Deoarece senzorul oferă date analogice, trebuie să le convertim în semnal digital făcând calculele necesare.
Oscilator cristal de 20Mhz este conectat între două ace OSC ale unității microcontroler cu două condensatoare 33pF ceramice. Ecranul LCD este conectat prin portul RB al microcontrolerului.
PIC16F877A Explicație privind codul pentru monitorul ritmului cardiac
Codul este puțin complex pentru începători. Producătorul a furnizat exemple de coduri pentru senzorul SEN-11574, dar a fost scris pentru platforma Arduino. Trebuie să convertim calculul pentru microcipul nostru, PIC16F877A. Codul complet este dat la sfârșitul acestui proiect cu un videoclip demonstrativ. Și fișierele C suport pot fi descărcate de aici.
Fluxul nostru de cod este relativ simplu și am făcut pașii folosind un caz de comutare . Conform producătorului, trebuie să obținem datele de la senzor la fiecare 2 milisecunde. Deci, am folosit o rutină de service de întrerupere a temporizatorului care va declanșa o funcție la fiecare 2 milisecunde.
Fluxul nostru de cod în instrucțiunea switch va merge astfel:
Cazul 1: Citiți ADC
Cazul 2: Calculați bătăile inimii și IBI
Cazul 3: Afișați bătăile inimii și IBI pe ecranul LCD
Cazul 4: IDLE (Nu faceți nimic)
În interiorul funcției de întrerupere a temporizatorului, schimbăm starea programului în Cazul 1: Citiți ADC la fiecare 2 milisecunde.
Deci, în funcția principală , am definit starea programului și toate cazurile de comutare .
void main () { system_init (); main_state = READ_ADC; while (1) { switch (main_state) { case READ_ADC: { adc_value = ADC_Read (0); // 0 este numărul canalului main_state = CALCULATE_HEART_BEAT; pauză; } caz CALCULATE_HEART_BEAT: { calculate_heart_beat (adc_value); main_state = SHOW_HEART_BEAT; pauză; } caz SHOW_HEART_BEAT: { if (QS == true) {// A fost găsită o bătăi de inimă // BPM și IBI au fost determinate // „Quantified Self” QS true când Arduino găsește o bătăi de inimă QS = false; // resetați semnalizatorul Self Quantified pentru data viitoare // 0,9 folosit pentru obținerea unor date mai bune. de fapt nu trebuie utilizat 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; pauză; caz IDLE: { pauză; } implicit: { } } } }
Folosim două periferice hardware ale PIC16F877A: Timer0 și ADC.
În fișierul timer0.c, TMR0 = (uint8_t) (tmr0_mask & (256 - (((2 * _XTAL_FREQ) / (256 * 4)) / 1000)));
Acest calcul furnizează întreruperea temporizatorului de 2 milisecunde. Formula de calcul este
// TimerCountMax - (((delay (ms) * Focs (hz)) / (PreScale_Val * 4)) / 1000)
Dacă vedem funcția timer_isr , este-
void timer_isr () { main_state = READ_ADC; }
În această funcție starea programului este schimbată în READ_ADC la fiecare 2 ms.
Apoi funcția CALCULATE_HEART_BEAT este preluată din codul de exemplu Arduino.
void calculate_heart_beat (int adc_value) { Semnal = adc_value; sampleCounter + = 2; // țineți evidența timpului în mS cu această variabilă int N = sampleCounter - lastBeatTime; // monitorizați timpul de la ultima bătăi pentru a evita zgomotul // găsiți vârful și jgheabul undei pulsului dacă (Semnal <treier && N> (IBI / 5) * 3) {// evitați zgomotul dicrotic așteptând 3/5 din ultimul IBI dacă (Semnal <T) {// T este jgheabul T = Semnal; // țineți evidența celui mai mic punct din unda de impuls } } …………. ………………………..
Mai mult, codul complet este dat mai jos și bine explicat de comentarii. Aceste date ale senzorului de bătăi ale inimii pot fi încărcate în continuare în cloud și monitorizate pe internet de oriunde, ceea ce îl face un sistem de monitorizare a bătăilor inimii bazat pe IoT, urmați linkul pentru a afla mai multe.
Descărcați fișierele C suport pentru acest proiect PIC Pulse Sensor de aici.