SpyLOG

Стыкуем плату с Processing и считаем пульс

Для удобства работы первым делом избавляемся от необходимости постоянно использовать датчик. Модернизируем скетч Arduino: добавив в начало скетча

const bool SIM = true;

и в начало loop()

if (SIM) {
  delay(1000 - ledDelay);
  knock = true;
}

получаем режим имитации пульса примерно 60 ударов в минуту. Заливаем в плату.

Вспомнив, куда распаковали архив Processing, запускаем processing.exe. Проверяем прохождение данных от платы через последовательный порт через USB. Название порта то же самое, что и при подключении платы к Arduino IDE. У нас это "COM3". Если последовательные порты не возникают на компьютере хаотично более одного за раз и порт платы получает разные названия, но всегда второй, то можно использовать

    new Serial(this, Serial.list()[1], 9600);

вместо

    Serial port=new Serial(this, "COM3", 9600);

Мы задействуем событийное чтение данных из последовательного порта для того, что бы эта медленная операция не вносила задержки при формировании графического кадра в draw().

import processing.serial.*;

void setup() {
  println(Serial.list());
  Serial port=new Serial(this, "COM3", 9600);
  port.bufferUntil('\n');
}

void draw() {
}

void serialEvent(Serial p) { 
  String s=p.readString();
  println(s);
} 

Запускаем, наблюдаем в окне текстового вывода Processing список доступных последовательных портов и символы "p".

Для вычисления частоты сердечных сокращений: фиксируем значение счетчика миллисекунд с момента запуска программы по приходу очередного символа от датчика

void serialEvent(Serial p) { 
  p.readString();
  addKnock(millis());
} 

сохраняем несколько последних значений, например, в интервале 10 секунд

import java.util.*;

ArrayDeque<Integer> knocks=new ArrayDeque<Integer>();
int timeWindow=1000*10;

void addKnock(int m) {
  knocks.add(m);
  while (m-knocks.peek ()>timeWindow) knocks.remove();
}

и вычисляем среднюю частоту в ударах в минуту

int rate() {
  if (knocks.size()>1) {
    return round(60f*1000*(knocks.size()-1)/(knocks.peekLast()-knocks.peekFirst()));
  }
  return 0;
}

добавляем в конец serialEvent() вызов

  println(rate());

Запускаем скетч и получаем в окне текстового вывода после одного нуля пульс имитатора на плате. 60 ударов в минуту.

Полный текст скетча:

import processing.serial.*;
import java.util.*;

ArrayDeque<Integer> knocks=new ArrayDeque<Integer>();

int timeWindow=1000*10;

void setup() {
  println(Serial.list());
  Serial port=new Serial(this, "COM3", 9600);
  port.bufferUntil('\n');
}

void draw() {
}

void serialEvent(Serial p) { 
  p.readString();
  addKnock(millis());
  println(rate());
} 

void addKnock(int m) {
  knocks.add(m);
  while (m-knocks.peek ()>timeWindow) knocks.remove();
}

int rate() {
  if (knocks.size()>1) {
    return round(60f*1000*(knocks.size()-1)/(knocks.peekLast()-knocks.peekFirst()));
  }
  return 0;
}

У нас все готово для создания скетча Processing для наблюдения за пульсом.

Tech@Psycheya.ru

Полное или частичное использование текста, изображений и других материалов данной публикации запрещено.