Отладка кода Arduino Uno, работающего на Arduino MKR1000

Итак, я программист-любитель в 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();
}

1 ответ

Ваша проблема в контакте прерывания. На 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 в качестве прерывания

Другие вопросы по тегам