调试在 Arduino MKR1000上运行的 Arduino Uno 代码
Debugging Arduino Uno code running on Arduino MKR1000
所以,我是Arduino的业余程序员,以前从未使用过Arduino MKR1000。我使用了Arduino Uno,并编写了附加的代码,该代码使用Grove耳夹心跳传感器和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();
}
您的问题是中断引脚。在Arduino UNO上,数字引脚D2是中断引脚0,就像您在代码中所做的那样。在Arduino MKR1000上,中断引脚与物理引脚编号相同,因此,如果要连接到引脚2,请将attachInterrupt(0, interrupt, RISING);
更改为attachInterrupt(2, interrupt, RISING);
如果您想确保使用正确的引脚,您可以使用digitalPinToInterrupt(pin)
在任何Arduino板上获得正确的中断号。像这样attachInterrupt(digitalPinToInterrupt(pin), interrupt, RISING);
引脚是物理引脚编号。
信息
在 Arduino MKR1000 上,您可以使用引脚 0、1、4、5、6、7、8、9、A1 和 A2 作为中断
- 键盘不起作用 - Arduino Uno - 与变量有关的多个错误
- Arduino UNO+SIM800L-向服务器发送数据
- 转换字符时Arduino DUE 和 Arduino UNO 之间的区别
- Arduino Uno - serial.read to a struct of bits
- 当您希望在Arduino Uno编程中同时执行不同函数时,使用什么代码/语句
- C++从 'const char*' 到 'char*' Arduino Uno 的无效转换
- 在 Arduino Uno 与以太网防护板中使用 Firebase Arduino 库时出现错误"#include <string> while compiling"
- Arduino Uno 串行监视器不会打印整个输出;如何解决?
- Arduino Uno POST 数据使用 ENC28J60.
- 对于初学者来说,我应该学习" c or c++ "之间的哪一个才能使用Arduino UNO?
- 我如何仅使用一个Arduino uno才能在同一时间和同一方向上旋转两个步进电动机
- 调试在 Arduino MKR1000上运行的 Arduino Uno 代码
- 如何在 C++ Arduino Uno 中暂停空白
- Arduino Uno代码可以使用交叉编译器在BeagleBone Black上运行吗
- 打开Unix,Linux系统呼叫许可,拒绝Arduino Uno
- Arduino UNO error
- 为什么free()没有释放我的Arduino Uno上的RAM
- Arduino uno的Progmem中的串联字符串
- C++ Arduino Uno 的调度程序
- 我正在开发Arduino Uno。错误:开关外壳的"'RX' not declared in the scope."和"duplicate case value"