Монитор ударов в минуту, но имея проблемы с кодированием? Кодирование не будет печатать никаких значений
Любые советы о том, какую кодировку корректировать. Новичок в 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;
}
@Kevin O Regan, 👍1
Обсуждение2 ответа
Существует два основных метода измерения частоты, и это в основном то, что вы пытаетесь сделать.
Существует подсчет частоты и синхронизация частоты. Последнее включает в себя измерение времени между последовательными импульсами и вычисление по нему мгновенной частоты. Хорошо подходит для быстро меняющихся частот, когда вам нужно сразу узнать частоту.
Подсчет частоты-это то, что вы пытаетесь сделать, и в основном это подсчет количества ребер, которые возникают в течение определенного периода времени.
Однако ваш метод немного испорчен: главным образом потому, что вы забыли подсчитать ребра. Вы написали какой-то разумный код для поиска ребра, но не смогли ничего сделать с этим ребром.
Кроме того, ваш код блокируется в течение 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);
}
}
Предположим, что входной сигнал представляет собой низкочастотную квадратную волну. Несколько способов сделать это.
Используйте вход для управления счетчиком на внутренних часах. Он дает самые точные измерения с разрешением ниже американского.
Используйте внешние прерывания или прерывания pcint для определения времени начала и начала ребра.
Ждите между краями.
...
Передискретизация и алгоритм помогут сгладить измерение.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- avrdude ser_open() can't set com-state
- Как подключиться к Arduino с помощью WiFi?
- Mac OSX Yosemite не отображает последовательные порты для Uno R3
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
Где вы на самом деле считаете BPM? Кроме того, "starttime" слишком мал, чтобы хранить время. Кроме того, ваш метод расчета времени неверен, так как он не справится с ролловером
миллис., @MajenkoНезначительные проблемы в вашем коде могут быть исправлены, но фактическое измерение частоты ударов в минуту - это сложный алгоритм обработки, выходящий далеко за рамки этого сайта, и никто не захочет запускать его на Arduino на базе ATmega. Вам повезет больше, если вы выберете другой проект., @Chris Stratton
Зависит от того, как вы это делаете, но процесс определения пульса очень прост, как и определение уровня газа в крови (путаница часто возникает с оксиметром, который на самом деле измеряет "газ", а не O2 и может быть обманут интоксикацией CO). Чтобы получить точный подсчет, я предлагаю использовать прерывание или, может быть, взглянуть на код, подобный коду о скорости потока воды, который вы должны читать с определенной скоростью, как в вашем случае. Есть локк здесь: https://www.sparkfun.com/products/11574 На вкладке документ этого продукта вы найдете код., @Peter