Проблема с сигналом датчика пульса
Я включаю будильник с датчиком пульса. Когда он обнаруживает высокую частоту сердечных сокращений, он отправляет текстовое сообщение. Все работает нормально, когда я использую потенциометр (в качестве входа) для имитации запуска 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;
}
}
}
@rofimu, 👍0
Обсуждение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
- Бот не активируется после нажатия кнопки
- Кнопка с таймером переключения и функцией сброса времени + светодиод обратной связи
- MAX30100 не работает
- Использование библиотеки емкостных датчиков с мультиплексором 74HC4067
- Считывание значений с емкостного сенсорного датчика TTP229 на arduino
- Подключение двух Arduino через I2C, когда контакты I2C A4/A5 уже используются.
- Два датчика расхода, один ESP32, ЖК-дисплей и/или Arduino
- Arduino nano 33 ble vs ble sense. Потребляемая мощность и т.д.
внимательно изучите свой код... например, вы не получаете предупреждения при скорости 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