цифровая электроника
вычислительная техника
встраиваемые системы

 


Измеряем пульс человека с помощью фоторезистора и Arduino

Автор: Mike(admin) от 30-11-2020, 05:55

Когда сердце сокращается и толкает кровь по телу, можно обнаружить мгновенные колебания артериального давления. Это причина того, что мы можем чувствовать пульс. На тех участках тела, где кожа и плоть достаточно тонкие, эти импульсы можно обнаружить по незначительным изменениям проходящего через них света. Хотя наши глаза недостаточно чувствительны, чтобы даже видеть свет, проходящий через наше тело, не говоря уже о колебаниях, фоторезисторы обладают таким уровнем чувствительности.


Измеряем пульс человека с помощью фоторезистора и Arduino

Фоторезистор меняет свое сопротивление в зависимости от интенсивности падающего на него света. Хотя изменение сопротивления может быть довольно небольшим для незначительных изменений интенсивности освещения, их можно усилить с помощью пары микросхем операционных усилителей.


Следующая принципиальная схема позволяет собрать устройство измерения пульса на основе Arduino, фоторезистора и операционных усилителей.


Измеряем пульс человека с помощью фоторезистора и Arduino

Измеряем пульс человека с помощью фоторезистора и Arduino

Фоторезистор находится в делителе напряжения с резистором 20 кОм, что означает, что по мере увеличения количества света на резисторе напряжение на делителе также увеличивается. Первый операционный усилитель («Amp1» на изображении выше) служит фильтром для делителя напряжения, удаляя высокочастотный шум из сигнала. Второй операционный усилитель («Amp2») служит инвертирующим усилителем, настроенным на максимальное усиление сигнала, проходящего через фильтр. Третий операционный усилитель («Amp3») устанавливает виртуальную землю, которая центрирует сигнал на уровне 2,5 В. Это гарантирует, что операционные усилители способны обеспечить максимальный размах сигнала от 0 В до 5 В. После фильтрации и усиления сигнал выглядит примерно так.


Измеряем пульс человека с помощью фоторезистора и Arduino

Чтобы позволить Arduino измерить частоту сердечных сокращений, сигнал должен пройти через компаратор («Cmp» на схеме). Компаратор – это специализированный операционный усилитель, который предназначен для вывода либо высокого, либо низкого сигнала. Когда напряжение на положительном входе больше, чем на отрицательном входе, компаратор выдает высокий уровень, а когда напряжение на положительном входе меньше отрицательного входа, компаратор выдает низкий уровень. В своей самой базовой конфигурации компаратор служит пороговым детектором, сигнализирующим, когда измеренное напряжение выше или ниже этого порога. Поскольку компаратор выдает либо высокий (5 В), либо низкий (0 В) уровень сигнала, он идеально подходит для взаимодействия с цифровыми выводами Arduino.


Измеряем пульс человека с помощью фоторезистора и Arduino

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


С шумным сигналом можно справиться с помощью гистерезиса. Общая идея состоит в том, что контур обратной связи с выхода изменит напряжение на положительном входе, что будет означать, что порог перехода от низкого к высокому уровню будет отличаться от порога перехода от высокого к низкому. В контексте сердечных импульсов это означает, что компаратор может быть настроен на запуск в одной точке на восходящем махе, а затем в другой точке при махе вниз, предпочтительно после дикротической метки. Таким образом, Arduino будет видеть один квадратный импульс для каждого удара сердца, как показано далее.


Измеряем пульс человека с помощью фоторезистора и Arduino

Настоятельно рекомендуется использовать какую-то прозрачную крышку на фоторезисторе, например, прозрачную термоусадочную пленку. По крайней мере, убедитесь, что провода полностью закрыты, чтобы не прикасаться ими к коже. Напряжение, генерируемое вашим телом, находится в пределах диапазона, создаваемого фоторезистором, когда он определяет ваш пульс, поэтому контакт с вашей кожей может исказить результаты.


Измеряем пульс человека с помощью фоторезистора и Arduino

Код Arduino состоит из частотомера и метода расчета частоты пульса в ударах в минуту. Частотомер учитывает ширину импульса, поступающего от компаратора, и отклоняет все, что меньше 200 миллисекунд или больше 800 миллисекунд. Это предотвратит отображение ложных данных, когда фоторезистор не используется для измерений. Код сохраняет текущее среднее значение частоты пульса за предыдущие 15 секунд, чтобы отфильтровать пропущенные импульсы из-за шума сигнала, вызванного случайными движениями.



#define INT0 3
float frequency;
long timeCount;
int counter;
long pulseStart;
int inputPin = 3;
boolean low;
float freqAvg;
float total;

void setup() {
  attachInterrupt(digitalPinToInterrupt(INT0), intrruption, CHANGE);
  counter = 0;
  timeCount = 0;
  frequency = 0;
  low = false;
  Serial.begin(9600);
  total = 15;
}

void loop() {
  timeCount = millis();
  while(millis() - timeCount < 5000){
    frequency = counter;
  }
  if(frequency > 3){
    total += frequency;
    total -= freqAvg;
    freqAvg = total/3;
  }
  showHR();
  counter = 0;

}

void intrruption(){
  if(digitalRead(3) == 0){
    fallDetect();
    low = true;
  }
  else if(digitalRead(3) == 1){
    widthCheck();
  }
}

void fallDetect(){
  pulseStart = millis();
}

void widthCheck(){
  long pulseEnd = millis();
  if((pulseEnd - pulseStart > 200) && (pulseEnd - pulseStart < 800) && low){
    counter++;
    low = false;
  }
}

void showHR(){
  Serial.print("Heart rate = ");
  Serial.println(freqAvg * 12);
  
}



© digitrode.ru


Теги: Arduino, фоторезистор




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий