alpacapie 发表于 2016-4-4 11:54:27

求助,关于配合中断子程序的问题。加了if else 函数以后出现没有声明

本帖最后由 alpacapie 于 2016-4-18 21:24 编辑

【下边有正确代码】在下是个初学者,是这样的,我买了一个心率传感器,店家给的文件里有两个代码,打开其中一个会同时打开这两个【鹦鹉学舌一下,另一个文件叫中断子程序,不懂啊】如图


原本的代码是这样的
//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


// 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, must be seeded!
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
   // UN-COMMENT THE NEXT LINE IF YOU ARE POWERING The Pulse Sensor AT LOW VOLTAGE,
   // AND APPLY THAT VOLTAGE TO THE A-REF PIN
   //analogReference(EXTERNAL);   
}



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();

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
}


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
}
    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
}






第二个是这样的(看说明叫中断子程序)



volatile int rate;                  // 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 = 512;                // 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 = 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 = rate;                  // and drop the oldest IBI value
      runningTotal += rate;            // add up the 9 oldest IBI values
      }

      rate = IBI;                        // add the latest IBI to the rate array
      runningTotal += rate;                // 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




我想在中间加一个霍尔传感器,就是,如果霍尔传感器触发了,就按照以上程序执行(即小灯随着模拟信号闪亮同时电机也会随着心跳振动),如果霍尔开关没有被触发,小灯泡进行一个呼吸灯的过程
我改完的代码如下

//VARIABLES
int pulsePin =A1;               // 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 hallPin= 7;                  //霍尔数字引脚
int motorPin = 6;                   //电机振动引脚
int fadeRate = 0;               // used to fade LED on with PWM on fadePin
int breathingPin=A3;               //呼吸灯引脚
int x = 0;
int y = 5;   



// 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, must be seeded!
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(hallPin,INPUT);
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!
   pinMode(A1, OUTPUT);      //呼吸灯模式引脚
interruptSetup();               // sets up to read Pulse Sensor signal every 2mS
   // UN-COMMENT THE NEXT LINE IF YOU ARE POWERING The Pulse Sensor AT LOW VOLTAGE,
   // AND APPLY THAT VOLTAGE TO THE A-REF PIN
   //analogReference(EXTERNAL);   
}

void loop(){
if (digitalRead(hallPin)==HIGH){
    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();

delay(20);                           //take a break以上过程是数字输出LED闪烁,不能删



void ledFadeToBeat(){
    fadeRate -= 15;                         //set LED fade value
    fadeRate = constrain(fadeRate,0,255);   //keep LED fade value from going into negative numbers!
    analogWrite(motorPin,fadeRate);      //电机振动信号
    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
}
}
else (digitalRead(hallPin)==LOW)
{
   analogWrite(breathingPin, x);
   x = x + y;
   delay(30);   
   if (x==0 || x==255)
   {
      y=-y;
   }            



}
}

之后就报错了,说有几个东西我没有声明,但是原来代码就这样啊。。。想不懂了,求大大们指点迷津

janeasy 发表于 2016-4-4 19:30:32

把自定义函数放在loop的外面试试,你好像放在了if的里面

alpacapie 发表于 2016-4-4 20:11:14

janeasy 发表于 2016-4-4 19:30 static/image/common/back.gif
把自定义函数放在loop的外面试试,你好像放在了if的里面

嗯嗯,是的,刚才我也请教了我的同学,谢啦,之后又出现了一些问题

li23108 发表于 2016-4-7 10:13:49

本帖最后由 li23108 于 2016-4-7 10:25 编辑

这里错的太多了。大括号范围,ifelse反了。


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
}
}
else (digitalRead(hallPin)==LOW)
{
   analogWrite(breathingPin, x);
   x = x + y;
   delay(30);   
   if (x==0 || x==255)
   {
      y=-y;
   }            



}
}


你看看这样
void sendDataToProcessing(char symbol, int data ){
        Serial.print(symbol);
        Serial.println(data);
       
        if (digitalRead(hallPin)==LOW){
                analogWrite(breathingPin, x);
                x = x + y;
                delay(30);
                }//if end
      else(x==0 || x==255){
                x=-y;//应该是x-y吧?y-y 是做什么呢?
                }//else end            
}


我也是新手。也在学习。希望能帮到你。

alpacapie 发表于 2016-4-18 21:23:03

以下是调试以后成功的代码,
实现的功能:当霍尔传感器没有触发时,A3小灯泡呼吸灯闪烁
当霍尔传感器触发时5引脚小灯泡随脉搏跳动同时振动电机随心跳振动
//VARIABLES
int pulsePin = A1;               // 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 hallPin= 7;
int fadeRate = 0;               // used to fade LED on with PWM on fadePin
int motorPin = 6;
int breathingPin= A3;
int x = 0;
int y = 5;
// 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, must be seeded!
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(hallPin,INPUT);
pinMode(blinkPin,OUTPUT);         // pin that will blink to your heartbeat!
pinMode(fadePin,OUTPUT);
   pinMode(motorPin,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
   // UN-COMMENT THE NEXT LINE IF YOU ARE POWERING The Pulse Sensor AT LOW VOLTAGE,
   // AND APPLY THAT VOLTAGE TO THE A-REF PIN
   //analogReference(EXTERNAL);   
}



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   
   }
   if (digitalRead(hallPin)==HIGH){
analogWrite(breathingPin,0);
ledFadeToBeat();
   }
   else if(digitalRead(hallPin)==LOW){
analogWrite(motorPin,0);
   analogWrite(breathingPin, x);
   x = x + y;
   delay(30);   
   if (x==0 || x==255) {
      y=-y;
}
}
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(motorPin,fadeRate);
    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
}






页: [1]
查看完整版本: 求助,关于配合中断子程序的问题。加了if else 函数以后出现没有声明