求助,关于配合中断子程序的问题。加了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;
}
}
}
之后就报错了,说有几个东西我没有声明,但是原来代码就这样啊。。。想不懂了,求大大们指点迷津
把自定义函数放在loop的外面试试,你好像放在了if的里面 janeasy 发表于 2016-4-4 19:30 static/image/common/back.gif
把自定义函数放在loop的外面试试,你好像放在了if的里面
嗯嗯,是的,刚才我也请教了我的同学,谢啦,之后又出现了一些问题 本帖最后由 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
}
我也是新手。也在学习。希望能帮到你。 以下是调试以后成功的代码,
实现的功能:当霍尔传感器没有触发时,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]