所以,我是 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,然后是传感器读数。发布后,它再次重复此过程。
再次对给您带来的不便表示歉意,并感谢您的帮助。
我使用了传感器文档博客中的直接代码(链接页面的页面底部):
#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();
}