While connecting the Nodemcu with Adafruit server getting this error - expected initializer before 'mqtt'

checkForBeat function is not working

I don't understand what you mean.

I think you should reread the forum guidelines to see how to properly ask a question and some good information on making a good post.

You must formulate your questions clearly, and answer the questions of others in detail. You must always show the full code. This code should match what you are loading into the controller.

Without these conditions, the discussion has little meaning. No one will ask you hundreds of questions to get the whole picture out of you.
If English is not your native language, use google translate.

sensor data bpm and avg_bpm not updating shows zero continuously @lahowalker

// MAX30100 - Version: Latest 
#include <MAX30100.h>
#include "thingProperties.h"
#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"
MAX30105 particleSensor;
const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.
byte rates[RATE_SIZE]; //Array of heart rates
byte rateSpot = 0;
long lastBeat = 0; //Time at which the last beat occurred
void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
  delay(1500); 
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
  {
    Serial.println("MAX30105 was not found. Please check wiring/power. ");
    while (1);
  }
  Serial.println("Place your index finger on the sensor with steady pressure.");

  particleSensor.setup(); //Configure sensor with default settings
  particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
  particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED

  // Defined in thingProperties.h
  initProperties();

  // Connect to Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  
  /*
     The following function allows you to obtain more information
     related to the state of network and IoT Cloud connection and errors
     the higher number the more granular information you’ll get.
     The default is 0 (only errors).
     Maximum is 4
 */
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
}

void loop() {
ArduinoCloud.update();
long irValue = particleSensor.getIR();
Serial.print( "irValue ");
Serial.print( irValue );
Serial.print( " checkForBeat(irValue) " );
Serial.print( checkForBeat(irValue) );
Serial.println();
if (checkForBeat(irValue) == true)
  {
    Serial.print( "We sensed a beat! " );
    long delta = millis() - lastBeat;
    lastBeat = millis();

     float bpm = 60 / (delta / 1000.0);

    if (bpm < 255 && bpm > 20)
    {
      rates[rateSpot++] = (byte)bpm; //Store this reading in the array
      rateSpot %= RATE_SIZE; //Wrap variable

      //Take average of readings
      float avg_bpm = 0.0;
      for (byte x = 0 ; x < RATE_SIZE ; x++)
        avg_bpm += rates[x];
      avg_bpm /= RATE_SIZE;
    }
  }
  delay(1000);

  Serial.print("IR=");
  Serial.print(irValue);
  Serial.print(", BPM=");
  Serial.print(bpm);
  Serial.print(", Avg BPM=");
  Serial.print(avg_bpm);

  if (irValue < 50000)
    Serial.print(" No finger?");

  Serial.println();
  
  
}


/*
  Since Bpm is READ_WRITE variable, onBpmChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onBpmChange()  {
  // Add your code here to act upon Bpm change
}

/*
  Since AvgBpm is READ_WRITE variable, onAvgBpmChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onAvgBpmChange()  {
  // Add your code here to act upon AvgBpm change
}

o/p >
irValue 82237 checkForBeat(irValue) 0
IR=82237, BPM=0.00, Avg BPM=0.00

because

is false

Your sensor doesn't detects heartbeats. You were told about this 2 weeks ago.

i know that but how can i resolve this

The library

"MAX30105.h"

has some example sketches. Did you try it? Are examples works?

the example code is working properly which is

/*
  Optical Heart Rate Detection (PBA Algorithm) using the MAX30105 Breakout
  By: Nathan Seidle @ SparkFun Electronics
  Date: October 2nd, 2016
  https://github.com/sparkfun/MAX30105_Breakout

  This is a demo to show the reading of heart rate or beats per minute (BPM) using
  a Penpheral Beat Amplitude (PBA) algorithm.

  It is best to attach the sensor to your finger using a rubber band or other tightening
  device. Humans are generally bad at applying constant pressure to a thing. When you
  press your finger against the sensor it varies enough to cause the blood in your
  finger to flow differently which causes the sensor readings to go wonky.

  Hardware Connections (Breakoutboard to Arduino):
  -5V = 5V (3.3V is allowed)
  -GND = GND
  -SDA = A4 (or SDA)
  -SCL = A5 (or SCL)
  -INT = Not connected

  The MAX30105 Breakout can handle 5V or 3.3V I2C logic. We recommend powering the board with 5V
  but it will also run at 3.3V.
*/

#include <Wire.h>
#include "MAX30105.h"

#include "heartRate.h"

MAX30105 particleSensor;

const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.
byte rates[RATE_SIZE]; //Array of heart rates
byte rateSpot = 0;
long lastBeat = 0; //Time at which the last beat occurred

float beatsPerMinute;
int beatAvg;

void setup()
{
  Serial.begin(115200);
  Serial.println("Initializing...");

  // Initialize sensor
  if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
  {
    Serial.println("MAX30105 was not found. Please check wiring/power. ");
    while (1);
  }
  Serial.println("Place your index finger on the sensor with steady pressure.");

  particleSensor.setup(); //Configure sensor with default settings
  particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
  particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED
}

void loop()
{
  long irValue = particleSensor.getIR();
  if (checkForBeat(irValue) == true)
  {
    //We sensed a beat!
    long delta = millis() - lastBeat;
    lastBeat = millis();

    beatsPerMinute = 60 / (delta / 1000.0);

    if (beatsPerMinute < 255 && beatsPerMinute > 20)
    {
      rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
      rateSpot %= RATE_SIZE; //Wrap variable

      //Take average of readings
      beatAvg = 0;
      for (byte x = 0 ; x < RATE_SIZE ; x++)
        beatAvg += rates[x];
      beatAvg /= RATE_SIZE;
    }
  }

  Serial.print("IR=");
  Serial.print(irValue);
  Serial.print(", BPM=");
  Serial.print(beatsPerMinute);
  Serial.print(", Avg BPM=");
  Serial.print(beatAvg);

  if (irValue < 50000)
    Serial.print(" No finger?");

  Serial.println();
}

Your sensor does not detect hearbeats.

You can't.

What a complete waste of time.

Get a heartbeat sensor like this one.

OP wrote that the library example works with your sensor. So it seems to me that he should rework his code...
...but judging by the way he answers in the thread - there is little hope for this.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.