Здравствуйте. Имеется ардуино нано, с подключенным к ней датчиком 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); } В каком направлении искать, хотя бы? А то я, честно говоря, в некотором недоумении нахожусь...
а аппаратной причина может быть? И если да, то насколько часто встречаются аппаратные деффекты плат. Или, может быть периферия так странно может влиять? Потому что у меня есть другой проект, который отличается только тем, что там вместо этого Код (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-ов. Но там все работает корректно, и никаких замечаний замечено не было