Пульсометр на Arduino
Сегодня мы собираемся подключить датчик пульса к Arduino и измерять сердечный ритм человека через последовательный монитор.
 
Шаг 1: Элементы:



Требуется электроника:

Датчик пульса
Arduino
Зуммер
Светодиод
Макетная плата
Перемычки

Шаг 2: Подключение датчика к Arduino
 
Монитор сердечного ритма - это устройство, которое позволяет измерять частоту сердечных сокращений в реальном времени. Вы можете легко использовать данные сердечных ритмов в своих проектах.

Импульсный датчик состоит из трех контактов:

Контакт VCC
GND-контакт
Вывод OUT или Сигнальный вывод

Подключение датчика выглядит следующим образом:

Контакт VCC подключается к "+" макетной платы.
Контакт GND подключается к "-" макетной платы.
Контакт OUT подключается к аналоговому выводу A0 Arduino.
   
Давайте теперь подключим зуммер и светодиод.

Шаг 3: Подключение зуммера

 

Зуммер имеет два провода, выходящих из корпуса, который называется анодом и катодом.

Подключение зуммера выглядит следующим образом:

Красный провод или анод зуммера подключается к цифровыму выводому 13 Arduino.
Черный провод или катод зуммера подключается к "-" макетной платы.
Последним интерфейсом является светодиод.

Шаг 4: Подключение светодиода

 
Более длинная ножка является анодом, а более короткая - катодом.

Соединение светодиода выглядит следующим образом:

Анод светодиода к цифровому выходу 10
Катод к "-" макетной платы

Шаг 5: Код

int pulsePin = 0;
int blinkPin = 10;

int buzzer = 13;

int BPM;

int Signal;

int IBI = 600;

boolean Pulse = false

boolean QS = false;

boolean serialVisual = true;

volatile int rate[10];

long sampleCounter = 0;

long lastBeatTime = 0;

int P = 512;

int T = 512;

int thresh = 525;

int amp = 100;

boolean firstBeat = true;

void setup() {

pinMode(blinkPin,OUTPUT);

pinMode(buzzer,OUTPUT);

Serial.begin(9600);

interruptSetup();

analogReference(EXTERNAL); }

void loop() {

serialOutput();

if (QS == true)

serialOutputWhenBeatHappens();

QS = false;

}

ledFadeToBeat();

delay(20);

}

void ledFadeToBeat() {

digitalWrite(blinkPin, HIGH); }

void interruptSetup() {

TCCR2A = 0x02;

TCCR2B = 0x06;

OCR2A = 0X7C;

TIMSK2 = 0x02;

sei();

}

void serialOutput() {

if (serialVisual == true) {

arduinoSerialMonitorVisual('-', Signal);

} else { sendDataToSerial('S', Signal);

}

}

void serialOutputWhenBeatHappens() {

if (serialVisual == true) {

Serial.print("Heart-Beat Happened ");

Serial.print("BPM: ");

Serial.println(BPM); }

else {

sendDataToSerial('B',BPM);

sendDataToSerial('Q',IBI);

}

}

void arduinoSerialMonitorVisual(char symbol, int data ) {

const int sensorMin = 0;

const int sensorMax = 1024;

int sensorReading = data;

int range = map(sensorReading, sensorMin, sensorMax, 0, 11); value: switch (range) {

case 0:

Serial.println("");

break;

case 1:

Serial.println("---");

break;

case 2:

Serial.println("------");

break;

case 3:

Serial.println("---------");

break;

case 4:

Serial.println("------------");

break;

case 5:

Serial.println("--------------|-");

break;

case 6:

Serial.println("--------------|---");

break;

case 7:

Serial.println("--------------|-------");

break;

case 8:

Serial.println("--------------|----------");

break; case 9:

Serial.println("--------------|----------------");

break; case 10:

Serial.println("--------------|-------------------");

break;

case 11:

Serial.println("--------------|-----------------------");

break; } }

void sendDataToSerial(char symbol, int data ) {

Serial.print(symbol);

Serial.println(data); }

ISR(TIMER2_COMPA_vect) {

cli();

Signal = analogRead(pulsePin);

sampleCounter += 2;

int N = sampleCounter - lastBeatTime;

if(Signal < thresh && N > (IBI/5)*3) {

if (Signal < T) { T = Signal; } }

if(Signal > thresh && Signal > P) { P = Signal; }

if (N > 250) {

if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ) { Pulse = true;

digitalWrite(blinkPin,HIGH); IBI = sampleCounter - lastBeatTime;

lastBeatTime = sampleCounter;

if(secondBeat) {

if secondBeat == TRUE

secondBeat = false;

for(int i=0; i<=9; i++)

startup { rate[i] = IBI; } }

if(firstBeat)

, if firstBeat == TRUE { firstBeat = false;

secondBeat = true;

sei();

return;

} /

runningTotal = 0;

for(int i=0; i<=8; i++) {

rate[i] = rate[i+1];

runningTotal += rate[i]; }

rate[9] = IBI;

runningTotal += rate[9];

BPM = 60000/runningTotal;

QS = true;

}

}

if (Signal < thresh && Pulse == true) {

digitalWrite(blinkPin,LOW);

Pulse = false; /

amp = P - T;

thresh = amp/2 + T;

P = thresh;

T = thresh; }

if (N > 2500) {

thresh = 512;

P = 512;

T = 512;

lastBeatTime = sampleCounter;

firstBeat = true;

secondBeat = false;

}

sei(); }



564
  1. Аватар
    саша  11:12, 13 октябрь
    • Нравится
    • 0

    фвыфввввввввввввввввввввввввввв

    Ответить