А почему он заносит это в сериал порт, а в окне в итоге показан пульс, а не время? Должно же по идее вывестись не значение пульса, а время между циклами измерений?
Я сделал чтобы выводилась частота пульса, так как это значение более понятно и привычно. Если нужно время между пульсами, то сделать это еще проще, попробуйте самостоятельно.
[QUOTE и так далее, а "тук-тук-пауза-тук-тук-пауза", то есть как бы два удара за один (вероятно, так поочередно работают желудочки, не помню уже).[/QUOTE] Хорошее наблюдение! По все видимости в этой насосной системе есть и, своего рода, обратный клапан, что обеспечивает прокачку крови только в одном направлении?
Всё таки я, наверное, не правильно понял программу. Объясните, пожалуйста, как она работает. Ведь не так же? В чём я не прав?: Код (C++): #define DELT 15 int pulse[2]; bool vect[2]; unsigned long timerPuls; void setup() { Serial.begin(9600); } void loop() { vect[0] = (pulse[1] > (pulse[0] + DELT));//пульс увеличился? Ответ записать в переменную вект0 pulse[0] = pulse[1];//переменную, обозначающую старый пульс преравнять к обозначающей новый pulse[1] = analogRead(A0);//перпеменная, обозначающая новый пульс = значение на порту А0 vect[1] = (pulse[1] > (pulse[0] + DELT));//пульс увеличился? Ответ записать в переменную вект1 if (!vect[0] && vect[1]) {//вект0==0, а вект1==1? Тогда: Serial.println(60000.0/(millis()-timerPuls));//Записать время в минуту с прошлого цикла до этого.(??? я не понимаю, почему это равно пульсу) timerPuls = millis();//замерить время и запписать в переменную таймерПульс } delay(50); //ожидание 50 мсек(зачем?) }
Вот с моими коментами: Код (C++): #define DELT 15 #define TIME 50 int pulse[2]; // кольцевой буфер показаний датчика bool vect[2]; // кольцевой буфер направления изменений unsigned long timerPuls; void setup() { Serial.begin(9600); } void loop() { vect[0] = (pulse[1] > (pulse[0] + DELT)); // предыдущее направление изменения показаний pulse[0] = pulse[1]; // предыдущее показание датчика pulse[1] = analogRead(A0); // новое показание датчика vect[1] = (pulse[1] > (pulse[0] + DELT)); // новое направление изменения показаний if (!vect[0] && vect[1]) { // если было изменение вверх на определенное кол-во за определенное время, то это удар Serial.println(60000.0/(millis()-timerPuls)); // перевод времени между ударами в удары в секунду (если нужно только время, оставить (millis()-timerPuls)) timerPuls = millis(); // перезагрузка таймера ожидания удара } delay(TIME); // время между замерами (устанавливается эмперически в соотношении с изменением датчика), если его не сделать, то разница между измерениями будет слишком мала чтобы ее заметить }
Она работает, однако не понимая её алгоритма, я не могу её интегрировать в свою программу. Спасибо заранее! Извините за назойливость, но я не понимаю, почему время между циклами измерений является временем между ударами?
Время между циклами замера не является временем между ударами. Это время должно быть намного меньше, а именно примерно половиной времени подъема кривой с показания датчика (то есть пульса), чтобы можно было наверняка зафиксировать его наличие. Если взглянуть на показания осциллографа (см. выше), то видно, что подъем происходит примерно за 100мс, то есть установив время между измерениями 50мс мы гарантированно заметим это событие.
У меня датчик просто не видит пульс. Я уже и с Вашими значениями DELT и TIME пробовал, и со своими - не помогает. Видит изменения только в момент прислонения(но НЕ после!) и убирания пальца. Что может быть проблемой?