Analog Values Not Showing up on Blynk with Esp8266

Hey guys, I am working on a project that utilises blynk and a pulse sensor. I have issue sending the data to blynk. The pulse sensor is connected to A0 of the ESP8266. I have followed all tutorials connecting pulse sensor and blynk but the data is still not showing on blynk. My Blynk shows that it has successfully connected to the ESP8266 thus this answers the connectivity of the ESP8266 and the mobile device. Is there a way to know what values is read by blynk or sent to blynk?

Also, are there any errors in my code that i might miss?

#include <SPI.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>

//Pulse sensor constant
#define USE_ARDUINO_INTERRUPTS true
#include <PulseSensorPlayground.h> //heart rate library [Install the Heart Rate Library]
const int analogInPin = A0;  // ESP8266 Analog Pin ADC0 = A0
//const int PulseWire = analogInPin;
#define PulseWire A0
const int LED13 = 13;
int Threshold =520;
PulseSensorPlayground pulseSensor;

//Pulse sensor variables
int Signal;
bool NoSignal = false;
int cycle = 0;
double bpm;

BlynkTimer timer;
//SimpleTimer timer;

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "**********"; //Enter the Auth code which was send by Blink

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "*****";  //Enter your WIFI Name
char pass[] = "********";  //Enter your WIFI Password


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); // See the connection status in Serial Monitor
  Blynk.begin(auth, ssid, pass);

// Setup a function to be called every second
  timer.setInterval(1000L, sensorDataSend);

  //pulseSensor.analogInput(PulseWire);
  pulseSensor.analogInput(analogInPin);
  pulseSensor.blinkOnPulse(LED13);
  pulseSensor.setThreshold(Threshold);
  if (!pulseSensor.begin())
  {
    Serial.println("We created a pulseSensor Object !");
  for(;;);
  }

}

void sensorDataSend()
{

  float bpm = pulseSensor.getBeatsPerMinute();
  if (pulseSensor.sawStartOfBeat())
  {
    cycle++;
    if(cycle>2)
    {
      NoSignal = false;
      cycle = 1;
    }
  } else {
    if (!NoSignal)
    {
      cycle=0;
      NoSignal = true;
    }
  }  
  
  Serial.print(bpm);
  Blynk.virtualWrite(V1, bpm);
}


void loop() {
  // put your main code here, to run repeatedly:;
  Blynk.run(); // Initiates Blynk
  timer.run(); // Initiates SimpleTimer

    Serial.print("BPM: ");
    Serial.println(bpm);  
}

Any help is appreciated, thank you!

I’d work on getting the pulse sensor working and printing the data to the serial monitor without the Blynk part.
Having this in your void loop…

Is a waste of time, as the pulse readings are only taken once per second in the sensorDataSend function, and that is where these two lines of code belong.

This isn’t needed when using the Blynk libraries.

Your variable and object definitions are odd, but I’m not Hamilcar with the library that you’re using.

Pete.

Hi, thank you the reply and suggestions. I tried getting the pulse sensor and the Esp8266 to work first and once i checked the serial monitor with the code above, i received the following error,

Soft WDT reset

>>>stack>>>

ctx: cont
sp: 3ffffdd0 end: 3fffffc0 offset: 01a0
3fffff70:  3ffeeae8 00000232 3ffeea44 40201e61  
3fffff80:  40206970 8001a8c0 feefeffe feefeffe  
3fffff90:  feefeffe feefeffe feefeffe 3ffeec14  
3fffffa0:  3fffdad0 00000000 3ffeebd4 40204774  
3fffffb0:  feefeffe feefeffe 3ffe8524 40100cad  
<<<stack<<<

It seems that with the code above, it crashes the ESP8266. Once i decode it, it specifies these lines,

And this,

0x40204774: **loop_wrapper()** at C:\Users\aftic\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266\ **core_esp8266_main.cpp** line **194**

Now, the question is where could have gone wrong in the code that forces it to crash?

Ps. Im kinda new to Arduino and Blynk. Any help is appreciated, Thanks!

This line is just nonsense and does nothing - talker it out.

The exclamation mark at the beginning of this conditional test is a logical not
So, in plain English, this means “if we can’t initialise the pulseSensor object, then print a message saying that we have initialised the pulse sensor object”.
I think you can see the logic error in this?
This won’t be causing the crash (but the empty for loop may be doing), but it makes no sense.

Pete.

Once removing the for(;;); it solves the crash issue but bpm is not getting any values. Bpm = 0. Funny enough, the sample code works with the pulse sensor with Arduino Mega; i’m getting bpm values while with the ESP8266, it doesn’t get values.

Upon further researching, the PulseSensorPlayground Library that is used in the code uses interrupt in it’s code which doesn’t work well with esp8266? Currently, still finding other alternative to work around the interrupt problem :confused:

/*  Getting_BPM_to_Monitor prints the BPM to the Serial Monitor, using the least lines of code and PulseSensor Library.
 *  Tutorial Webpage: https://pulsesensor.com/pages/getting-advanced
 *
--------Use This Sketch To------------------------------------------
1) Displays user's live and changing BPM, Beats Per Minute, in Arduino's native Serial Monitor.
2) Print: "♥  A HeartBeat Happened !" when a beat is detected, live.
2) Learn about using a PulseSensor Library "Object".
4) Blinks LED on PIN 13 with user's Heartbeat.
--------------------------------------------------------------------*/

#define USE_ARDUINO_INTERRUPTS false    // Set-up low-level interrupts for most acurate BPM math.
#include <PulseSensorPlayground.h>     // Includes the PulseSensorPlayground Library.   

//  Variables
const int PulseWire = 0;       // PulseSensor PURPLE WIRE connected to ANALOG PIN 0
const int LED13 = 13;          // The on-board Arduino LED, close to PIN 13.
int Threshold = 550;           // Determine which Signal to "count as a beat" and which to ignore.
                               // Use the "Gettting Started Project" to fine-tune Threshold Value beyond default setting.
                               // Otherwise leave the default "550" value. 

                               
PulseSensorPlayground pulseSensor;  // Creates an instance of the PulseSensorPlayground object called "pulseSensor"


void setup() {   

  Serial.begin(9600);          // For Serial Monitor

  // Configure the PulseSensor object, by assigning our variables to it. 
  pulseSensor.analogInput(PulseWire);   
  pulseSensor.blinkOnPulse(LED13);       //auto-magically blink Arduino's LED with heartbeat.
  pulseSensor.setThreshold(Threshold);   

  // Double-check the "pulseSensor" object was created and "began" seeing a signal. 
   if (pulseSensor.begin()) {
    Serial.println("We created a pulseSensor Object !");  //This prints one time at Arduino power-up,  or on Arduino reset.  
  }
}



void loop() {
 if (pulseSensor.sawNewSample()) {

 int myBPM = pulseSensor.getBeatsPerMinute();  // Calls function on our pulseSensor object that returns BPM as an "int".


if (pulseSensor.sawStartOfBeat()) {            // Constantly test to see if "a beat happened". 
 Serial.println("♥  A HeartBeat Happened ! "); // If test is "true", print a message "a heartbeat happened".
 Serial.print("BPM: ");                        // Print phrase "BPM: " 
 Serial.println(myBPM);                        // Print the value inside of myBPM. 
}
 }
}

Just tested out and found out that the above code works on the ESP8266 and I am able to get bpm values. This is because it is an alternative code for device that has problem with interrupt, provided in the library. Right now, I have trouble putting in Blynk code. Any help?

#define USE_ARDUINO_INTERRUPTS false    // Set-up low-level interrupts for most acurate BPM math.
#include <PulseSensorPlayground.h>     // Includes the PulseSensorPlayground Library.   
#include <SPI.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>


//  Pulse Variables
const int PulseWire = 0;       // PulseSensor PURPLE WIRE connected to ANALOG PIN 0
const int LED13 = 13;          // The on-board Arduino LED, close to PIN 13.
int Threshold = 550;           // Determine which Signal to "count as a beat" and which to ignore.
                               // Use the "Gettting Started Project" to fine-tune Threshold Value beyond default setting.
                               // Otherwise leave the default "550" value. 
                               
PulseSensorPlayground pulseSensor;  // Creates an instance of the PulseSensorPlayground object called "pulseSensor"
BlynkTimer timer;

char auth[] = "********"; //Enter the Auth code which was send by Blink

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "******";  //Enter your WIFI Name
char pass[] = "****";  //Enter your WIFI Password


void setup() {   

  Serial.begin(9600);          // For Serial Monitor
    Blynk.begin(auth, ssid, pass);

// Setup a function to be called every second
  timer.setInterval(1000L, sensorDataSend);


  // Configure the PulseSensor object, by assigning our variables to it. 
  pulseSensor.analogInput(PulseWire);   
  pulseSensor.blinkOnPulse(LED13);       //auto-magically blink Arduino's LED with heartbeat.
  pulseSensor.setThreshold(Threshold);   

  // Double-check the "pulseSensor" object was created and "began" seeing a signal. 
   if (pulseSensor.begin()) {
    Serial.println("We created a pulseSensor Object !");  //This prints one time at Arduino power-up,  or on Arduino reset.  
  }
}



void sensorDataSend() {
 if (pulseSensor.sawNewSample()) {

 int myBPM = pulseSensor.getBeatsPerMinute();  // Calls function on our pulseSensor object that returns BPM as an "int".


if (pulseSensor.sawStartOfBeat()) {            // Constantly test to see if "a beat happened". 
 Serial.println("♥  A HeartBeat Happened ! "); // If test is "true", print a message "a heartbeat happened".
 Serial.print("BPM: ");                        // Print phrase "BPM: " 
 Serial.println(myBPM);                        // Print the value inside of myBPM.
 Blynk.virtualWrite(V1, myBPM);
}
 }
}

void loop() {
  // put your main code here, to run repeatedly:;
  Blynk.run(); // Initiates Blynk
  timer.run(); // Initiates SimpleTimer
}

This is the working pulse sensor code with the blynk added but unfortunately, it causes it not to run; serial monitor is not showing anything. Where could have gone wrong?

Don’t have the sensor to do any real testing, so this is just a blind suggestion, but maybe try decreasing the timer interval. Try like .1 seconds.

timer.setInterval(100L, sensorDataSend);

And maybe use a second timer to report the value to BLYNK at a longer interval. You will need to declare int myBPM as a global variable.

#define USE_ARDUINO_INTERRUPTS false    // Set-up low-level interrupts for most acurate BPM math.
#include <PulseSensorPlayground.h>     // Includes the PulseSensorPlayground Library.   
#include <SPI.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>


//  Pulse Variables
const int PulseWire = 0;       // PulseSensor PURPLE WIRE connected to ANALOG PIN 0
const int LED13 = 13;          // The on-board Arduino LED, close to PIN 13.
int Threshold = 550;           // Determine which Signal to "count as a beat" and which to ignore.
                               // Use the "Gettting Started Project" to fine-tune Threshold Value beyond default setting.
                               // Otherwise leave the default "550" value. 

int myBPM; 
                              
PulseSensorPlayground pulseSensor;  // Creates an instance of the PulseSensorPlayground object called "pulseSensor"
BlynkTimer timer;

char auth[] = "********"; //Enter the Auth code which was send by Blink

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "******";  //Enter your WIFI Name
char pass[] = "****";  //Enter your WIFI Password


void setup() {   

  Serial.begin(9600);          // For Serial Monitor
    Blynk.begin(auth, ssid, pass);

// Setup a function to be called every second
  timer.setInterval(100L, sensorDataSend);
  timer.setInterval(1000L, blynkDataSend);


  // Configure the PulseSensor object, by assigning our variables to it. 
  pulseSensor.analogInput(PulseWire);   
  pulseSensor.blinkOnPulse(LED13);       //auto-magically blink Arduino's LED with heartbeat.
  pulseSensor.setThreshold(Threshold);   

  // Double-check the "pulseSensor" object was created and "began" seeing a signal. 
   if (pulseSensor.begin()) {
    Serial.println("We created a pulseSensor Object !");  //This prints one time at Arduino power-up,  or on Arduino reset.  
  }
}



void sensorDataSend() {
 if (pulseSensor.sawNewSample()) {

myBPM = pulseSensor.getBeatsPerMinute();  // Calls function on our pulseSensor object that returns BPM as an "int".


if (pulseSensor.sawStartOfBeat()) {            // Constantly test to see if "a beat happened". 
 Serial.println("♥  A HeartBeat Happened ! "); // If test is "true", print a message "a heartbeat happened".
 Serial.print("BPM: ");                        // Print phrase "BPM: " 
 Serial.println(myBPM);                        // Print the value inside of myBPM.
}
 }
}

void blynkDataSend()
{
   Blynk.virtualWrite(V1, myBPM);
}
void loop() {
  // put your main code here, to run repeatedly:;
  Blynk.run(); // Initiates Blynk
  timer.run(); // Initiates SimpleTimer
}

FINALLY! Thank you Toro_Blanco, turns out decreasing the timer interval works! Now, I am able to receive values from the pulse sensor on Serial Monitor as well as on Blynk. :slight_smile: