Ошибка при компиляции кода

YAp
Offline
Зарегистрирован: 29.04.2016

Решил подключить пульсометр к ардуино нано, скачал с сайта пульсометра код для ардуино. при компилировании выдает ошибку :

 Exception in thread "Thread-6" java.lang.StackOverflowError
 at java.util.regex.Pattern$Loop.match(Pattern.java:4275)
 at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
 ​

и еще кучу строк дальше.
 ​Кто пробовал этот код ? У кого работает? Кто может подсказать что к чему?

ssergo
Offline
Зарегистрирован: 10.05.2013

ссылку на пульсомер, ссылку на код, версия ардуино иде.

как вариант,  код написан для старой версии ардуино иде. 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Blink запускается?

YAp
Offline
Зарегистрирован: 29.04.2016

ссылка на пульсометр:

http://pulsesensor.com/products/pulse-sensor-amped​

ссылка на код с иофф сайта:

https://github.com/WorldFamousElectronics/PulseSensor_Amped_Arduino​

У меня Arduino nano

YAp
Offline
Зарегистрирован: 29.04.2016

Я не знаю что это ><
​Я новичек

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

YAp пишет:

Я не знаю что это ><
​Я новичек

Этот код работает?

void setup() {
   pinMode(13, OUTPUT);
}
void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
}

 

ssergo
Offline
Зарегистрирован: 10.05.2013

Вы очень удачно ответили о версии среды разработки - nano.... улыбнуло

на картинке с гитхаба отчетливо видно, что IDE ардуинки 1.0.6

https://github.com/WorldFamousElectronics/PulseSensor_Amped_Arduino/blob/master/pics/ScreenCapArduino.png

Т.е. в среде 1.6.8 - доступной сейчас для скачивания код компилироваться не будет.

Или ставьте старую среду или вдумчиво вникая в код библиотеки осчастливте нас новой версией библиотек для пульсомера с учетом современной версии.

Удачи.

 

YAp
Offline
Зарегистрирован: 29.04.2016

Да работает. Я разобрался немного, нашел новый код, вроде бы показывает кое как пульс и мне теперь нужно свой экранчик подключить еще к плате. У экрана порты GND VDD SCK SDA RES DS CS . К каким портам на плате чтоб соответствовало коду нужно будет подключить можешь подсказать?
​Вот новый код:


#include <LiquidCrystal.h>

//  VARIABLES
volatile int rate[10];                    // used to hold last ten IBI values
volatile unsigned long sampleCounter = 0;          // used to determine pulse timing
volatile unsigned long lastBeatTime = 0;           // used to find the inter beat interval
volatile int P =512;                      // used to find peak in pulse wave
volatile int T = 512;                     // used to find trough in pulse wave
volatile int thresh = 512;                // used to find instant moment of heart beat
volatile int amp = 100;                   // used to hold amplitude of pulse waveform
volatile boolean firstBeat = true;        // used to seed rate array so we startup with reasonable BPM
volatile boolean secondBeat = true;       // 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      
} 

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
int test = 1;


// these variables are volatile because they are used during the interrupt service routine!
volatile int BPM;                   // used to hold the pulse rate
volatile int Signal;                // holds the incoming raw data
volatile int IBI = 600;             // holds the time between beats, the Inter-Beat Interval
volatile boolean Pulse = false;     // true when pulse wave is high, false when it's low
volatile boolean QS = false;        // becomes true when Arduoino finds a beat.

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 
   
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // RS , E , D4 , D5 , D6 , D7
lcd.begin(16,2);// initialize lcd on 16 bit 2 row display
lcd.setCursor(3,0);//set lcd cursor at col.3 row 1
lcd.print("Heart Rate");//display heart rate
lcd.setCursor(5,1);
lcd.print("Monitor");
delay(3000);//wait for 3 sec
lcd.clear();
lcd.setCursor(0,0);
lcd.print("BPM = ");

}
// 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(firstBeat){                         // if it's the first time we found a beat, if firstBeat == TRUE
             firstBeat = false;                 // clear firstBeat flag
             return;                            // IBI value is unreliable so discard it
            }   
         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;                      
                    }
            }
          
    // 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 = true;                     // when we get the heartbeat back
     }
  
  sei();                                     // enable interrupts when youre done!
}// end isr



void displayBPM(){

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
lcd.begin(16,2);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("BPM = ");
lcd.setCursor(7,0);
lcd.print(BPM);}


void loop(){
  sendDataToProcessing('S', Signal);     // send Processing the raw Pulse Sensor data
  if (QS == true){                       // Quantified Self flag is true when arduino finds a heartbeat
        fadeRate = 255;                  // Set 'fadeRate' Variable to 255 to fade LED with pulse
        sendDataToProcessing('B',BPM);   // send heart rate with a 'B' prefix
        sendDataToProcessing('Q',IBI);   // send time between beats with a 'Q' prefix
        QS = false;                      // reset the Quantified Self flag for next time    
     }

  
  ledFadeToBeat();
  displayBPM();
  
  delay(500);                             //  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
    
  }


void sendDataToProcessing(char symbol, int data ){
    Serial.print(symbol);                // symbol prefix tells Processing what type of data is coming
    Serial.println(data);                // the data to send culminating in a carriage return
    
  }

 

YAp
Offline
Зарегистрирован: 29.04.2016

Я разобрался немного, нашел новый код, вроде бы показывает кое как пульс и мне теперь нужно свой экранчик подключить еще к плате. У экрана порты GND VDD SCK SDA RES DS CS . К каким портам на плате чтоб соответствовало коду нужно будет подключить можешь подсказать? Я скинул новый код чуть выше