Coder Social home page Coder Social logo

pulsesensor_amped_arduino's Introduction

This code has been superseded

logo

Getting Advanced Code / PulseSensor & "Arduino"

  • Blinks LED on Pin 13 to a User's Live Heartbeat.
  • "Fancy Fade Blink" an LED on Pin 5, to a User's Live HeartBeat.
  • Calculates User's BPM, Beat-Per-Minute.
  • Calculates User's IBI, the Interval Between Beats.
  • Serial.print's the Signal, BPM, and IBI. Use this output for our Processing Visualizer App , our Pulse Sensor Mac App, or your project!
  • Tech Note: Employ's Arduino's Interrupt, to keep "time", and calculate BPM and IBI.

Screen Shot

ScreenShot

Installing

  1. Click the Clone or Download button above and download the zip, or if you are a github user, clone this repo, or fork it!

  2. Take the PulseSensor_Amped_Arduino-master.zip file, and move it to your Documents/Arduino folder.

  3. Unzip PulseSensor_Amped_Arduino-master.zip in your Documents/Arduino folder. This properly installs your files.

  4. Double-click on PulseSensorAmped_Arduino_1.5.0.ino filesys

    Or, 0pen project in *Arduino via File > Sketchbook > PulseSensor_Amped_Arduino-Master > PulseSensorAmped_Arduino_1.5.0.ino sketchbook

Pulse Sensor Hook-up

Arduino Pin PulseSensor Cable Color
RED 5V or 3V
BLACK GND (GROUND)
PURPLE A0 (Analog Pin Zero)

cablehookup

Variables to Note

Variable Name What it does
Signal Int that holds raw Analog Input data on Pin 0, the PulseSensor's Purple Cable. It's updated every 2mS
BPM Int that holds the heart-rate value, derived every beat, from averaging previous 10 IBI values
IBI Int that holds the time interval between beats
Pulse Boolean that is true when a heartbeat is sensed. It's false other times. It controls LED Pin 13.
QS Boolean that is true whenever Pulse is found and BPM is updated. User must reset.

Working with other Apps via Serial.print

This Arduino Sketch works with:

Follow the links above to learn more about the Processing Visualizer and Mac App. This Read Me will cover how to view your pulse wave and other data with the Arduino Serial Plotter. There is a variable in the Pulse Sensor Amped Arduino Sketch that determines how the serial output is formatted. The variable is called outputType, and there are two options for setting this variable: PROCESSING_VISUALIZER and SERIAL_PLOTTER. By default, outputType is set to SERIAL_PLOTTER.

outputType

If you want to use the Serial Plotter, upload the Sketch to your Arduino microcontroller, and then select Tools > Serial Plotter. Select Serial Plotter

When you turn on the Plotter, make sure that the baud rate is set to 115200. Make this adjustment with the lower right corner menu selector. You will see three traces in the Arduino Serial Plotter. The red trace is your pulse wave data from the Signal variable. The yellow trace is your IBI, or the time between each beat. The blue trace is your BPM or your Beats Per Minute.

Serial Plotter Shot

If you only want to see the pulse wave Signal data, then you can edit the Arduino Sketch. In the AllSerialHandling.ino tab, simply comment out the lines shown below by inserting // in the beginning of the line.

comment data

Now, when you run the Serial Plotter, you will see a blue pulse waveform only!

plot pulse only

Timer Interrupt Notes or "Why did some of PWM Pins stop working ???"

There is a tab in the Arduino code called Timer_Interrupt_Notes. This page describes how to set up the timed interrupt depending on which hardware you are using, and what other things you may want to do with your sketch. We are using a hardware timer on the micrcontroller to make sure that our Pulse Sensor samples are taken at a consistent rate. That makes our data extra scientific! Please read it carefully!

PWM on pins 3 and 11 will not work when using this code, because we are using Timer 2! ๐Ÿคทโ€โ™‚๏ธ๐Ÿคทโ€โ™€๏ธ

Interrupt Setting Disables PWM ON Arduino PINS
TIMER2 3 AND 11

Pulse Sensor Preparation [ Garbage In ~ Garbage Out ]

It's important to protect the Pulse Sensor from the oils and sweat that your fingertips and earlobes and other body parts make. That stuff can adversely affect the signal quality. Also, it's important to protect you from the electricity that makes the Pulse Sensor work! To this end, we have provided clear vinyl stickers that fit perfectly on the face of the Pulse Sensor. Peel one off, and press it firmly on the front side of your Pulse Sensor. Stick Picture Picture

Troubleshooting

Having trouble making heads or tails of what is wrong?
Check your raw signal with this project: WorldFamousElectronics/PulseSensorStarterProject

Alt text

pulsesensor_amped_arduino's People

Contributors

biomurph avatar joelsensor avatar yury-g avatar yurygitman avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pulsesensor_amped_arduino's Issues

Flash green LED

Would it make sense to

  • turn the LED on
  • perform analogRead()
  • turn the LED off

everytime we want to read the sensor value? Maybe this could lower the power consumption?

False BPM-calculation on Arduino Mini Pro

Hi,
first i use the Arduino UNO for a project with an bluetooth-modul to android and so on ;-)
Now i want to transfer it to an Arduino Mini Pro 8MHz,3.3V.

So i used the Settings:
void interruptSetup(){
// Initializes Timer2 to throw an interrupt every 2mS.
TCCR2A = 0x02; // DISABLE PWM ON DIGITAL PINS 3 AND 11, AND GO INTO CTC MODE
TCCR2B = 0x05; // DON'T FORCE COMPARE, 128 PRESCALER
OCR2A = 0X7C; // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE
TIMSK2 = 0x02; // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A
sei(); // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED

I get a pulse rate but it`s to high, when i have a pulse rate of 80 BPM, i get with the Arduino Mini Pro a value from 150 - 200 BPM.

Has someone of you similiar problems or get running the code on the mini pro?
Thanks for help!

Can u please fix this problem in coding of pulse sensorr

When i am running the code iam getting no output in processing visualizer it showing a single wave continusely going but giving pulse 0 and bpm 0
And i tried serial plotter too by changing the output type in main but it showing the waves going on even i removed my finger
Plz anyone help me..

Heartbeat data keeps increasing.

I am using the exact example code from the github repo on an arduino uno.
The value just keeps increasing continuously. (seems to be some erratic readings?)

Circuit:
ARDUINO => SENSOR
GND -> -
5v -> +
A0 -> SIG

Laptop is powered through the outlet (connected to charger).

I have added a clear tape on top and bottom to shield from bad data. This data is collected as soon as the arduino is switched on with the sensor resting on the table, heart side up.

Any help is appreciated.

Serial output :

--------------|-
------------
------------
------------
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 66  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 69  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 73  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 79  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 94  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 98  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 103  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 110  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 118  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 128  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 139  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 151  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 166  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 185  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 209  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 215  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 218  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 220  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 220  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 217  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 218  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 218  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 219  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 218  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 219  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 227  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 226  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 227  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 226  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 205  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 190  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 190  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 190  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 191  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 188  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 188  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 188  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 188  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 188  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 209  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
--------------|-
*** Heart-Beat Happened *** BPM: 227  --------------|-
--------------|-
--------------|-
--------------|-
--------------|-

I'm getting weird numbers and outputs from the pulse sensor

Please help quick!
I'm getting weird numbers and outputs when I run the code with the pulse sensor
0,600,0
583
0,604,576
0,604,574
0,604,569
0,604,562
0,604,556
0,604,547
0,604,547
0,604,543
4,587
0,604,586
0,604,584
0,604,583
0,604,576
0,604,574
0,604,569
0,604,562
0,604,556
0,604,547
0,604,547
0,604,543
0,600,0
0,600,434
0,600,418
0,600,424
0,600,444
0,600,459
0,600,474
0,600,485
0,600,495
0,600,502
0,600,505
0,600,504
0,600,507
0,600,510
0,600,513
0,600,510

Getting serial monitor output wrong

I am getting output in about 100+ bpm.It starts from 0 and continuously increasing to 257 .....

code is using for this:

// Variables
int pulsePin = 0; // Pulse Sensor purple wire connected to analog pin 0
int blinkPin = 13; // pin to blink led at each beat
int fadePin = 5; // pin to do fancy classy fading blink at each beat
int fadeRate = 0; // used to fade LED on with PWM on fadePin

// Volatile Variables, used in the interrupt service routine!
volatile int BPM; // int that holds raw Analog in 0. updated every 2mS
volatile int Signal; // holds the incoming raw data
volatile int IBI = 600; // int that holds the time interval between beats! Must be seeded!
volatile boolean Pulse = false; // "True" when User's live heartbeat is detected. "False" when not a "live beat".
volatile boolean QS = false; // becomes true when Arduoino finds a beat.

volatile int RRDelta = 0;
volatile double RMSSD = 0;
volatile double LN20RMSSD = 0;
volatile double SDNN = 0;
volatile double SDSD = 0;
volatile double NN50 = 0;
volatile double PNN50 = 0;

// Regards Serial OutPut -- Set This Up to your needs
static boolean serialVisual = true; // Set to 'false' by Default. Re-set to 'true' to see Arduino Serial Monitor ASCII Visual Pulse

void setup(){
pinMode(blinkPin,OUTPUT); // pin that will blink to your heartbeat!
pinMode(fadePin,OUTPUT); // pin that will fade to your heartbeat!
Serial.begin(115200); // we agree to talk fast!
interruptSetup(); // sets up to read Pulse Sensor signal every 2mS
// IF YOU ARE POWERING The Pulse Sensor AT VOLTAGE LESS THAN THE BOARD VOLTAGE,
// UN-COMMENT THE NEXT LINE AND APPLY THAT VOLTAGE TO THE A-REF PIN
// analogReference(EXTERNAL);

}

// Where the Magic Happens
void loop(){

serialOutput() ;
if (QS == true){ // A Heartbeat Was Found
// BPM and IBI have been Determined
// Quantified Self "QS" true when arduino finds a heartbeat
fadeRate = 255; // Makes the LED Fade Effect Happen
// Set 'fadeRate' Variable to 255 to fade LED with pulse
serialOutputWhenBeatHappens(); // A Beat Happened, Output that to serial.

QS = false; // reset the Quantified Self flag for next time

}

ledFadeToBeat(); // Makes the LED Fade Effect Happen
delay(20); // take a break
}

void ledFadeToBeat(){
fadeRate -= 15; // set LED fade value
fadeRate = constrain(fadeRate,0,255); // keep LED fade value from going into negative numbers!
analogWrite(fadePin,fadeRate); // fade LED
}
untitled

Code would not load - errors

Hello,

I've tried to run the code as is. There are several errors I've seen trying to run it. (I'm using an Arduino UNO).

Most of the errors seem to be that variables and pins were not defined.

Variables not 'declared in this scope':

Signal
IBI
Pulse
BPM
QS

Pins which needs to be declared:

blinkPin
pulsePin

I tried to create the variables, and added a void setup() for the pinModes, and attached is the error which I got.

Perhaps I'm not doing this correctly, but looking for some help.

Thanks.

`/*

*/

// My additions
int Signal = 0;
int IBI = 0;
int Pulse = 0;
int BPM = 0;
int pulsePin = A5;
int blinkPin = 13;
boolean QS;

// My additions
void setup()
{
pinMode(pulsePin, INPUT);
pinMode(blinkPin, OUTPUT);
}

volatile int rate[10]; // array to hold last ten IBI values
volatile unsigned long sampleCounter = 0; // used to determine pulse timing
volatile unsigned long lastBeatTime = 0; // used to find IBI
volatile int P =512; // used to find peak in pulse wave, seeded
volatile int T = 512; // used to find trough in pulse wave, seeded
volatile int thresh = 525; // used to find instant moment of heart beat, seeded
volatile int amp = 100; // used to hold amplitude of pulse waveform, seeded
volatile boolean firstBeat = true; // used to seed rate array so we startup with reasonable BPM
volatile boolean secondBeat = false; // used to seed rate array so we startup with reasonable BPM

void interruptSetup(){
// Initializes Timer2 to throw an interrupt every 2mS.
TCCR2A = 0x02; // DISABLE PWM ON DIGITAL PINS 3 AND 11, AND GO INTO CTC MODE
TCCR2B = 0x06; // DON'T FORCE COMPARE, 256 PRESCALER
OCR2A = 0X7C; // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE
TIMSK2 = 0x02; // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A
sei(); // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED
}

// THIS IS THE TIMER 2 INTERRUPT SERVICE ROUTINE.
// Timer 2 makes sure that we take a reading every 2 miliseconds
ISR(TIMER2_COMPA_vect){ // triggered when Timer2 counts to 124
cli(); // disable interrupts while we do this
Signal = analogRead(pulsePin); // read the Pulse Sensor
sampleCounter += 2; // keep track of the time in mS with this variable
int N = sampleCounter - lastBeatTime; // monitor the time since the last beat to avoid noise

//  find the peak and trough of the pulse wave

if(Signal < thresh && N > (IBI/5)*3){ // avoid dichrotic noise by waiting 3/5 of last IBI
if (Signal < T){ // T is the trough
T = Signal; // keep track of lowest point in pulse wave
}
}

if(Signal > thresh && Signal > P){ // thresh condition helps avoid noise
P = Signal; // P is the peak
} // keep track of highest point in pulse wave

// NOW IT'S TIME TO LOOK FOR THE HEART BEAT
// signal surges up in value every time there is a pulse
if (N > 250){ // avoid high frequency noise
if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ){
Pulse = true; // set the Pulse flag when we think there is a pulse
digitalWrite(blinkPin,HIGH); // turn on pin 13 LED
IBI = sampleCounter - lastBeatTime; // measure time between beats in mS
lastBeatTime = sampleCounter; // keep track of time for next pulse

  if(secondBeat){                        // if this is the second beat, if secondBeat == TRUE
    secondBeat = false;                  // clear secondBeat flag
    for(int i=0; i<=9; i++){             // seed the running total to get a realisitic BPM at startup
      rate[i] = IBI;                      
    }
  }

  if(firstBeat){                         // if it's the first time we found a beat, if firstBeat == TRUE
    firstBeat = false;                   // clear firstBeat flag
    secondBeat = true;                   // set the second beat flag
    sei();                               // enable interrupts again
    return;                              // IBI value is unreliable so discard it
  }   


  // keep a running total of the last 10 IBI values
  word runningTotal = 0;                  // clear the runningTotal variable    

  for(int i=0; i<=8; i++){                // shift data in the rate array
    rate[i] = rate[i+1];                  // and drop the oldest IBI value 
    runningTotal += rate[i];              // add up the 9 oldest IBI values
  }

  rate[9] = IBI;                          // add the latest IBI to the rate array
  runningTotal += rate[9];                // add the latest IBI to runningTotal
  runningTotal /= 10;                     // average the last 10 IBI values 
  BPM = 60000/runningTotal;               // how many beats can fit into a minute? that's BPM!
  QS = true;                              // set Quantified Self flag 
  // QS FLAG IS NOT CLEARED INSIDE THIS ISR
}                       

}

if (Signal < thresh && Pulse == true){ // when the values are going down, the beat is over
digitalWrite(blinkPin,LOW); // turn off pin 13 LED
Pulse = false; // reset the Pulse flag so we can do it again
amp = P - T; // get amplitude of the pulse wave
thresh = amp/2 + T; // set thresh at 50% of the amplitude
P = thresh; // reset these for next time
T = thresh;
}

if (N > 2500){ // if 2.5 seconds go by without a beat
thresh = 512; // set thresh default
P = 512; // set P default
T = 512; // set T default
lastBeatTime = sampleCounter; // bring the lastBeatTime up to date
firstBeat = true; // set these to avoid noise
secondBeat = false; // when we get the heartbeat back
}

sei(); // enable interrupts when youre done!
}// end isr`

Lots of Random Characters are being outputted

I am trying to run this program and it is never going into the serialoutputwhenbeethappens.
Also it is outputting some sensible data from the serialoutput but after about 6 lines it just outputs a never ending crazy long string of random characters.

using pulse sensor with ATtiny85 chip

Hi there, I am planning to use the Pulse sensor on attiny85 chip. But looks like the code uploaded online have to be modified due to the fact that attiny85 does not have timer2 and serial communication. With added serialsoftware, I am able to serialprint words to the serial monitor with the Attiny85 chip, so im quite sure my code there has no problem. But for the timer2 to be modified as timer1, I am not sure the codes that I found online is correct or not. I tried to serial print the BPM but not luck. Can anyone help Please ?

The code works well with Arduino Uno but not Arduino Pro Mini

Hi guys, I have downloaded the code and use it on my arduino uno and it works perfectly fine. When i said fine, it means the range of heartbeat is around 50 plus to 80 plus, and the heartbeat only be detected when i placed my finger on the sensor, else, the display just paused until I place my finger there again. However, when I transfer the same code to arduino pro mini, the heartbeat just randomly detected and displayed on serial monitor even though I did not place my finger there. However it gave correct reading when i placed my finger, the problem is just that it kept reading pulse even though there are none. It don't happen on arduino uno. So, actually which one is working fine ? I tried it with several arduino Unos and Arduino Pro minis, the Unos work fine, but not the Pro minis. Can anyone explain ?

Arduino MKR1000

Hello guys, I was testing the library, I noticed there is a compatibility issue with the timer interrupt 2, I was wondering if the timer can be replaced for something more general for other arduinos.

Greetings

Feedback from Bluetooth Modul on PulseSensor Arduino Mini Pro

Hi,
I use the Pulsesensor with Arduino Mini Pro 3.3V/8MHz in connection with a Bluetooth module
HC-10. The Mini works great with the Pulsesensor in serial plotting and with the processing app.
But when connect the HC-10 parallel to the Pulsesensor over the 3.3V Source of the Mini, clock of the Bluetooth modul brought feedback on the pulsesensor -> picture
Cause of the clock i get only kryptical values :-(
By the way the same project works fine with Arduino UNO and the interrupt settings are fitted.
Someone have an idea why I have that feedback?
Thanks a lot and sorry for my bad english.
ruckkopplung

No signal in ASCII Monitor

Hello there,

I ordered the pulse sensor from the official website.
I run windows 10. I downloaded the code Pulse Sensor Amped Arduino from pulse sensor/GitHub.
I did the modification (static boolean serialVisual = true;) but when I run the Serial Monitor at 115200 baud I have nothing showing up. If I change baud, then I have random value showing up.

In Processing, I have no signal evenย if the Arduino's port is recognized (I previously changed "static boolean serialVisual = true" back to false).

What am I doing wrong?
Thank you for your help!

screenshots:
flic.kr/p/NUyedW
flic.kr/p/NUyeeY

Error While Uploading

I followed the instructions and the code compiled without any errors but when uploading I got the following error.

Arduino: 1.8.1 (Mac OS X), Board: "Arduino/Genuino Uno"

Sketch uses 3630 bytes (11%) of program storage space. Maximum is 32256 bytes.
Global variables use 237 bytes (11%) of dynamic memory, leaving 1811 bytes for local variables. Maximum is 2048 bytes.
avrdude: ser_open(): can't open device "/dev/cu.usbmodemfa131": No such file or directory
Problem uploading to board. See http://www.arduino.cc/en/Guide/Troubleshooting#upload for suggestions.

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

Example code does not compile on either Arduino Zero or MKR1000

Hey guys,
I work on hobby projects mostly and got the Pulse sensor to do some biomedical hacks.
While the example works on the older Arduino's(Mega,UNO), The code throws a lot of errors with newer arduino's like Arduino Zero, MKR1000 or the Adafruit M0 feather.

Will you guys be porting the code to newer arduino's?
The sensor works great and would be awesome to work with this in the MKR1000's or the new arduino's.
I'm unfamiliar with interrupts and stuff so I couldn't get it working again, I would really appreciate any help!

Here is the compilation error


Interrupt:27: error: expected constructor, destructor, or type conversion before '(' token
 ISR(TIMER2_COMPA_vect){                         // triggered when Timer2 counts to 124
     ^
/Users/ravichandranv/Desktop/PulseSensor_Amped_Arduino-master/PulseSensorAmped_Arduino_1dot4/Interrupt.ino: In function 'void interruptSetup()':
Interrupt:17: error: 'TCCR2A' was not declared in this scope
   TCCR2A = 0x02;     // DISABLE PWM ON DIGITAL PINS 3 AND 11, AND GO INTO CTC MODE
   ^
Interrupt:18: error: 'TCCR2B' was not declared in this scope
   TCCR2B = 0x06;     // DON'T FORCE COMPARE, 256 PRESCALER 
   ^
Interrupt:19: error: 'OCR2A' was not declared in this scope
   OCR2A = 0X7C;      // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE
   ^
Interrupt:20: error: 'TIMSK2' was not declared in this scope
   TIMSK2 = 0x02;     // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A
   ^
Interrupt:21: error: 'sei' was not declared in this scope
   sei();             // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED      
       ^
/Users/ravichandranv/Desktop/PulseSensor_Amped_Arduino-master/PulseSensorAmped_Arduino_1dot4/Interrupt.ino: At global scope:
Interrupt:27: error: expected constructor, destructor, or type conversion before '(' token
 ISR(TIMER2_COMPA_vect){                         // triggered when Timer2 counts to 124
    ^
exit status 1
expected constructor, destructor, or type conversion before '(' token

Timer0 instead of Timer2

Hello,
Can someone help me out in implementing the interrupt on Timer0 instead of Timer1 or Timer2.

I have a WiFi module connected to pins 9,10,11 of the Arduino Nano. These pins are fixed on myt PCB and cannot be replaced.

So I am unable to use the WiFi module if I use Timer1 or Timer2 as my WiFi does not work. The WiFi module will send the pulse (BPM) to the cloud.

Can anyone help me out in implementing Timer0 for the code? I do not mind compromising on delay().

Dual Sensor Processing

So, I am trying to use 2 sensors at the same time for an application...one pulse sensor on your ear, one on your finger. I am curious if anyone knows how to produce 2 different serial outputs from the two sensor inputs...one for each...and display them in the visualizer.

I imagine the Mega (which is what I have) will permit this, but I'm new and thought that this "easy" task would be...it has not been.

Any thoughts?

'TCCR2A' was not declared in this scope

When trying to compile the code for the first time. I am receiving
the error below.

Interrupt.ino: In function 'void interruptSetup()':
Interrupt:17: error: 'TCCR2A' was not declared in this scope
Interrupt:18: error: 'TCCR2B' was not declared in this scope
Interrupt:19: error: 'OCR2A' was not declared in this scope
Interrupt:20: error: 'TIMSK2' was not declared in this scope
Interrupt.ino: At global scope:
Interrupt:27: error: expected constructor, destructor, or type conversion before '(' token
'TCCR2A' was not declared in this scope

my pulse isnt stable 200 bpm more

Ask, why my pulse up and down
isnt stable again
my code

include <LiquidCrystal_I2C.h>

/* Pulse Sensor Amped 1.4 by Joel Murphy and Yury Gitman http://www.pulsesensor.com
---------------------- Notes ---------------------- ----------------------
This code:

  1. Blinks an LED to User's Live Heartbeat PIN 13
  2. Fades an LED to User's Live HeartBeat
  3. Determines BPM
  4. Prints All of the Above to Serial
    Read Me:
    https://github.com/WorldFamousElectronics/PulseSensor_Amped_Arduino/blob/master/README.md
    Updated with HRV display by Elliot Mebane, Roguish, Inc. Feb 2016
    HRV requires 1 minute of data before it's accurate.

*/
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Variables
int pulsePin = 0; // Pulse Sensor purple wire connected to analog pin 0
int blinkPin = 13; // pin to blink led at each beat
int fadePin = 5; // pin to do fancy classy fading blink at each beat
int fadeRate = 0; // used to fade LED on with PWM on fadePin

// Volatile Variables, used in the interrupt service routine!
volatile int BPM; // int that holds raw Analog in 0. updated every 2mS
volatile int Signal; // holds the incoming raw data
volatile int IBI = 600; // int that holds the time interval between beats! Must be seeded!
volatile boolean Pulse = false; // "True" when User's live heartbeat is detected. "False" when not a "live beat".
volatile boolean QS = false; // becomes true when Arduoino finds a beat.

volatile int RRDelta = 0;
volatile double RMSSD = 0;
volatile double LN20RMSSD = 0;
volatile double SDNN = 0;
volatile double SDSD = 0;
volatile double NN50 = 0;
volatile double PNN50 = 0;

// Regards Serial OutPut -- Set This Up to your needs
static boolean serialVisual = false; // Set to 'false' by Default. Re-set to 'true' to see Arduino Serial Monitor ASCII Visual Pulse

void setup(){
pinMode(blinkPin,OUTPUT); // pin that will blink to your heartbeat!
pinMode(fadePin,OUTPUT); // pin that will fade to your heartbeat!
Serial.begin(115200); // we agree to talk fast!
interruptSetup(); // sets up to read Pulse Sensor signal every 2mS
lcd.begin();
// IF YOU ARE POWERING The Pulse Sensor AT VOLTAGE LESS THAN THE BOARD VOLTAGE,
// UN-COMMENT THE NEXT LINE AND APPLY THAT VOLTAGE TO THE A-REF PIN
// analogReference(EXTERNAL);
}

// Where the Magic Happens
void loop(){

serialOutput() ;       

if (QS == true){ // A Heartbeat Was Found
// BPM and IBI have been Determined
// Quantified Self "QS" true when arduino finds a heartbeat
fadeRate = 255; // Makes the LED Fade Effect Happen
// Set 'fadeRate' Variable to 255 to fade LED with pulse
serialOutputWhenBeatHappens(); // A Beat Happened, Output that to serial.
lcd.clear();
lcd.print(BPM);
QS = false; // reset the Quantified Self flag for next time
}

ledFadeToBeat(); // Makes the LED Fade Effect Happen
delay(20); // take a break
}

void ledFadeToBeat(){
fadeRate -= 15; // set LED fade value
fadeRate = constrain(fadeRate,0,255); // keep LED fade value from going into negative numbers!
analogWrite(fadePin,fadeRate); // fade LED
}

i use pulse + esp8266 in arduino uno

mac app output gibberish - no signal

Hi,
I just got an Arduino Uno and the pulse sensor. I downloaded the mac app too and followed all instructions. For some reason, the "serial monitor read-out" output of the pulse sensor mac app does not show anything, just some gibberish letters when I try 1) "static boolean serialVisual = true;", or 2) "static boolean serialVisual = false;".
screen shot 2015-07-14 at 2 38 27 pmjul 14 2015

Pulse sensor output question

Hi,
I have a question about the output, the serial monitor read-out window continuously outputs things (e.g. s502, s503, etc.), even when my finger is not in the pulse.

Should I only pay attention to the top bar that ranges from 50 to 140? Are the units BMP?

Also, I am wondering if I can run the visualization code for mac or is it specific to windows?

Thank you,

Sara

Heart rate sensor is working incorrectly

The sensor shows the BPM values โ€‹โ€‹without putting my finger on it but I put my finger on the sensor and the values โ€‹โ€‹are disappearing. Please help me this is my project homework and very little time left

Code from the future!?

From Timer_Interrupt_Notes.ino

  These notes put together by Joel Murphy for Pulse Sensor Amped, Winter 2015

Time travel? ๐Ÿ˜

my pulse detect 200 more bpm

can you help me why my pulse detect more value, i didnt touch sensor, and if i touch the bpm isnt stable, im confuse for that, im use 4.7k resistor and 10k resistor and 10mf 32v kapasitor for reduce the noise, it cant help anything -_-

Error in Compilation

Hi,
As one more person mentioned in another issue of the code, I am having the same error. I am using Arduino IDE to compile for Intel Galileo

Interrupt.ino: In function 'void interruptSetup()':
Interrupt.ino:17:3: error: 'TCCR2A' was not declared in this scope
Interrupt.ino:18:3: error: 'TCCR2B' was not declared in this scope
Interrupt.ino:19:3: error: 'OCR2A' was not declared in this scope
Interrupt.ino:20:3: error: 'TIMSK2' was not declared in this scope
Interrupt.ino:21:7: error: 'sei' was not declared in this scope
Interrupt.ino: At global scope:
Interrupt.ino:27:4: error: expected constructor, destructor, or type conversion before '(' token
Error compiling.

Anyone has any idea why we are getting this error?

arduino 101-->"quick and dirt solution"

The code modifications mentioned in the "Timer _Interrupt_Notes" tab is diplaying error when verifying code. Specifically the line with "getPulse()" instead of "ISR(TIMER2_COMPA_vect)". See attached image
getpulse_error

Error while trying to run default code from nodemcu Esp8266

Hello I am trying to run the default code provided in the tutorial in nodemcu v1 esp-12e.

github.com/WorldFamousElectronics/PulseSensor_Amped_Arduino

It runs in my arduino uno fine but when I try it with the nodemcu I get following error. Please help.

Read more: http://pulsesensor.proboards.com/thread/474/error-trying-default-code-nodemcu#ixzz4Rbo00iGf

`Interrupt:27: error: expected constructor, destructor, or type conversion before '(' token

ISR(TIMER2_COMPA_vect){ // triggered when Timer2 counts to 124

^

C:\Users\Zero\Documents\Arduino\PulseSensorAmped_Arduino_1dot4\Interrupt.ino: In function 'void interruptSetup()':

Interrupt:17: error: 'TCCR2A' was not declared in this scope

TCCR2A = 0x02; // DISABLE PWM ON DIGITAL PINS 3 AND 11, AND GO INTO CTC MODE

^

Interrupt:18: error: 'TCCR2B' was not declared in this scope

TCCR2B = 0x06; // DON'T FORCE COMPARE, 256 PRESCALER

^

Interrupt:19: error: 'OCR2A' was not declared in this scope

OCR2A = 0X7C; // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE

^

Interrupt:20: error: 'TIMSK2' was not declared in this scope

TIMSK2 = 0x02; // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A

^

C:\Users\Zero\Documents\Arduino\PulseSensorAmped_Arduino_1dot4\Interrupt.ino: At global scope:

Interrupt:27: error: expected constructor, destructor, or type conversion before '(' token

ISR(TIMER2_COMPA_vect){ // triggered when Timer2 counts to 124

^

exit status 1
expected constructor, destructor, or type conversion before '(' token

Read more: http://pulsesensor.proboards.com/thread/474/error-trying-default-code-nodemcu#ixzz4Rbo3ndv4`

Waveform Clipping at 1000

Hello Dear
I was stuck at clipped waveform as shown in attached figure,
issue

Waveform is keep clipping at 1000. If I change power to 3.3v from 5v, waveform is not having clear QRS region

incorrect Signal

Hi,
trying to get the right signal from the Sensor but i got follow Singal, How to Fix it ?:
image

In function 'void interruptSetup()': error

Arduino: 1.8.1 Board: "Arduino Due (Programming Port)"
In function 'void interruptSetup()':
error: 'TCCR2A' was not declared in this scope
TCCR2A = 0x02;
error: 'TCCR2B' was not declared in this scope
TCCR2B = 0x06;
error: 'OCR2A' was not declared in this scope
OCR2A = 0X7C;
error: 'TIMSK2' was not declared in this scope
TIMSK2 = 0x02;
error: 'sei' was not declared in this scope
sei();

In function 'void TIMER2_COMPA_vect()':
error: 'cli' was not declared in this scope
cli();
error: 'sei' was not declared in this scope
sei();

please help

Unable to send the value from Arduino to Processing

#define PROCESSING_VISUALIZER 1
#define SERIAL_PLOTTER 2

// Variables
int pulsePin = 0; // Pulse Sensor purple wire connected to analog pin 0
int blinkPin = 13; // pin to blink led at each beat
int fadePin = 5; // pin to do fancy classy fading blink at each beat
int fadeRate = 0; // used to fade LED on with PWM on fadePin

// Volatile Variables, used in the interrupt service routine!
volatile int BPM; // int that holds raw Analog in 0. updated every 2mS
volatile int Signal; // holds the incoming raw data
volatile int IBI = 600; // int that holds the time interval between beats! Must be seeded!
volatile boolean Pulse = false; // "True" when User's live heartbeat is detected. "False" when not a "live beat".
volatile boolean QS = false; // becomes true when Arduoino finds a beat.

// SET THE SERIAL OUTPUT TYPE TO YOUR NEEDS
// PROCESSING_VISUALIZER works with Pulse Sensor Processing Visualizer
// https://github.com/WorldFamousElectronics/PulseSensor_Amped_Processing_Visualizer
// SERIAL_PLOTTER outputs sensor data for viewing with the Arduino Serial Plotter
// run the Serial Plotter at 115200 baud: Tools/Serial Plotter or Command+L
//static int outputType = SERIAL_PLOTTER;
static int outputType = PROCESSING_VISUALIZER;
void setup(){
pinMode(blinkPin,OUTPUT); // pin that will blink to your heartbeat!
pinMode(fadePin,OUTPUT); // pin that will fade to your heartbeat!
Serial.begin(115200); // we agree to talk fast!
interruptSetup(); // sets up to read Pulse Sensor signal every 2mS
// IF YOU ARE POWERING The Pulse Sensor AT VOLTAGE LESS THAN THE BOARD VOLTAGE,
// UN-COMMENT THE NEXT LINE AND APPLY THAT VOLTAGE TO THE A-REF PIN
//analogReference(EXTERNAL);
}

// Where the Magic Happens
void loop(){

serialOutput() ;
if (QS == true){ // A Heartbeat Was Found
// BPM and IBI have been Determined
// Quantified Self "QS" true when arduino finds a heartbeat
fadeRate = 255; // Makes the LED Fade Effect Happen
// Set 'fadeRate' Variable to 255 to fade LED with pulse
serialOutputWhenBeatHappens(); // A Beat Happened, Output that to serial.
QS = false; // reset the Quantified Self flag for next time
}

ledFadeToBeat(); // Makes the LED Fade Effect Happen
delay(20); // take a break
}

void ledFadeToBeat(){
fadeRate -= 15; // set LED fade value
fadeRate = constrain(fadeRate,0,255); // keep LED fade value from going into negative numbers!
analogWrite(fadePin,fadeRate); // fade LED
}


//////////
///////// All Serial Handling Code,
///////// It's Changeable with the 'outputType' variable
///////// It's declared at start of code.
/////////

void serialOutput(){ // Decide How To Output Serial.
switch(outputType){
case PROCESSING_VISUALIZER:
sendDataToSerial('S', Signal); // goes to sendDataToSerial function
break;
case SERIAL_PLOTTER: // open the Arduino Serial Plotter to visualize these data
// Serial.print(BPM);
// Serial.print(",");
// Serial.print(IBI);
// Serial.print(",");
Serial.println(Signal);
break;
default:
break;
}

}

// Decides How To OutPut BPM and IBI Data
void serialOutputWhenBeatHappens(){
switch(outputType){
case PROCESSING_VISUALIZER: // find it here https://github.com/WorldFamousElectronics/PulseSensor_Amped_Processing_Visualizer
sendDataToSerial('B', BPM); // send heart rate with a 'B' prefix
sendDataToSerial('Q',IBI); // send time between beats with a 'Q' prefix
break;

default:
  break;

}
}

// Sends Data to Pulse Sensor Processing App, Native Mac App, or Third-party Serial Readers.
void sendDataToSerial(char symbol, int data ){
Serial.print(symbol);
Serial.println(data);
}


volatile int rate[10]; // array to hold last ten IBI values
volatile unsigned long sampleCounter = 0; // used to determine pulse timing
volatile unsigned long lastBeatTime = 0; // used to find IBI
volatile int P =512; // used to find peak in pulse wave, seeded
volatile int T = 512; // used to find trough in pulse wave, seeded
volatile int thresh = 530; // used to find instant moment of heart beat, seeded
volatile int amp = 0; // used to hold amplitude of pulse waveform, seeded
volatile boolean firstBeat = true; // used to seed rate array so we startup with reasonable BPM
volatile boolean secondBeat = false; // used to seed rate array so we startup with reasonable BPM

void interruptSetup(){ // CHECK OUT THE Timer_Interrupt_Notes TAB FOR MORE ON INTERRUPTS
// Initializes Timer2 to throw an interrupt every 2mS.
TCCR2A = 0x02; // DISABLE PWM ON DIGITAL PINS 3 AND 11, AND GO INTO CTC MODE
TCCR2B = 0x06; // DON'T FORCE COMPARE, 256 PRESCALER
OCR2A = 0X7C; // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE
TIMSK2 = 0x02; // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A
sei(); // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED
}

// THIS IS THE TIMER 2 INTERRUPT SERVICE ROUTINE.
// Timer 2 makes sure that we take a reading every 2 miliseconds
ISR(TIMER2_COMPA_vect){ // triggered when Timer2 counts to 124
cli(); // disable interrupts while we do this
Signal = analogRead(pulsePin); // read the Pulse Sensor
sampleCounter += 2; // keep track of the time in mS with this variable
int N = sampleCounter - lastBeatTime; // monitor the time since the last beat to avoid noise

//  find the peak and trough of the pulse wave

if(Signal < thresh && N > (IBI/5)*3){ // avoid dichrotic noise by waiting 3/5 of last IBI
if (Signal < T){ // T is the trough
T = Signal; // keep track of lowest point in pulse wave
}
}

if(Signal > thresh && Signal > P){ // thresh condition helps avoid noise
P = Signal; // P is the peak
} // keep track of highest point in pulse wave

// NOW IT'S TIME TO LOOK FOR THE HEART BEAT
// signal surges up in value every time there is a pulse
if (N > 250){ // avoid high frequency noise
if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ){
Pulse = true; // set the Pulse flag when we think there is a pulse
digitalWrite(blinkPin,HIGH); // turn on pin 13 LED
IBI = sampleCounter - lastBeatTime; // measure time between beats in mS
lastBeatTime = sampleCounter; // keep track of time for next pulse

  if(secondBeat){                        // if this is the second beat, if secondBeat == TRUE
    secondBeat = false;                  // clear secondBeat flag
    for(int i=0; i<=9; i++){             // seed the running total to get a realisitic BPM at startup
      rate[i] = IBI;
    }
  }

  if(firstBeat){                         // if it's the first time we found a beat, if firstBeat == TRUE
    firstBeat = false;                   // clear firstBeat flag
    secondBeat = true;                   // set the second beat flag
    sei();                               // enable interrupts again
    return;                              // IBI value is unreliable so discard it
  }


  // keep a running total of the last 10 IBI values
  word runningTotal = 0;                  // clear the runningTotal variable

  for(int i=0; i<=8; i++){                // shift data in the rate array
    rate[i] = rate[i+1];                  // and drop the oldest IBI value
    runningTotal += rate[i];              // add up the 9 oldest IBI values
  }

  rate[9] = IBI;                          // add the latest IBI to the rate array
  runningTotal += rate[9];                // add the latest IBI to runningTotal
  runningTotal /= 10;                     // average the last 10 IBI values
  BPM = 60000/runningTotal;               // how many beats can fit into a minute? that's BPM!
  QS = true;                              // set Quantified Self flag
  // QS FLAG IS NOT CLEARED INSIDE THIS ISR
}

}

if (Signal < thresh && Pulse == true){ // when the values are going down, the beat is over
digitalWrite(blinkPin,LOW); // turn off pin 13 LED
Pulse = false; // reset the Pulse flag so we can do it again
amp = P - T; // get amplitude of the pulse wave
thresh = amp/2 + T; // set thresh at 50% of the amplitude
P = thresh; // reset these for next time
T = thresh;
}

if (N > 2500){ // if 2.5 seconds go by without a beat
thresh = 530; // set thresh default
P = 512; // set P default
T = 512; // set T default
lastBeatTime = sampleCounter; // bring the lastBeatTime up to date
firstBeat = true; // set these to avoid noise
secondBeat = false; // when we get the heartbeat back
}

sei(); // enable interrupts when youre done!
}// end isr


capture

This is the image use with the command "static int outputType = SERIAL_PLOTTER;". It seems fine but when used with "static int outputType = PROCESSING_VISUALIZER;" onto the Visualizer. I don't get a response. Here's the image:

image

Random digits.(Fixed)

untitled
this is how it looks, just using the code on this forum and plugges my sensor in the arduino and uploaded the code om my Arduino anyone know why this happnes some help would be nice.

ps Thanks in advance

BLE Nano compatibility

I am using BLE Nano, which has Nordic nRF51822 (an ARM Cortex-M0 SoC plus BLE capability) inside, also, BLE Nano supports Arduino IDE. Does this code compatible with it?

For now code produces next errors:

Arduino: 1.6.5 (Mac OS X), Board: "BLE Nano (32K RAM)"

heartBeats.ino: In function 'void setup()':
heartBeats:39: error: expected unqualified-id before '.' token
heartBeats:40: error: expected primary-expression before ')' token
heartBeats:45: error: expected unqualified-id before '.' token
heartBeats.ino: In function 'void hearSensorSetup()':
heartBeats:80: error: expected unqualified-id before '.' token
AllSerialHandling.ino: In function 'void serialOutputWhenBeatHappens()':
AllSerialHandling:20: error: expected unqualified-id before '.' token
AllSerialHandling:21: error: expected unqualified-id before '.' token
AllSerialHandling:22: error: expected unqualified-id before '.' token
AllSerialHandling:23: error: expected unqualified-id before '.' token
AllSerialHandling.ino: In function 'void sendDataToSerial(char, int)':
AllSerialHandling:34: error: expected unqualified-id before '.' token
AllSerialHandling:36: error: expected unqualified-id before '.' token
AllSerialHandling.ino: In function 'void arduinoSerialMonitorVisual(char, int)':
AllSerialHandling:63: error: expected unqualified-id before '.' token
AllSerialHandling:66: error: expected unqualified-id before '.' token
AllSerialHandling:69: error: expected unqualified-id before '.' token
AllSerialHandling:72: error: expected unqualified-id before '.' token
AllSerialHandling:75: error: expected unqualified-id before '.' token
AllSerialHandling:78: error: expected unqualified-id before '.' token
AllSerialHandling:81: error: expected unqualified-id before '.' token
AllSerialHandling:84: error: expected unqualified-id before '.' token
AllSerialHandling:87: error: expected unqualified-id before '.' token
AllSerialHandling:90: error: expected unqualified-id before '.' token
AllSerialHandling:93: error: expected unqualified-id before '.' token
AllSerialHandling:96: error: expected unqualified-id before '.' token
Interrupt.ino: In function 'void interruptSetup()':
Interrupt:17: error: 'TCCR1A' was not declared in this scope
Interrupt:18: error: 'TCCR1B' was not declared in this scope
Interrupt:19: error: 'OCR1A' was not declared in this scope
Interrupt:20: error: 'TIMSK1' was not declared in this scope
Interrupt:21: error: 'sei' was not declared in this scope
Interrupt.ino: At global scope:
Interrupt:33: error: expected constructor, destructor, or type conversion before '(' token
expected unqualified-id before '.' token

How can I configure interruptSetup for this processor?

Pulse sensor didn't work correctly

My pulse sensor didn't work correctly (problem can be seen in my picture)
untitled
I have deleted a tab name Timer_Interrupt_Notes because if i keep this tab, Arduino IDE won't run
All code is the same with your example code.
I hope you can help me.

BPM greater than 200 without touching the sensor

Hi guys,

I have purchased original pulse sensor from sparkfun and uploaded the code as it is on my Arduino Uno board. But the sensor gives me erroneous readings eg. BPM > 200 without even touching the sensor. On touching the reading is fine 50% of the time but erroneous values are frustrating. I have been pulling my hair for past week or so due to this issue. Any help will be really appreciated. Please respond ASAP.

Inconsistent BPM readings

I've changed the code to output only the bpm with the directions that were posted on a prior post and the readings are very inconsistent. It's clear that the sensor has not been working properly because even with the unaltered code, the light I have hooked up blinks very randomly. Might I have a faulty sensor?
screen shot 2017-03-01 at 5 17 12 pm

Can u please fix this problem in coding of pulse sensorr

When i am running the code iam getting no output in processing visualizer it showing a single wave continusely going but giving pulse 0 and bpm 0
And i tried serial plotter too by changing the output type in main but it showing the waves going on even i removed my finger
Plz anyone help me..

compiling issue

We cannot seem to compile the code onto our Micro Blend Arduino board
( http://redbearlab.com/blendmicro/ )

We have correctly wired the board to the pulse sensor and the board compiles other files perfectly fine.

This is the stack trace:
Exception in thread "Thread-214" java.lang.StackOverflowError
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3782)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3782)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$Neg.match(Pattern.java:4609)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)

Java stackoverflow errors on Ubuntu

Exception in thread "Thread-2" java.lang.StackOverflowError
at java.util.regex.Pattern$CharProperty.match(Pattern.java:3775)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4250)
at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
at java.util.regex.Pattern$Neg.match(Pattern.java:5097)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3798)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
at java.util.regex.Pattern$Loop.match(Pattern.java:4785)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4279)
at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
at java.util.regex.Pattern$Neg.match(Pattern.java:5097)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3798

SPO2 data

How can I find out the oxygen level? The device can do this already, but the information is not public.

Node.js implementation

Hey,

I have written javascript code using the the same algorithm so that the pulse sensor can be used with node.js. However I am getting inaccurate values for BPM. What might the issue be?

var rate = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],    
      sampleCounter = 0, 
      lastBeatTime = 0,  
      P = 512,               
      T = 512,                  
      thresh = 525,          
      amp = 100,              
      firstBeat = true,       
      secondBeat = false,
      IBI = 600,
      Pulse = false,
      BPM,
      Signal,
      QS = false;

var five = require('johnny-five'),
      board, sensor;
board = new five.Board();

board.on('ready', function() {
    sensor = new five.Sensor({
                pin: "A0",
                freq: 2
            });        

            sensor.scale([0,1024]).on('read', function() {
                  Signal = this.scaled;
                  calculate_bpm();

                if(QS === true) {
                    console.log('BPM : ', BPM); 
                    QS = false;
        } 
            });                    
});

function calculate_bpm() {

            sampleCounter += 2;                           
            N = sampleCounter - lastBeatTime;       

            if(Signal < thresh && N > (IBI/5)*3) {       
                  if (Signal < T) {                        
                        T = Signal;                  
                  }
            }

            if(Signal > thresh && Signal > P) {          
                  P = Signal;                             
            }                                       


            if (N > 250) {   

              if ((Signal > thresh) && (Pulse === false) && (N > (IBI/5)*3)) {        
                  Pulse = true;                               
                  IBI = sampleCounter - lastBeatTime;         
                  lastBeatTime = sampleCounter;               

                  if(secondBeat) {                        
                      secondBeat = false;                  
                      for(var i=0; i<=9; i++){             
                          rate[i] = IBI;                      
                      }
                  }

                  if(firstBeat) {                         
                      firstBeat = false;               
                      secondBeat = true;      
                      return;                              
                  }   


                  var runningTotal = 0;                 

                  for(var i=0; i<=8; i++) {              
                      rate[i] = rate[i+1];                  
                      runningTotal += rate[i];         
                  }

                  rate[9] = IBI;                          
                  runningTotal += rate[9];        
                  runningTotal /= 10;               
                  BPM = 60000/runningTotal; 
                  QS = true;                            
              }                       
          }

          if (Signal < thresh && Pulse === true){   
              Pulse = false;                         
              amp = P - T;                           
              thresh = amp/2 + T;               
              P = thresh;                            
              T = thresh;
          }

          if (N > 2500) {                           
              thresh = 512;                        
              P = 512;                               
              T = 512;                               
              lastBeatTime = sampleCounter;         
              firstBeat = true;                      
              secondBeat = false;               
          }
} 

Error compiling on RFduino RFD22102

Hello all,

I'm very new to arduino work and am trying to setup the pulse sensor on an RFduino using the example code base without modification. I'm not finding obvious hints to interrupt timer code for this hardware;

16MHz ARM Cortex-M0, 18mA, 4uA ULP

Guidance would be greatly appreciated!

Error
Arduino: 1.8.1 (Mac OS X), Board: "RFduino"

Compiling sketch...

Interrupt:29: error: expected constructor, destructor, or type conversion before '(' token
ISR(TIMER2_COMPA_vect){ // triggered when Timer2 counts to 124
^
/Users/sarahhuffman/Documents/Arduino/PulseSensor_Amped_Arduino-master/PulseSensorAmped_Arduino_1.5.0/Interrupt.ino: In function 'void interruptSetup()':
Interrupt:18: error: 'TCCR2A' was not declared in this scope
TCCR2A = 0x02; // DISABLE PWM ON DIGITAL PINS 3 AND 11, AND GO INTO CTC MODE
^
Interrupt:19: error: 'TCCR2B' was not declared in this scope
TCCR2B = 0x06; // DON'T FORCE COMPARE, 256 PRESCALER
^
Interrupt:20: error: 'OCR2A' was not declared in this scope
OCR2A = 0X7C; // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE
^
Interrupt:21: error: 'TIMSK2' was not declared in this scope
TIMSK2 = 0x02; // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A
^
Interrupt:22: error: 'sei' was not declared in this scope
sei(); // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED
^
/Users/me/Documents/Arduino/PulseSensor_Amped_Arduino-master/PulseSensorAmped_Arduino_1.5.0/Interrupt.ino: At global scope:
Interrupt:29: error: expected constructor, destructor, or type conversion before '(' token
ISR(TIMER2_COMPA_vect){ // triggered when Timer2 counts to 124
^
exit status 1
expected constructor, destructor, or type conversion before '(' token

sensor not working properly

Guys, i got the problem about this project. My sensor not working properly. raw data doesn't same with Startedproject, i was change my finger position, but the graph still not drawn like the project.
screenshot_1

I use arduino nano Clone with CH340 driver

Invalid library

Invalid library found in C:\Program Files (x86)\Arduino\libraries\processing: Missing 'author' from library

how to fix this ?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.