- Componenti richiesti
- Sensore di pulsazioni SEN-11574
- Schema del circuito per l'interfacciamento del sensore di impulsi con il microcontrollore PIC
- PIC16F877A Spiegazione del codice per il monitor del battito cardiaco
La frequenza del battito cardiaco è il parametro più importante nel monitoraggio della salute di qualsiasi persona. Nell'era moderna dei dispositivi indossabili, ci sono molti dispositivi in grado di misurare il battito cardiaco, la pressione sanguigna, i passi, le calorie bruciate e molte altre cose. Questi dispositivi hanno un sensore di pulsazioni al loro interno per rilevare la frequenza cardiaca. Oggi utilizzeremo anche un sensore di pulsazioni con microcontrollore PIC per contare i battiti cardiaci al minuto e l'intervallo tra battiti, questi valori verranno ulteriormente visualizzati sul display LCD 16x2 caratteri. Useremo il microcontrollore PIC PIC16F877A in questo progetto. Abbiamo già interfacciato il sensore di impulsi con Arduino per il sistema di monitoraggio dei pazienti.
Componenti richiesti
- Microcontrollore PIC16F877A
- Cristallo da 20 Mhz
- Condensatore 33pF 2 pz
- Resistenza 4.7k 1 pz
- LCD 16x2 caratteri
- Potenziometro 10K per il controllo del contrasto dell'LCD
- SEN-11574 Sensore di pulsazioni
- Cinturino in velcro
- Adattatore di alimentazione 5V
- Breadboard e cavi di collegamento
Sensore di pulsazioni SEN-11574
Per misurare il battito cardiaco abbiamo bisogno di un sensore di pulsazioni. Qui abbiamo selezionato il sensore di pulsazioni SEN-11574 che è facilmente disponibile nei negozi online o offline. Abbiamo utilizzato questo sensore poiché ci sono codici di esempio forniti dal produttore, ma questo è un codice Arduino. Abbiamo convertito quel codice per il nostro microcontrollore PIC.
Il sensore è davvero piccolo e perfetto per leggere il battito cardiaco sul lobo dell'orecchio o sul polpastrello. Ha un diametro di 0,625 "e uno spessore di 0,125" dal lato rotondo del PCB.
Questo sensore fornisce un segnale analogico e il sensore può essere pilotato con 3 V o 5 V, il consumo di corrente del sensore è di 4 mA, il che è ottimo per le applicazioni mobili. Il sensore viene fornito con tre fili con cavo di collegamento lungo 24 pollici e connettore maschio berg all'estremità. Inoltre, il sensore è dotato di cinturino in velcro per indossarlo sulla punta delle dita.
Lo schema del sensore di impulsi è fornito dal produttore e disponibile anche su sparkfun.com.
Lo schema del sensore è costituito da un sensore ottico della frequenza cardiaca, circuiti RC o filtri di cancellazione del rumore, che possono essere visti nel diagramma schematico. R2, C2, C1, C3 e un amplificatore operazionale MCP6001 vengono utilizzati per un'uscita analogica amplificata affidabile.
Ci sono pochi altri sensori per il monitoraggio del battito cardiaco, ma il sensore di pulsazioni SEN-11574 è ampiamente utilizzato nei progetti di elettronica.
Schema del circuito per l'interfacciamento del sensore di impulsi con il microcontrollore PIC
Qui abbiamo collegato il sensore di impulsi su un 2 ° pin dell'unità microcontrollore. Poiché il sensore fornisce dati analogici, dobbiamo convertire i dati analogici in segnale digitale eseguendo i calcoli necessari.
L' oscillatore Crystal da 20 Mhz è collegato a due pin OSC dell'unità microcontrollore con due condensatori ceramici 33pF. Il display LCD è collegato attraverso la porta RB del microcontrollore.
PIC16F877A Spiegazione del codice per il monitor del battito cardiaco
Il codice è un po 'complesso per i principianti. Il produttore ha fornito codici di esempio per il sensore SEN-11574, ma è stato scritto per la piattaforma Arduino. Dobbiamo convertire il calcolo per il nostro microchip, PIC16F877A. Il codice completo viene fornito alla fine di questo progetto con un video dimostrativo. E i file C di supporto possono essere scaricati da qui.
Il nostro flusso di codice è relativamente semplice e abbiamo eseguito i passaggi utilizzando un case switch . Secondo il produttore, dobbiamo ottenere i dati dal sensore ogni 2 millisecondi. Quindi, abbiamo utilizzato una routine di servizio di interruzione del timer che attiverà una funzione ogni 2 millisecondi.
Il nostro flusso di codice nell'istruzione switch andrà così:
Caso 1: leggere l'ADC
Caso 2: calcola il battito cardiaco e l'IBI
Caso 3: mostra il battito cardiaco e l'IBI sul display LCD
Caso 4: IDLE (non fare nulla)
All'interno della funzione di interruzione del timer, cambiamo lo stato del programma in Caso 1: leggi l'ADC ogni 2 millisecondi.
Quindi, nella funzione principale , abbiamo definito lo stato del programma e tutti i casi di switch .
void main () { system_init (); main_state = READ_ADC; while (1) { switch (main_state) { case READ_ADC: { adc_value = ADC_Read (0); // 0 è il numero di canale main_state = CALCULATE_HEART_BEAT; rompere; } caso CALCULATE_HEART_BEAT: { calcola_heart_beat (adc_value); main_state = SHOW_HEART_BEAT; rompere; } case SHOW_HEART_BEAT: { if (QS == true) {// È stato trovato un battito cardiaco // BPM e IBI sono stati determinati // Quantified Self "QS" true quando Arduino trova un heartbeat QS = false; // reimposta il flag Quantified Self per la prossima volta // 0.9 utilizzato per ottenere dati migliori. in realtà non dovrebbe essere usato 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; rompere; caso IDLE: { break; } predefinito: { } } } }
Stiamo utilizzando due periferiche hardware del PIC16F877A: Timer0 e ADC.
All'interno del file timer0.c, TMR0 = (uint8_t) (tmr0_mask & (256 - (((2 * _XTAL_FREQ) / (256 * 4)) / 1000)));
Questo calcolo fornisce l'interrupt del timer di 2 millisecondi. La formula di calcolo è
// TimerCountMax - (((delay (ms) * Focs (hz)) / (PreScale_Val * 4)) / 1000)
Se vediamo la funzione timer_isr , è-
void timer_isr () { main_state = READ_ADC; }
In questa funzione lo stato del programma viene modificato in READ_ADC ogni 2 ms.
Quindi la funzione CALCULATE_HEART_BEAT viene presa dal codice di esempio di Arduino.
void calcola_heart_beat (int adc_value) { Signal = adc_value; sampleCounter + = 2; // tieni traccia del tempo in mS con questa variabile int N = sampleCounter - lastBeatTime; // controlla il tempo trascorso dall'ultimo battito per evitare il rumore // trova il picco e la depressione dell'onda del polso se (Signal <thresh && N> (IBI / 5) * 3) {// evita il rumore dicrotico aspettando 3/5 dell'ultimo IBI se (Segnale <T) {// T è il minimo T = Segnale; // tiene traccia del punto più basso nell'onda del polso } } …………. ………………………..
Inoltre, il codice completo è fornito di seguito e ben spiegato dai commenti. Questi dati del sensore del battito cardiaco possono essere ulteriormente caricati sul cloud e monitorati su Internet da qualsiasi luogo, il che lo rende un sistema di monitoraggio del battito cardiaco basato su IoT, segui il link per saperne di più.
Scarica i file C di supporto per questo progetto PIC del sensore di impulsi da qui.