Непонятные зависания контроллера

Тема в разделе "Arduino & Shields", создана пользователем Vetrinus, 29 окт 2015.

  1. Vetrinus

    Vetrinus Гик

    Здравствуйте. Имеется ардуино нано, с подключенным к ней датчиком HC-SR04. В каждом loop происходит новое измерение в 0 индекс массива, потом массив обновляется, заменяя старые значения новыми, потом сортируется в порядке возрастания. Затем находится медиана, и по медиане принимается решение. Проблема в том, что контроллер зависает после того как 1-2 раза пересечет границы в if-ах. Выдача данных в сериал тоже прекращается. Проблема решается ресетом.
    Вот код, постараюсь откоментировать поподробнеей
    Код (C++):
    #include <Ultrasonic.h>
    #define HIGH_Relay 6
    float distance[20]; //массив для хранения измерений
    boolean state; //переменная для хранения состояния выхода

    Ultrasonic us_1 (2, 3); //2 -Триггер, 3- Эхо
    void setup() {
      pinMode(6, OUTPUT);
      //  pinMode(8, OUTPUT);
      Serial.begin(9600);
      for (byte i = 0; i < 20; i++) {          //набор значений в массив
        distance[i] = us_1.Ranging(CM);
      }
    }
    void loop() {
      distance[0] = us_1.Ranging(CM); //новое измерение
      delay(150);
      byte previous = 18;              //функция для обновления данных в массиве
      byte current = 19;
      for (byte i = 1; i < 20; i++) {
        distance[current] = distance[previous];
        previous--;
        current--;
      }                                //Функция для сортировки данных в массиве, гуглить "сортировка пузырьком"
      bool leave = false;
      float temp;
      while (!leave) {
        leave = true;
        byte i = 0;
        for (byte counter = 0; counter < 19; counter++) {
          if (distance[i] > distance[i + 1]) {
            temp = distance[i];
            distance[i] = distance[i + 1];
            distance[i + 1] = temp;
            leave = false;
          }
          i++;
        }
      }
      float Median = (distance[9] + distance[10]) / 2; //расчет медианы
      Serial.println(Median);
      if (Median < 13) {
        state=true;
        digitalWrite (13, HIGH);
        Serial.println("Relay ON"); //debug only

      }
      if (Median > 15) {
        state=false;
        digitalWrite(13, LOW);
        Serial.println("Relay OFF"); //debug only
      }
      digitalWrite(6, state);
    }
     
    В каком направлении искать, хотя бы? А то я, честно говоря, в некотором недоумении нахожусь...
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Комментируйте отдельные куски кода и проверяйте на зависания, так вы найдете проблемный участок.
     
  3. Vetrinus

    Vetrinus Гик

    а аппаратной причина может быть? И если да, то насколько часто встречаются аппаратные деффекты плат. Или, может быть периферия так странно может влиять?
    Потому что у меня есть другой проект, который отличается только тем, что там вместо этого
    Код (C++):
     if (Median < 13) {
        state=true;
        digitalWrite (13, HIGH);
        Serial.println("Relay ON"); //debug only

      }
      if (Median > 15) {
        state=false;
        digitalWrite(13, LOW);
        Serial.println("Relay OFF"); //debug only
      }
      digitalWrite(6, state);
    }
     
    другой код, тоже из if-ов. Но там все работает корректно, и никаких замечаний замечено не было