Библиотека для датчика пульса

Тема в разделе "Закажу проект", создана пользователем iBoy, 24 июн 2016.

  1. iBoy

    iBoy Гик

    А почему он заносит это в сериал порт, а в окне в итоге показан пульс, а не время? Должно же по идее вывестись не значение пульса, а время между циклами измерений?
     
  2. ostrov

    ostrov Гуру

    Я сделал чтобы выводилась частота пульса, так как это значение более понятно и привычно. Если нужно время между пульсами, то сделать это еще проще, попробуйте самостоятельно.
     
    iBoy нравится это.
  3. iBoy

    iBoy Гик

    Спасибо огромное!!!!!!! Получилось!
     
  4. dkg11

    dkg11 Нерд

    [QUOTE
    и так далее, а "тук-тук-пауза-тук-тук-пауза", то есть как бы два удара за один (вероятно, так поочередно работают желудочки, не помню уже).[/QUOTE]
    Хорошее наблюдение! По все видимости в этой насосной системе есть и, своего рода, обратный клапан, что обеспечивает прокачку крови только в одном направлении?
     
  5. ostrov

    ostrov Гуру

    Конечно есть. И не только в сердце, но и в венах.
    [​IMG]
     
  6. DIYMan

    DIYMan Guest

    Правая вена что-то напоминает (поручик, молчать!) :)
     
  7. ostrov

    ostrov Гуру

    Скорее уж вторая. ))
     
  8. DIYMan

    DIYMan Guest

    Так а я как написал? Правая, т.е. вторая :)
     
    ostrov нравится это.
  9. iBoy

    iBoy Гик

    Всё таки я, наверное, не правильно понял программу. Объясните, пожалуйста, как она работает. Ведь не так же? В чём я не прав?:
    Код (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 мсек(зачем?)
      }
     
    Последнее редактирование: 2 июл 2016
  10. ostrov

    ostrov Гуру

    Так она у вас не работает? Или работает, но расписать программу что в ней происходит?
     
  11. ostrov

    ostrov Гуру

    Вот с моими коментами:
    Код (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);                                // время между замерами (устанавливается эмперически в соотношении с изменением датчика), если его не сделать, то разница между измерениями будет слишком мала чтобы ее заметить
    }
     
    Последнее редактирование: 3 июл 2016
  12. iBoy

    iBoy Гик

    Она работает, однако не понимая её алгоритма, я не могу её интегрировать в свою программу. Спасибо заранее! Извините за назойливость, но я не понимаю, почему время между циклами измерений является временем между ударами?
     
  13. ostrov

    ostrov Гуру

    Время между циклами замера не является временем между ударами. Это время должно быть намного меньше, а именно примерно половиной времени подъема кривой с показания датчика (то есть пульса), чтобы можно было наверняка зафиксировать его наличие.

    Если взглянуть на показания осциллографа (см. выше), то видно, что подъем происходит примерно за 100мс, то есть установив время между измерениями 50мс мы гарантированно заметим это событие.
     
  14. iBoy

    iBoy Гик

    У меня датчик просто не видит пульс. Я уже и с Вашими значениями DELT и TIME пробовал, и со своими - не помогает. Видит изменения только в момент прислонения(но НЕ после!) и убирания пальца. Что может быть проблемой?
     
    Последнее редактирование: 5 июл 2016
  15. ostrov

    ostrov Гуру

    Подберите правильное положение пальца. Не прижимайте сильно, попробуйте разные пальцы и т.п.