0

所以,我是 Arduino 的业余程序员,之前从未使用过 Arduino MKR1000。我使用了 Arduino Uno 并编写了附加代码,该代码使用 Grove Ear 夹式心跳传感器和 Grove 温度传感器检测心跳和温度,然后每 20 秒在控制台中打印一次。以前,这段代码是为了在 Grove OLED 屏幕上显示而编写的,但后来通过仅在控制台上阅读将其简化为使用它。

由于我的项目的可穿戴性,我不得不改用 MKR1000。我知道 MKR1000 使用相同的 Arduino 代码,并且应该以与我的 Arduino Uno 相同的方式工作,但我在使用具有相同代码的 MKR1000 时遇到了一些问题。

问题是代码只运行一次然后停止。虽然我知道 for 循环以及它在一定程度上是如何工作的,但我找不到确切的问题为什么它停止循环而不是不断地获取数据并将其发布到控制台上,就像以前对我的 Uno 所做的那样。

请注意,以下是我的代码对 Arduino Uno 的反应:

控制台中的结果显示:

  Please be ready
  This will now begin

然后它每秒打印数字 1 到 20,然后是传感器读数。发布后,它再次重复此过程。

再次对给您带来的不便表示歉意,并感谢您的帮助。

我使用了传感器文档博客中的直接代码(链接页面的页面底部):

Grove 心形熊传感器

格罗夫温度传感器

#define LED 4//indicator, Grove - LED is connected with D4 of Arduino
boolean led_state = LOW;//state of LED, each time an external interrupt
                                //will change the state of LED
float tempa;
int tempPin = 0;
unsigned char counter;
unsigned long temp[21];
unsigned long sub;
bool data_effect=true;
unsigned int heart_rate;//the measurement result of heart rate

const int max_heartpluse_duty = 2000;//you can change it follow your system's request.
                        //2000 meams 2 seconds. System return error
                        //if the duty overtrip 2 second.
void setup()
{

    pinMode(LED, OUTPUT);
    Serial.begin(9600);
 while (!Serial){
  ;
  }
    Serial.println("Please be ready");
    delay(5000);
    arrayInit();
    Serial.println("This will now begin.");
    attachInterrupt(0, interrupt, RISING);//set interrupt 0,digital port 2
}
void loop()
{
    digitalWrite(LED, led_state);//Update the state of the indicator
}
/*Function: calculate the heart rate*/


void sum()
{
 if(data_effect)
    {
        heart_rate=1200000/(temp[20]-temp[0]);//60*20*1000/20_total_time
        Serial.print("Heart_rate_is:\t");
        Serial.println(heart_rate);
        tempa = analogRead(tempPin);
        tempa = tempa * 0.11;
         Serial.print("Body Temperature = ");
         Serial.print(tempa);
         Serial.print("*C");
         Serial.println();
         delay(1000);
    }
   data_effect=1;//sign bit
}
/*Function: Interrupt service routine.Get the sigal from the external interrupt*/
void interrupt()
{
    temp[counter]=millis();
    Serial.println(counter,DEC);
    switch(counter)
    {
        case 0:
            sub=temp[counter]-temp[20];

            break;
        default:
            sub=temp[counter]-temp[counter-1];

            break;
    }
    if(sub>max_heartpluse_duty)//set 2 seconds as max heart pluse duty
    {
        data_effect=0;//sign bit
        counter=0;
        Serial.println("measurement error,test will restart!" );
        arrayInit();
    }
    else if (counter==20&&data_effect)
    {
      counter=0;
      sum();
    }
    else if(counter!=20&&data_effect)
    {
    counter++;
    }
    else
    {
        counter=0;
        data_effect=1;
    }

}
/*Function: Initialization for the array(temp)*/
void arrayInit()
{
    for(unsigned char i=0;i < 20;i ++)
    {
        temp[i]=0;
    }
    temp[20]=millis();
}
4

1 回答 1

0

你的问题是中断引脚。在 Arduino UNO 上,数字引脚 D2 是中断引脚 0,正如您在代码中所做的那样。在 Arduino MKR1000 上,中断引脚与物理引脚号相同,因此如果您连接到引脚 2,请更改attachInterrupt(0, interrupt, RISING);attachInterrupt(2, interrupt, RISING);

如果您想确保使用正确的引脚,您可以使用digitalPinToInterrupt(pin)它在任何 Arduino 板上获取正确的中断号。像这样attachInterrupt(digitalPinToInterrupt(pin), interrupt, RISING);,其中 pin 是物理 pin 号。

信息

在 Arduino MKR1000 上,您可以使用引脚 0、1、4、5、6、7、8、9、A1 和 A2 作为中断

于 2017-03-30T15:49:26.420 回答