Банк проектов 8-11 Банк проектов 8-11 кл | Page 24

digitalWrite(dispVCC, 1); digitalWrite(buttGND, 0); } void loop() { if (millis() - sensTimer > 50) { // измерение и вывод каждые 50 мс // счётчик от 0 до 2 // каждую итерацию таймера i последовательно принимает значения 0, 1, 2, и так по кругу if (i > 1) i = 0; else i++; dist_3[i] = (float)sonar.ping() / 57.5; // получить расстояние в текущую ячейку массива if (!digitalRead(buttPIN)) dist_3[i] += case_offset; // если включен переключатель стороны измерения, прибавить case_offset dist = middle_of_3(dist_3[0], dist_3[1], dist_3[2]); // фильтровать медианным фильтром из 3-х последних измерений delta = abs(dist_filtered - dist); // расчёт изменения с предыдущим if (delta > 1) k = 0.7; // если большое - резкий коэффициент else k = 0.1; // если маленькое - плавный коэффициент dist_filtered = dist * k + dist_filtered * (1 - k); // фильтр "бегущее среднее" disp.clear(); // очистить дисплей disp.float_dot(dist_filtered, 1); // вывести sensTimer = millis(); // сбросить таймер } if (micros() - dispIsrTimer > 300) { // таймер динамической индикации disp.timerIsr(); // включить дисплей dispIsrTimer = micros(); // сбросить таймер } } // медианный фильтр из 3-х значений float middle_of_3(float a, float b, float c) { if ((a <= b) && (a <= c)) { middle = (b <= c) ? b : c; } else { if ((b <= a) && (b <= c)) { middle = (a <= c) ? a : c; } else { middle = (a <= b) ? a : b; 24