Стыкуем плату с 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 для наблюдения за пульсом.