Проблема с сигналом датчика пульса

Я включаю будильник с датчиком пульса. Когда он обнаруживает высокую частоту сердечных сокращений, он отправляет текстовое сообщение. Все работает нормально, когда я использую потенциометр (в качестве входа) для имитации запуска SMS. Я сделал несколько вариантов триггера частоты сердечных сокращений в зависимости от возраста, поэтому я использую переключатель в своем цикле. Я использую библиотеку PulseSensor Playground и образец скетча, который был получен вместе с ней, но когда я помещаю программу, которая считывает количество ударов в минуту, и помещаю это значение внутрь оператора if, она вообще не работает. Даже если я поставлю значение BPM для последовательного монитора, оно отобразит только 0. Что я могу сделать, чтобы решить эту проблему? Спасибо

Вот моя программа:

#define USE_ARDUINO_INTERRUPTS true     
#include <PulseSensorPlayground.h>     
#include <SoftwareSerial.h>              
#include <JC_Button.h>

const int OUTPUT_TYPE = SERIAL_PLOTTER;
const int PulseSensor = A0;  
const int THRESHOLD = 550;  

PulseSensorPlayground pulseSensor;
SoftwareSerial SIM800L(2, 3);  //(RX | TX)
const byte switchButton = 4;
int LED1 = 5;   // возрастной диапазон 1
int LED2 = 6;   // возрастной диапазон 2
int LED3 = 7;   //возрастной диапазон 3
int greenLED  = 8;    //для нормального пульса
int yellowLED  = 9;   //для среднего пульса
int redLED = 10;      //для высокой частоты сердечных сокращений

Button mybutton(switchButton);
boolean SMSsent = false;
int x = 0;

void setup(){
  mybutton.begin();
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(greenLED, OUTPUT);
  pinMode(yellowLED, OUTPUT);
  pinMode(redLED, OUTPUT);

  Serial.begin(115200);
  pulseSensor.analogInput(PulseSensor);
  pulseSensor.setSerial(Serial);
  pulseSensor.setOutputType(OUTPUT_TYPE);
  pulseSensor.setThreshold(THRESHOLD);

  SIM800L.begin(115200);  
  Serial.println("SIM800L ready");
}

void led_for_ages_range_1(){
  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
}
void led_for_ages_range_2(){
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  digitalWrite(LED3, LOW);
}
void led_for_ages_range_3(){
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, HIGH);
}

void led_indicator_1(){
  digitalWrite(greenLED, HIGH);
  digitalWrite(yellowLED, LOW);
  digitalWrite(redLED, LOW);
}
void led_indicator_2(){
  digitalWrite(greenLED, LOW);
  digitalWrite(yellowLED, HIGH);
  digitalWrite(redLED, LOW);
}
void led_indicator_3(){
  digitalWrite(greenLED, LOW);
  digitalWrite(yellowLED, LOW);
  digitalWrite(redLED, HIGH);
}

void range_1_indicator(){
  int BPMval = pulseSensor.getBeatsPerMinute();

  if (BPMval > 60 && BPMval < 85){
    led_indicator_1();
    SMSsent = false;
  }
  else if (BPMval > 86 && BPMval < 100){
    led_indicator_2();
    if(SMSsent == false){
      text_message_1();
      SMSsent = true;
    }
  }
  else if (BPMval > 101){
    if(SMSsent == false){
      text_message_2();
      SMSsent = true;
    }
  } 
  else {
    SMSsent = false;
  }
}

void range_2_indicator(){
  int BPMval = pulseSensor.getBeatsPerMinute();

  if (BPMval > 60 && BPMval < 75){
    led_indicator_1();
    SMSsent = false;
  }
  else if (BPMval > 76 && BPMval < 90){
    led_indicator_2();
    if(SMSsent == false){
      text_message_1();
      SMSsent = true;
    }
  }
  else if (BPMval > 91){
    if(SMSsent == false){
      text_message_2();
      SMSsent = true;
    }
  } 
  else {
    SMSsent = false;
  }
}

void range_3_indicator(){
  int BPMval = pulseSensor.getBeatsPerMinute();

  if (BPMval > 60 && BPMval < 70){
    led_indicator_1();
    SMSsent = false;
  }
  else if (BPMval > 71 && BPMval < 80){
    led_indicator_2();
    if(SMSsent == false){
      text_message_1();
      SMSsent = true;
    }
  }
  else if (BPMval > 81){
    if(SMSsent == false){
      text_message_2();
      SMSsent = true;
    }
  } 
  else {
    SMSsent = false;
  }
}

void text_message_1(){
  int BPMval = pulseSensor.getBeatsPerMinute();
  SIM800L.write("AT+CMGF=1\r");
  delay(100);
  Serial.println("SIM800L set destination number.");
  SIM800L.write("AT+CMGS=\"0123456789\"\r");
  delay(100);
  Serial.println("Sending text message...");
  SIM800L.write("Your heart rate are: ");
  SIM800L.write(BPMval);
  SIM800L.write(" BPM");
  SIM800L.write("\r");
  Serial.println("Your heart rate are: ");
  Serial.print(BPMval);
  Serial.println(" BPM");
  SIM800L.write((char)26);
  delay(100);
  Serial.println("SMS sent.");
}

void text_message_2(){
  int BPMval = pulseSensor.getBeatsPerMinute();
  SIM800L.write("AT+CMGF=1\r");
  delay(100);
  Serial.println("SIM800L set destination number.");
  SIM800L.write("AT+CMGS=\"0123456789\"\r");
  delay(100);
  Serial.println("Sending text message...");
  SIM800L.write("Warning! Your heart rate are: ");
  SIM800L.write(BPMval);
  SIM800L.write(" BPM");
  SIM800L.write("\r");
  Serial.println("Warning! Your heart rate are: ");
  Serial.print(BPMval);
  Serial.println(" BPM");
  SIM800L.write((char)26);
  delay(100);
  Serial.println("SMS sent.");
}

void loop(){
  //int BPMval = pulseSensor.getBeatsPerMinute();
  static enum {OPTION_ONE, OPTION_TWO, OPTION_THREE} condition;
  while (x == 0){
    mybutton.read();
    switch (condition){
      case OPTION_ONE:
      led_for_ages_range_1();
      range_1_indicator();
      if (mybutton.wasReleased()){      
        condition = OPTION_TWO;
      }
      break;

      case OPTION_TWO:
      led_for_ages_range_2();
      range_2_indicator();
      if (mybutton.wasReleased()){      
        condition = OPTION_THREE;
      }
      break;

      case OPTION_THREE:
      led_for_ages_range_3();
      range_3_indicator();
      if (mybutton.wasReleased()){      
        condition = OPTION_ONE;
      }
      break;
    }
  }
}

, 👍0

Обсуждение

внимательно изучите свой код... например, вы не получаете предупреждения при скорости 90 ударов в минуту (таких больше), @jsotola

Это всего лишь пример значения, я намерен использовать >= и <=., @rofimu

у вас есть тестовый скетч или примерный скетч для датчика пульса? это работает? или не работает только в скетче с SIM800 и SoftwareSerial, @Juraj

@Юрай. Да, и он отлично работает, когда я использую пример скетча из библиотеки PulseSensorPlayground. Также он работает с SIM800L и SoftwareSerial, когда он все еще находится в простом скетче, я не добавляю переключатель для переключения диапазона возрастов и состояния светодиодов в то время, потому что я не вставляю никакую программу опций возрастов. Это из-за моей ошибочной логики переключателя? Но эта логика переключателя также работает для изменения состояния светодиода и 3 разных значений диапазона, когда я использую потенциометр для изменения значения аналогового входа, которое изменяет светодиодный индикатор. И смс тоже работает., @rofimu

добавить это к вопросу, @Juraj

У меня наблюдаются колебания BPM (от 40 до 250). Чаще всего это 200-е годы. Иногда доходит до 90 или 80. [датчик пульса](http://bigbelectronics.in/product.php?product=pulse-heart-rate-sensor-module-arduino-raspberry-pi), @Surya Teja


1 ответ


Лучший ответ:

1

Вы забыли pulseSensor.begin() и не используете pulseSensor.sawNewSample(). См. примеры библиотеки.

Библиотека использует прерывания для измерения пульса. (Это требует времени, которое в противном случае заблокировало бы выполнение цикла). Функция begin() запускает это прерывание.

Значение, измеренное прерываниями, доступно с помощью getBeatsPerMinute(), а функция sawNewSample() указывает, что доступно новое значение.

Библиотека может работать без прерываний (PulseSensor_BPM_Alternative.ino), но даже в этом случае функция begin() инициализирует библиотеку, и тогда sawNewSample() является функцией, которая считывает датчик.

,

Вы видели это в образце скетча «Получение BPM_to_Monitor»? В этом скетче pulseSensor.begin() запускается только один раз и предназначен для печати текста внутри Serial.println. Почему мне нужно использовать pulseSensor.sawNewSample()? Он возвращает true или false только потому, что это логическое значение., @rofimu

без begin библиотека не читает датчик. getBeatsPerMinute — это всего лишь геттер, который читает переменную в библиотеке., @Juraj

Я расширил ответ., @Juraj

Ага, понятно. Я попробую это., @rofimu

Я добавил pulseSensor.begin(), и он работает. Но когда я пишу pulseSensor.sawNewSample(), возникает ошибка, некоторые светодиоды всегда быстро мигают, а не на полной яркости. Но в целом это работает, если добавить pulseSensor.begin(). Спасибо, @rofimu