Монитор ударов в минуту, но имея проблемы с кодированием? Кодирование не будет печатать никаких значений

Любые советы о том, какую кодировку корректировать. Новичок в Arduino.

const int sensorPin = A0; 
float voltage=0.0;
int sensorVal=0; 
int heartbeats=9;
float BPM=0.0;
const int led1=2;
const int led2=3;
int starttime = 0;
boolean counted = false;

void setup() {
pinMode(sensorPin, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);  
Serial.begin(9600);
boolean counted = false;
}
void loop() {


starttime = millis();
while (millis()<starttime+10000)                          
{ 
  sensorVal = analogRead(sensorPin);
  if (sensorVal >550 && counted == false)         
  {                                                          
    counted = true;  
  }
  else if (sensorVal < 500)
  {
    counted = false; 
  } 
}

    BPM = heartbeats*6;
 Serial.println("Your BPM is");
 Serial.println(BPM);                                
BPM =0;
heartbeats =0;

}

, 👍1

Обсуждение

Где вы на самом деле считаете BPM? Кроме того, "starttime" слишком мал, чтобы хранить время. Кроме того, ваш метод расчета времени неверен, так как он не справится с ролловером миллис., @Majenko

Незначительные проблемы в вашем коде могут быть исправлены, но фактическое измерение частоты ударов в минуту - это сложный алгоритм обработки, выходящий далеко за рамки этого сайта, и никто не захочет запускать его на Arduino на базе ATmega. Вам повезет больше, если вы выберете другой проект., @Chris Stratton

Зависит от того, как вы это делаете, но процесс определения пульса очень прост, как и определение уровня газа в крови (путаница часто возникает с оксиметром, который на самом деле измеряет "газ", а не O2 и может быть обманут интоксикацией CO). Чтобы получить точный подсчет, я предлагаю использовать прерывание или, может быть, взглянуть на код, подобный коду о скорости потока воды, который вы должны читать с определенной скоростью, как в вашем случае. Есть локк здесь: https://www.sparkfun.com/products/11574 На вкладке документ этого продукта вы найдете код., @Peter


2 ответа


1

Существует два основных метода измерения частоты, и это в основном то, что вы пытаетесь сделать.

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

Подсчет частоты-это то, что вы пытаетесь сделать, и в основном это подсчет количества ребер, которые возникают в течение определенного периода времени.

Однако ваш метод немного испорчен: главным образом потому, что вы забыли подсчитать ребра. Вы написали какой-то разумный код для поиска ребра, но не смогли ничего сделать с этим ребром.

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

Вместо этого вы должны рассмотреть что-то более похожее на это:

void loop() {
    static int count = 0;
    static bool counted = false;
    static uint32_t ts = millis();

    int val = analogRead(sensorPin);

    if ((val > 550) && (counted == false)) {
        counted = true;
        count++;
    } else if (val < 500) {
        counted = false;
    }

    if (millis() - ts >= 10000) {
        ts += 10000; // Вы можете присвоить ts значение millis (), но
                     // добавив 10 секунд, он отменяет любой дрейф
                     // вызвано другими задержками в вашем скетче.
        int BPM = count * 10;
        count = 0;
        Serial.print("BPM: ");
        Serial.println(BPM);
    }
}
,

-1

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

  1. Используйте вход для управления счетчиком на внутренних часах. Он дает самые точные измерения с разрешением ниже американского.

  2. Используйте внешние прерывания или прерывания pcint для определения времени начала и начала ребра.

  3. Ждите между краями.

...

Передискретизация и алгоритм помогут сгладить измерение.

,